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>