SpringMVC的核心类和注解

1.1 DispatcherServlet

DispatcherServlet的全名是org.springframework.web.servlet.DispatcherServlet,它在程序中充当着前端控制器的角色。

在使用时,只需将其配置在项目的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_2_5.xsd" 
         id="WebApp_ID" version="2.5">
 <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>

在上述代码中,<load-on-startup>元素和<init-param>元素都是可选的。

如果<load-on-startup>元素的值为1,则在应用程序启动时会立即加载该Servlet;

如果<load-on-startup>元素不存在,则应用程序会在第一个Servlet请求时加载该Servlet。

如果<init-param>元素存在并且通过其子元素配置了Spring MVC配置文件的路径,

则应用程序在启动时会加载配置路径下的配置文件;如果没有通过<init-param>元素配置,

则应用程序会默认到WEB-INF目录下寻找如下方式命名的配置文件。

servletName-servlet.xml

其中,servletName指的是部署在web.xml中的DispatcherServlet的名称,

在上面web.xml中的配置代码中即为springmvc,而-servlet.xml是配置文件名的固定写法,

所以应用程序会在WEB-INF下寻找springmvc-servlet.xml。

1.2 Controller注解类型

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

其注解形式为@Controller。该注解在使用时不需要再实现Controller接口,只需要将@Controller注解加入到控制器类上,

然后通过Spring的扫描机制找到标注了该注解的控制器即可。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
@Controller
public class FirstController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        //创建ModelAndView对象
        ModelAndView mav=new ModelAndView();
        //向模型对象中添加数据
        mav.addObject("msg","这是我的第一个SpringMVC程序");
        //设置逻辑视图名
        mav.setViewName("/jsp/first.jsp");
        //返回ModelAndView对象
        return mav;
    }

}

为了保证Spring能够找到控制器类,还需要在Spring MVC的配置文件中添加相应的扫描配置信息,

具体如下。

(1)在配置文件的声明中引入spring-context。

(2)使用<context:component-scan>元素指定需要扫描的类包。

一个完整的配置文件示例如文件所示。

<?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"/>
</beans>

<context:component-scan>元素的属性base-package指定了需要扫描的类包为com.itheima.controller。

在运行时,该类包及其子包下所有标注了注解的类都会被Spring所处理。

与实现了Controller接口的方式相比,使用注解的方式显然更加简单。

同时,Controller接口的实现类只能处理一个单一的请求动作,而基于注解的控制器可以同时处理多个请求动作,

在使用上更加的灵活。因此,在实际开发中通常都会使用基于注解的形式。

1.3 RequestMapping注解类型

1.3.1 @RequestMapping注解的使用

Spring通过@Controller注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的。

这就需要使用org.springframework.web.bind.annotation.RequestMapping注解类型。

RequestMapping注解类型用于映射一个请求或一个方法,其注解形式为@RequestMapping,可以使用该注解标注在一个方法或一个类上。

标注在方法上

当标注在一个方法上时,该方法将成为一个请求处理方法,

它会在程序接收到对应的URL请求时被调用。使用@RequestMapping注解标注在方法上的示例如下。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class FirstController {
    @RequestMapping(value="/firstController")
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        //创建ModelAndView对象
        ModelAndView mav=new ModelAndView();
        //向模型对象中添加数据
        mav.addObject("msg","这是我的第一个SpringMVC程序");
        //设置逻辑视图名
        mav.setViewName("/jsp/first.jsp");
        //返回ModelAndView对象
        return mav;
    }
}

标注在类上

当标注在一个类上时,该类中的所有方法都将映射为相对于类级别的请求,

表示该控制器所处理的所有请求都被映射到value属性值所指定的路径下。

使用@RequestMapping注解标注在类上的示例如下

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value="/hello")
public class FirstController {
    @RequestMapping(value="/firstController")
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
        //创建ModelAndView对象
        ModelAndView mav=new ModelAndView();
        //向模型对象中添加数据
        mav.addObject("msg","这是我的第一个SpringMVC程序");
        //设置逻辑视图名
        mav.setViewName("/jsp/first.jsp");
        //返回ModelAndView对象
        return mav;
    }
}

1.3.2@RequestMapping注解的属性

@RequestMapping注解除了可以指定value属性外,还可以指定其他一些属性,这些属性如表12-1所示。

12.3.3 组合注解

前面两个小节已经对@RequestMapping注解及其属性进行了详细讲解,而在Spring框架的4.3版本中,

引入了组合注解,来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。

其组合注解如下所示。

· @GetMapping:匹配GET方式的请求。

· @PostMapping:匹配POST方式的请求。

· @PutMapping:匹配PUT方式的请求。

· @DeleteMapping:匹配DELETE方式的请求。

· @PatchMapping:匹配PATCH方式的请求。

以@GetMapping为例,该组合注解是@RequestMapping(method = RequestMethod.GET)的缩写,

它会将HTTP GET映射到特定的处理方法上。在实际开发中,传统的@RequestMapping注解使用方式如下

1.4 ViewResolver(视图解析器)

Spring MVC中的视图解析器负责解析视图,可以通过在配置文件中定义一个ViewResolver来配置视图解析器,其配置示例如下。

<?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="/jsp/"></property>
         <!-- 设置后缀 -->
         <property name="suffix" value=".jsp"></property>
     </bean>
</beans>
一纸高中万里风,寒窗读破华堂空。 莫道长安花看尽,由来枝叶几相同?
原文地址:https://www.cnblogs.com/byczyz/p/12187849.html