欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC(四)_功能处理方法的映射

程序员文章站 2022-06-23 18:19:06
...

       前言:本文主要介绍控制器上的功能处理方法映射,包括URL路径映射,请求方法映射,请求参数映射,请求头映射。

本篇文章重点关注以下问题:

  • 简述Http请求信息
  • URL路径映射限定
  • 请求方法映射限定
  • 请求参数映射限定
  • 请求头映射限定

1. HTTP请求信息

SpringMVC(四)_功能处理方法的映射
            
    
    博客分类: SpringMVC SpringMVC功能处理方法映射         Http请求信息主要包括五部分信息

  1. 请求方法:如GET、POST等,表示提交方式;
  2. URL:请求的地址信息;
  3. 协议及版本
  4. 请求头信息:包括Cookie等;
  5. 请求内容:请求的内容或数据,如表单提交时的参数数据、URL请求参数(?abc=123 ?后边的)等。

       分析上述五部分信息,可以看到1,2,4,5是可变的,因此可以将这些信息进行请求到处理器的功能处理方法的映射,因此请求的映射分为如下几种

  • URL路径映射:使用URL映射请求到处理器的功能处理方法;
  • 请求方法映射限定:如限定功能处理方法只处理GET请求;
  • 请求参数映射限定:如限定只处理包含“abc”请求参数的请求;
  • 请求头映射限定:如限定只处理“Accept=application/json”的请求。

 2. 功能处理方法映射

         功能处理方法映射使用注解:@RequestMapping。@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。其有六个属性

属性 作用
value 指定请求的实际地址,指定的地址可以是URI Template 模式。
method 指定请求的method类型, GET、POST、PUT、DELETE等。
params 指定request中必须包含某些参数值时,才让该方法处理。
headers 指定request中必须包含某些指定的header值时,才能让该方法处理请求。
consumes 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

 

2.1 URL路径映射

        @RequestMapping注解的value属性指明URL值,其值有三种类型

  1. 普通URL路径映射:指定为普通的具体值;
  2. 可以指定为含有某变量的一类值(URI Template Patterns with Path Variables);
  3. 可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions);

2.1.1 普通URL路径映射         

         这种映射类型很简单,需要说明的是多个URL路径可以映射到同一个处理器的功能处理方法的情况(或的关系):

@RequestMapping(value={"/test1", "/user/create"})

2.1.2 URI 模板模式映射

         第二种类型样例如下,{ownerId}为占位符,可通过@PathVariable提取URI模板模式中的{×××}中的×××变量。

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
    Owner owner = ownerService.findOwner(ownerId);  
    model.addAttribute("owner", owner);  
    return "displayOwner"; 
}
 

2.1.3 正则表达式风格的URL路径映射

        从Spring3.0 开始支持正则表达式风格的URL路径映射,格式为{变量名:正则表达式},可以通过@PathVariable提取模式中的{×××:正则表达式匹配的值}中的×××变量。

@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}")   

        上述URL可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,这样可以设计更加严格的规则。

        正则表达式风格的URL路径映射是一种特殊的URI模板模式映射:URI模板模式映射是{userId},不能指定模板变量的数据类型,如是数字还是字符串;正则表达式风格的URL路径映射,可以指定模板变量的数据类型,可以将规则写的相当复杂。

2.1.4 Ant 风格的URL

        Ant 风格资源地址支持 3 种匹配符:

  • ?:匹配文件名中的一个字符
  • *:匹配文件名中的任意字符
  • **:** 匹配多层路径
        @RequestMapping 还支持 Ant 风格的 URL:
/user/*/createUser: 匹配
    ==> /user/aaa/createUser、/user/bbb/createUser 等 URL
/user/**/createUser: 匹配
    ==> /user/createUser、/user/aaa/bbb/createUser 等 URL
/user/createUser??: 匹配
    ==> /user/createUseraa、/user/createUserbb 等 URL

 

2.2 请求方法映射限定

        @RequestMapping注解的method属性指明请求方法,包括以下8种,GET、POST是我们开发中常见的,DELETE、PUT在REST风格中较为常见,后续文章也会讲解SpringMVC对RESTful风格的支持。

 

public enum RequestMethod {
	GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
         样例如下,即请求方法可以是GET 或POST。

 

@RequestMapping(value="/methodOr", method = {RequestMethod.POST, RequestMethod.GET})
提示:
1、一般浏览器只支持GET、POST请求方法,如想通过浏览器发送PUT、DELETE 等请求方法,介可以在前台添加隐含域实现,后续章节介绍。
2、除了GET、POST,还有HEAD、OPTIONS、PUT、DELETE、TRACE、PATCH。
3、DispatcherServlet默认开启对GET、POST、PUT、DELETE、HEAD 的支持;
4、如果需要支持OPTIONS、TRACE,请添加DispatcherServlet 在web.xml 的初始化参数:dispatchOptionsRequest 和dispatchTraceRequest 为true。

 2.3 请求参数数据映射限定

         @RequestMapping注解的params属性指明请求参数映射的限制,params和headers一样,支持简单的表达式:

  • param1: 表示请求必须包含名为 param1 的请求参数;
  • !param1: 表示请求不能包含名为 param1 的请求参数;
  • param1 != value1: 表示请求包含名为 param1 的请求参数,但其–值不能为 value1;
  • {“param1=value1”, “param2”}: 请求必须包含名为 param1 和param2的两个请求参数,且 param1 参数的值必须为 value1;
        样例如下,params属性指明:仅处理请求中包含了名为“myParam”,值为“myValue”的请求;
@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {

    @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")
    public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {    
        // implementation omitted
    }
}
 

2.4 请求头数据映射限定

         @RequestMapping注解的headers属性指明请求头数据映射的限制,和params一样,支持简单的表达式:

  • param1: 表示请求头必须包含名为 param1 的请求头参数;
  • !param1: 表示请求头不能包含名为 param1 的请求头参数;
  • param1 != value1: 表示请求头包含名为 param1 的请求头参数,但其值不能为 value1;
  • {“param1=value1”, “param2”}: 请求头必须包含名为 param1 和param2的两个请求头参数,且 param1 参数的值必须为 value1;
         样例如下,仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/”的请求;
@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {

    @RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")
    public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {    
        // implementation omitted
    }
}
 

2.5 生产者、消费者限定

         @RequestMapping注解的consumes属性指明功能处理方法能消费的媒体类型(其通过请求头的“Content-Type”来判断),此方式等价于使用@RequestMapping的“headers = 'Content-Type=application/json'”,但更为简明。

         cousumes的样例如下,方法仅处理request Content-Type为“application/json”类型的请求:

@Controller
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {    
    // implementation omitted
}

         @RequestMapping注解的produces属性指明功能处理方法能产生的媒体类型(其根据请求头中的Accept进行匹配),此方式等价于使用@RequestMapping的“headers = 'Accept=application/json'”,但更为简明。

         produces的样例如下,方法仅处理request Content-Type为“application/json”类型的请求:

@Controller
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {    
    // implementation omitted
}

         

 

代码下载来源:http://super-wangj.iteye.com/blog/2388430

 
  • SpringMVC(四)_功能处理方法的映射
            
    
    博客分类: SpringMVC SpringMVC功能处理方法映射 
  • 大小: 135.5 KB