vlambda博客
学习文章列表

主流框架【第9期】--SpringMVC处理器

主流框架【第9期】--SpringMVC处理器

导读:

    大家好,我是老田。今天我们重点梳理SpringMVC的处理器。在SpringMVC的组件中,需要开发人员进行开发的就是处理器组件。

1.SpringMVC3种处理器

Spring内置了许多处理器映射策略,目前主要由三个实现。SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping和RequestMappingHandlerMapping。

BeanNameUrlHandlerMapping

这个处理器是springmvc默认的处理器,通过bean的name属性来控制访问的请求路径对应的具体是哪个action类(Controller类)。这里值得注意的是3.0以前在name里不用写/反斜杠的,3.0版本以后是需要加上的

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans            
                            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
     <!-- BeamName处理器映射 第一种默认的,可以不写-->
     <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" >
         <!-- 排序使用,如果出现冲突以哪个控制器为准,值越小排序越靠前 -->
         <property name="order" value="0"></property>
     </bean>
     <!-- 控制器 -->
     <bean name="/home.action" class="cn.cfs.springmvc.controller.HomeController">
     </bean>
     <!-- 内部资源视图解析器 prefix + logicName + suffix -->
     <bean name="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/jsps/"></property>
         <property name="suffix" value=".jsp"></property>
     </bean>
 </beans>

SimpleUrlHandlerMapping

SimpleUrlHandlerMapping 在应用上下文中可以进行配置,并且有Ant 风格的路径匹配功能。作用是根据浏览器url匹配简单url的key,key就是Controller的id找到Controller

 <?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:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
     <!--1.创建SimpleUrlHandlerMapping-->
     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
         <property name="mappings">
             <props>
                 <prop key="/hello.do">helloController</prop>
             </props>
         </property>
     </bean>
 
     <!--2.创建Controller对象-->
     <bean id="helloController" class="com.tian.demo.controller.HelloController"/>
 
     <!--3.视图解析器-->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/pages/"/>
         <property name="suffix" value=".jsp" />
     </bean>
 </beans>

RequestMappingHandlerMapping

RequestMappingHandlerMapping是三个中最常用的HandlerMapping,因为注解方式比较通俗易懂,代码界面清晰,只需要在代码前加上@RequestMapping()的相关注释就可以了。

 <?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:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
     <!-- 1.扫描Controller的包-->
     <context:component-scan base-package="com.yiidian.controller"/>
 
     <!-- 2.配置视图解析器 -->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!-- 2.1 页面前缀 -->
         <property name="prefix" value="/pages/"/>
         <!-- 2.2 页面后缀 -->
         <property name="suffix" value=".jsp"/>
     </bean>
 
     <!-- 3.创建RequestMappingHandlerMapping对象-->
     <mvc:annotation-driven/>
 </beans>

注意:重点是添加<mvc:annotation-driven/>标签!

2.Controller注解

@Controller 注解用于声明某类的实例是一个控制器。

 @Controller
 public class HelloController {
 
     @GetMapping("/hello")
     public String handle(Model model) {
         model.addAttribute("message", "Hello World!");
         return "index";
    }
 }

Spring MVC 使用扫描机制找到应用中所有基于注解的控制器类,所以,为了让控制器类被 Spring MVC 框架扫描到,需要在配置文件中声明 spring-context,并使用 <context:component-scan/> 元素指定控制器类的基本包(请确保所有控制器类都在基本包及其子包下)。

3.RequestMapping注解

一个控制器内有多个处理请求的方法,如 UserController 里通常有增加用户、修改用户信息、删除指定用户、根据条件获取用户列表等。每个方法负责不同的请求操作,而 @RequestMapping 就负责将请求映射到对应的控制器方法上。

在基于注解的控制器类中可以为每个请求编写对应的处理方法。使用 @RequestMapping 注解将请求与处理方法一 一对应即可。

@RequestMapping 注解常用属性如下。

@RequestMapping常用属性:

value 属性

value 属性是 @RequestMapping 注解的默认属性,因此如果只有 value 属性时,可以省略该属性名,如果有其它属性,则必须写上 value 属性名称。如下。

 @Controller
 public class HelloController{
     @RequestMapping("/hello.do")
     public void hello(HttpServletRequest request,HttpServletResponse response) throws IOException {
         response.getWriter().write("Hello");
    }
 }

method属性

method 属性用于表示该方法支持哪些 HTTP 请求。如果省略 method 属性,则说明该方法支持全部的 HTTP 请求。

@RequestMapping(value = "toUser",method = RequestMethod.GET) 表示该方法只支持 GET 请求。

也可指定多个 HTTP 请求,如 @RequestMapping(value = "toUser",method = {RequestMethod.GET,RequestMethod.POST}),说明该方法同时支持 GET 和 POST 请求。

params

params:指定request中必须包含某些参数值,才让该方法处理。

 @RequestMapping(value = "/hello.do",params = "id=1")
 public void hello(HttpServletRequest request,HttpServletResponse response) throws IOException {
     response.getWriter().write("Hello");
 }

