Spring MVC的核心类和注解_0802_12

                                第十二篇:Spring MVC的核心类和注解

前言

       spring2.5之前,只能使用实现Controller接口的方式来开发一个控制器,如第十一篇。在spring2.5之后,新增了基于注解的控制器以及其他一些常用的注解。

1、前端控制器(DispatcherServlet)

      DispatcherServlet全名org.springframework.web.servlet.DispatcherServlet,在程序中充当前端控制器。

---------------------------------------项目名\WebContent\WEB-INF\web.xml---------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 

id="WebApp_ID" version="3.0">
    <servlet>
        <!-- 配置前端过滤器 -->
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
              org.springframework.web.servlet.DispatcherServlet
         </servlet-class>
        <!-- 初始化时加载配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-config.xml</param-value>
        </init-param>
        <!-- 表示容器在启动时立即加载Servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
 

解说:(两个都是可选元素,即可有可无,使用根据实际情况来)

            <init-param>:如果存在且通过子元素配置了spring mvc路径,则应用程序启动时会加载配置路径下的配置文件,在这里即springmvc-config.xml。如果没有<init-param>则默认去WEB-INF下面找如下方式命名的配置文件(servletName-servlet.xml,-servlet.xml固定写法)。

           <load-on-startup>1</load-on-startup>,如果为1则在应用程序启动时立即加载该Servlet,否则应用程序会在第一个Servlet请求时加载该Servlet。

            

2、控制器(Controller)注解类型

            org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,其注解形式:@Controller。

该注解不需要通过实现接口方式来实现。步骤一:直接把注解@Controller 添加到相应类;步骤二:在配置文件中开启注解使注解生效;步骤三加入相应jar包即可,如运行时依赖spring的AOP的jar包spring-aop-4.3.6.RELEASE.jar;

   --------------------开启注解,使注解生效(一般情况下spring mvc配置文件为springmvc-config.xml)--------------------

 <!-- 指定需要扫描的包 -->
    <context:component-scan base-package="com.itheima.controller" />

3、@RequestMapping注解的使用

    @RequestMapping(value="/firstController")与@RequestMapping("/firstController")一样(后者意思:其所有属性都是可选,只有唯一默认value时可以省略value)

    3.1、原由:spring通过@Controller方式找到spring类后,还需要知道控制器内部对每个请求是如何处理的,即需要注解@RequestMapping。

    3.2、使用:@RequestMapping注解可以标注在一个方法或一个类上,当然两者含义也不同。

  • 标注在类上:该类的所有方法都将映射为相对于类级别的请求,输入网址链接http://localhost:8080/项目名/@RequestMapping注解中value值这里即/helllo。如http://localhost:8080/项目名/helllo/firstController
  • 标注在方法上:该方法将成为一个请求处理方法,它会在程序中接收对应的URL请求时被调用。如http://localhost:8080/项目名/firstController

package com.itheima.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 控制器类
 */
@Controller
@RequestMapping(value="/hello")//标注在类上
public class FirstController{
    @RequestMapping(value="/firstController")//标注在方法上
    public String handleRequest(HttpServletRequest request,
            HttpServletResponse response, Model model) throws Exception {
        // 向模型对象中添加数据
        model.addAttribute("msg", "这是我的第一个Spring MVC程序");
        // 返回视图页面
        return "first";
    }
}

3.3、@RequestMappin注解属性

属性名 类型 描述
name String 可选属性,用于为映射指定别名
value String[] 可选属性,标注在一个类或一个方法上,说明在上面2
method RequestMothod[] 可选属性,用于指定该方法处理那种类型的请求方式。请求方式:GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE和TARCE。使用如RequestMothod.GET。当然也支持多个请求方式,通过{}写成数组的形式,请求方式与请求方式之间用逗号(,)分开
params String[] 可选属性,用于指定Request中必须包含某些参数值,才能通过该方法处理请求
headers String[] 可选属性,用于指定Request中必须包含某些指定的header的值,才能通过该方法处理请求
consumes String[] 可选属性,用于指定处理请求的提交内容的类型(Content-type),比如application/json、 text/html等
produces String[] 可选属性,用于指定返回内容类型,返回内容类型必须是request请求头(Accept)中所包含的类型

4 、组合 注解 

  • @GetMapping,匹配GET方式请求
  • @PostMapping,匹配POSt方式请求
  • @PutMapping,匹配PUT方式请求
  • @DeleteMapping,匹配DELETE方式请求
  • @PatchMapping,匹配PATCH方式请求