headers属性

headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

 @RequestMapping(value = "/hello.do",headers = "Referer=http://www.xxx.com")
 public void hello(HttpServletRequest request,HttpServletResponse response) throws IOException {
    response.getWriter().write("Hello-www.yiidian.com");
 }

表示请求的 header 中必须包含了指定的“Referer”请求头,以及值为“http://www.xxx.com”时,才能执行该请求。

consumers属性

consumers 属性用于指定处理请求的提交内容类型(Content-Type),例如:application/json、text/html。如

 @RequestMapping(value = "toUser",consumes = "application/json")

produces属性

produces 属性用于指定返回的内容类型,返回的内容类型必须是 request 请求头(Accept)中所包含的类型。如 @RequestMapping(value = "toUser",produces = "application/json")。

除此之外,produces 属性还可以指定返回值的编码。如 @RequestMapping(value = "toUser",produces = "application/json,charset=utf-8"),表示返回 utf-8 编码。

4.Spring MVC 接收请求参数

Spring MVC Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合。主要有以下几种方式:

  • 通过 HttpServletRequest 接收请求参数

  • 通过处理方法的形参接收请求参数

  • 通过实体 Bean 接收请求参数

  • 通过 @PathVariable 接收 URL 中的请求参数

  • 通过 @RequestParam 接收请求参数

  • 通过 @ModelAttribute 接收请求参数

通过HttpServletRequest接收请求参数

通过 HttpServletRequest 接收请求参数适用于 get 和 post 提交请求方式,和原来的Servlet方式一样。

 @RequestMapping("/login")
 public String login(HttpServletRequest request, Model model) {
     String name = request.getParameter("name");
     String pwd = request.getParameter("pwd");
     return "login";
 }

通过处理方法的形参接收请求参数

通过处理方法的形参接收请求参数就是直接把表单参数写在控制器类相应方法的形参中,即形参名称与请求参数名称完全相同。该接收参数方式适用于 get 和 post 提交请求方式。

形参类型可以是基本数据类型也可以是包装类或者String类

 @RequestMapping("/login")
 public String login(String name, String pwd, Model model) {
     // ......
     return "login";
 }

通过实体Bean接收请求参数

实体 Bean 接收请求参数适用于 get 和 post 提交请求方式并且请求参数个数较多时。需要注意,Bean 的属性名称必须与请求参数名称相同。

 @RequestMapping("/login")
 public String login(User user, Model model) {
     return "login";
 }

通过@RequestParam接收请求参数

在方法入参处使用 @RequestParam 注解指定其对应的请求参数。@RequestParam 有以下三个参数:

  • value:参数名

  • required:是否必须,默认为 true,表示请求中必须包含对应的参数名,若不存在将抛出异常

  • defaultValue:参数默认值

通过 @RequestParam 接收请求参数适用于 get 和 post 提交请求方式

 @RequestMapping("findUsersBySex")
 public String findUsersBySex(@RequestParam(value="sex",defaultValue="1") Integer sex,Model model,HttpServletResponse response) {
     List<User> users = ub.findUsersBySex(sex);
     model.addAttribute("users", users);
     return "home/home";
 }

通过@PathVariable接收URL中的请求参数

通过 @PathVariable 获取 URL 中的参数,示例代码如下。

 @RequestMapping("/login/{name}/{pwd}")
 public String login(@PathVariable String name, @PathVariable String pwd, Model model) {
     return "login";
 }

通过@ModelAttribute接收请求参数

@ModelAttribute 注解用于将多个请求参数封装到一个实体对象中,从而简化数据绑定流程,而且自动暴露为模型数据,在视图页面展示时使用。

而“通过实体 Bean 接收请求参数”中只是将多个请求参数封装到一个实体对象,并不能暴露为模型数据(需要使用 model.addAttribute 语句才能暴露为模型数据,数据绑定与模型数据展示后面教程中会讲解)。

 @RequestMapping("/login")
 public String login(@ModelAttribute("user") User user, Model model) {
     return "login";
 }

5.Spring MVC重定向和转发

Spring MVC 请求方式分为转发、重定向 2 种,分别使用 forward 和 redirect 关键字在 controller 层进行处理。

 @Controller
 @RequestMapping("/index")
 public class IndexController {
     @RequestMapping("/login")
     public String login() {
         //转发到一个请求方法(同一个控制器类可以省略/index/)
         return "forward:/index/isLogin";
    }
     @RequestMapping("/isLogin")
     public String isLogin() {
         //重定向到一个请求方法
         return "redirect:/index/isReg";
    }
     @RequestMapping("/isReg")
     public String isReg() {
         //转发到一个视图
         return "reg";
    }
 }

6.请求处理方法常见的返回类型

请求处理方法可以返回如下类型的对象:

  • ModelAndView

  • Model

  • 包含模型属性的 Map

  • View

  • 代表逻辑视图名的 String

  • void

  • 其它任意Java类型



博观而约取,厚积而薄发!



--END--