4.1、 传统的@RequestMapping注解使用,但组合注解可以简化代码

//标注在方法上,RequestMethod.GET只匹配GET请求方式

@RequestMapping(value="/hello/{id}", method=RequestMethod.GET)
public String FirstController(String id) {//String id接收,,/hello/{id}中参数id传过来的值。
  ....
}

4.2、组合注解使用@GetMapping(这里只用@GetMapping举例)

//标注在方法上,@GetMapping只匹配GET请求方式

@GetMapping(value="/hello/{id}")

public String FirstController(String id) {//String id接收,,/hello/{id}中参数id传过来的值。
  ....
}

5、请求处理方法的参数类型和返回类型

Spring MVC支持的常见的方法返回类型如下

  • ModelAndView
  • Model
  •  Map
  • View
  • String
  • void
  • HttpEntity<?>和ReponseEntity<?>
  • Callable<?>
  • DeferredResult<?>

举例: 这里只举String类型例子

/**
 * 控制器类
 */
@Controller
@RequestMapping(value="/hello")
public class FirstController {
    @RequestMapping(value="/firstController")
    public String handleRequest(HttpServletRequest request,
            HttpServletResponse response, Model model) throws Exception {
        // 向模型对象中添加数据
        model.addAttribute("msg", "这是我的第一个Spring MVC程序");
        // 返回视图页面
        return "first";// @RequestMapping注解请求方式返回String类型
    }
}

6、redirect重定向和forward请求转发(两者区别:https://www.cnblogs.com/Qian123/p/5345527.html

//redirect请求转发,请求转发到hello.jsp中,这里只有hello是因为视图解析器。。地址栏url是新的url

@RequestMapping(value="/firstController")
    public String handleRequest(HttpServletRequest request,
            HttpServletResponse response, Model model) throws Exception {
         ...
        // 重定向请求路径
        return "redirect: hello";
    }

//forward请求转发,请求转发到hello.jsp中,这里只有hello是因为视图解析器。。地址栏url不变

@RequestMapping(value="/firstController")
    public String handleRequest(HttpServletRequest request,
            HttpServletResponse response, Model model) throws Exception {
      ...
        // 请求转发
        return "forward: hello";
    }

7、视图解析器(ViewResolver)(/WEB-INF/jsp/路径下,以.jsp 结尾所以上面才有直接return "first";// @RequestMapping注解请求方式返回String类型。访问时视图解析器会自动添加前缀和后缀

<!-- 定义视图解析器 -->
<bean id="viewResolver" class=
    "org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!-- 设置前缀 -->
         <property name="prefix" value="/WEB-INF/jsp/" />
         <!-- 设置后缀 -->
         <property name="suffix" value=".jsp" />
 </bean>

8、举例

步骤一:导入相应jar包

步骤二:配置前端控制器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>
              org.springframework.web.servlet.DispatcherServlet
         </servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

步骤三:编写控制器类(使用注解方式)

package com.itheima.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 控制器类
 */
@Controller
@RequestMapping(value="/hello")
public class FirstController{
    @RequestMapping(value="/firstController")
    public String handleRequest(HttpServletRequest request,
            HttpServletResponse response, Model model) throws Exception {
        // 向模型对象中添加数据
        model.addAttribute("msg", "这是我的第一个Spring MVC程序");
        // 返回视图页面
        return "first";
    }
}
 

步骤四:配置spring mvc配置文件springmvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- 指定需要扫描的包 -->
    <context:component-scan base-package="com.itheima.controller" />
    <!-- 定义视图解析器 -->
    <bean id="viewResolver" class=
    "org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!-- 设置前缀 -->
         <property name="prefix" value="/WEB-INF/jsp/" />
         <!-- 设置后缀 -->
         <property name="suffix" value=".jsp" />
    </bean>
</beans>  
 

步骤五:编写视图first.jsp

在/WEB-INF/jsp/路径下编写first.jsp

步骤六:启动eslipse中tomcat服务器(tomcat启动教程: https://blog.csdn.net/qq_31935419/article/details/81267301

启动成功,打开浏览器输入url:http://localhost:8080/项目名/hello/firstController 。

学习《Java EE企业级应用开发教程》(出版社:中国工信出版社集团  人民邮电出版社 )

注:个人小结,供自己以后复习

猜你喜欢

转载自blog.csdn.net/qq_31935419/article/details/81509602