spring mvc 杂

来源:互联网 发布:装修公司网络推广 编辑:程序博客网 时间:2024/05/17 04:06

1、@RequestParam绑定单个请求参数值;

2、@PathVariable绑定URI模板变量值;

3、@CookieValue绑定Cookie数据值

4、@RequestHeader绑定请求头数据;

5、@ModelValue绑定参数到命令对象;

6、@SessionAttributes绑定命令对象到session;

7、@RequestBody绑定请求的内容区数据并能进行自动类型转换等。

8、@RequestPart绑定“multipart/data”数据,除了能绑定@RequestParam能做到的请求参数外,还能绑定上传的文件等。

 

6.5.1、URL路径映射

6.5.1.1、普通URL路径映射

@RequestMapping(value={"/test1", "/user/create"}):多个URL路径可以映射到同一个处理器的功能处理方法。

6.5.1.2、URI模板模式映射

@RequestMapping(value="/users/{userId}"):{×××}占位符, 请求的URL可以是 “/users/123456”或

“/users/abcd”,通过6.6.5讲的通过@PathVariable可以提取URI模板模式中的{×××}中的×××变量。

@RequestMapping(value="/users/{userId}/create"):这样也是可以的,请求的URL可以是“/users/123/create”。

@RequestMapping(value="/users/{userId}/topics/{topicId}"):这样也是可以的,请求的URL可以是“/users/123/topics/123”。

6.5.1.3、Ant风格的URL路径映射

@RequestMapping(value="/users/**"):可以匹配“/users/abc/abc”,但“/users/123”将会被【URI模板模式映射中的“/users/{userId}”模式优先映射到】【详见4.14的最长匹配优先】。

 

@RequestMapping(value="/product?"):可匹配“/product1”或“/producta”,但不匹配“/product”或“/productaa”;

@RequestMapping(value="/product*"):可匹配“/productabc”或“/product”,但不匹配“/productabc/abc”;

@RequestMapping(value="/product/*"):可匹配“/product/abc”,但不匹配“/productabc”;

@RequestMapping(value="/products/**/{productId}"):可匹配“/products/abc/abc/123”或“/products/123”,也就是Ant风格和URI模板变量风格可混用;

 

此处需要注意的是【4.14中提到的最长匹配优先】,Ant风格的模式请参考4.14。

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

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

 

@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}"):可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,这样可以设计更加严格的规则。

 

正则表达式风格的URL路径映射是一种特殊的URI模板模式映射:

URI模板模式映射是{userId},不能指定模板变量的数据类型,如是数字还是字符串;

正则表达式风格的URL路径映射,可以指定模板变量的数据类型,可以将规则写的相当复杂。

 

6.5.1.5、组合使用是“或”的关系

如 @RequestMapping(value={"/test1""/user/create"}) 组合使用是或的关系,即“/test1”或“/user/create”请求URL路径都可以映射到@RequestMapping指定的功能处理方法。

 

以上URL映射的测试类为:cn.javass.chapter6.web.controller.mapping.MappingController.java。

 

到此,我们学习了Spring Web MVC提供的强大的URL路径映射,而且可以实现非常复杂的URL规则。Spring Web MVC不仅仅提供URL路径映射,还提供了其他强大的映射规则。接下来我们看一下请求方法映射限定吧。

 

 

6.5.2、请求方法映射限定

一般我们熟悉的表单一般分为两步:第一步展示,第二步提交,如4.9、SimpleFormController那样,那如何通过@RequestMapping来实现呢?

6.5.2.1、请求方法映射限定

我们熟知的,展示表单一般为GET请求方法;提交表单一般为POST请求方法。但6.5.1节讲的URL路径映射方式对任意请求方法是全盘接受的,因此我们需要某种方式来告诉相应的功能处理方法只处理如GET请求方法的请求或POST请求方法的请求。

 

接下来我们使用@RequestMapping来实现SimpleFormController的功能吧。

 

Java代码  

1.  package cn.javass.chapter6.web.controller.method;  

2.  //省略import  

3.  @Controller  

4.  @RequestMapping("/customers/**")                                     //处理器的通用映射前缀  

5.  public class RequestMethodController {  

6.      @RequestMapping(value="/create", method = RequestMethod.GET)//类级别的@RequestMapping窄化  

7.      public String showForm() {  

8.          System.out.println("===============GET");  

9.          return "customer/create";    

10.     }  

11.     @RequestMapping(value="/create", method = RequestMethod.POST)//类级别的@RequestMapping窄化  

12.     public String submit() {  

13.         System.out.println("================POST");  

14.         return "redirect:/success";          

15.     }  

16. }  

 处理器的通用映射前缀(父路径):表示该处理器只处理匹配“/customers/**”的请求;

对类级别的@RequestMapping进行窄化,表示showForm可处理匹配“/customers/**/create”且请求方法为“GET”的请求;

对类级别的@RequestMapping进行窄化,表示submit可处理匹配“/customers/**/create”且请求方法为“POST”的请求。

6.5.2.2、组合使用是“或”的关系

@RequestMapping(value="/methodOr",method = {RequestMethod.POST, RequestMethod.GET}):即请求方法可以是GET 或 POST。

 

提示:

1、一般浏览器只支持GET、POST请求方法,如想浏览器支持PUT、DELETE等请求方法只能模拟,稍候章节介绍。

2、除了GET、POST,还有HEAD、OPTIONS、PUT、DELETE、TRACE。

3、DispatcherServlet默认开启对 GET、POST、PUT、DELETE、HEAD的支持;

4、如果需要支持OPTIONS、TRACE,请添加DispatcherServlet在web.xml的初始化参数:dispatchOptionsRequest和 dispatchTraceRequest 为true。

 

请求方法的详细使用请参考RESTful架构风格一章。

 

以上请求方法映射限定测试类为:cn.javass.chapter6.web.controller.method.RequestMethodController。

 

 

6.5.3、请求参数数据映射限定

6.5.3.1、请求数据中有指定参数名

Java代码  

1.  package cn.javass.chapter6.web.controller.parameter;  

2.  //省略import  

3.  @Controller  

4.  @RequestMapping("/parameter1")                                      //处理器的通用映射前缀  

5.  public class RequestParameterController1 {  

6.      //进行类级别的@RequestMapping窄化  

7.      @RequestMapping(params="create", method=RequestMethod.GET)   

8.      public String showForm() {  

9.          System.out.println("===============showForm");  

10.         return "parameter/create";          

11.     }  

12.     //进行类级别的@RequestMapping窄化  

13.     @RequestMapping(params="create", method=RequestMethod.POST)    

14.     public String submit() {  

15.         System.out.println("================submit");  

16.         return "redirect:/success";          

17.     }  

18. }  

 

 

 @RequestMapping(params="create",method=RequestMethod.GET) :表示请求中有“create”的参数名且请求方法为“GET”即可匹配,如可匹配的请求URL“http://×××/parameter1?create”;

@RequestMapping(params="create",method=RequestMethod.POST):表示请求中有“create”的参数名且请求方法为“POST”即可匹配;

 

此处的create请求参数名表示你请求的动作,即你想要的功能的一个标识,常见的CRUD(增删改查)我们可以使用如下请求参数名来表达:

create请求参数名  GET请求方法) 新增页面展示、(create请求参数名  POST请求方法)新增提交;

update请求参数名  GET请求方法) 新增页面展示、(update请求参数名  POST请求方法)新增提交;

delete请求参数名  GET请求方法) 新增页面展示、(delete请求参数名  POST请求方法)新增提交;

query请求参数名  GET请求方法) 新增页面展示、(query请求参数名  POST请求方法) 新增提交;

list请求参数名  GET请求方法) 列表页面展示;

view请求参数名  GET请求方法) 查看单条记录页面展示。

 

6.5.3.2、请求数据中没有指定参数名

Java代码  

1.  //请求参数不包含 create参数名  

2.  @RequestMapping(params="!create", method=RequestMethod.GET)//进行类级别的@RequestMapping窄化  

 @RequestMapping(params="!create",method=RequestMethod.GET):表示请求中没有“create”参数名且请求方法为“GET”即可匹配,如可匹配的请求URL“http://×××/parameter1?abc”。

6.5.3.3、请求数据中指定参数名=值

Java代码  

1.  package cn.javass.chapter6.web.controller.parameter;  

2.  //省略import  

3.  @Controller  

4.  @RequestMapping("/parameter2")                      //处理器的通用映射前缀  

5.  public class RequestParameterController2 {  

6.      //进行类级别的@RequestMapping窄化  

7.      @RequestMapping(params="submitFlag=create", method=RequestMethod.GET)    

8.      public String showForm() {  

9.          System.out.println("===============showForm");  

10.         return "parameter/create";          

11.     }  

12.     //进行类级别的@RequestMapping窄化  

13.     @RequestMapping(params="submitFlag=create", method=RequestMethod.POST)     

14.     public String submit() {  

15.         System.out.println("===============submit");  

16.         return "redirect:/success";          

17.     }  

18. }  

 @RequestMapping(params="submitFlag=create",method=RequestMethod.GET):表示请求中有“submitFlag=create”请求参数且请求方法为“GET”即可匹配,如请求URL为http://×××/parameter2?submitFlag=create

 

@RequestMapping(params="submitFlag=create",method=RequestMethod.POST):表示请求中有“submitFlag=create”请求参数且请求方法为“POST”即可匹配;

 

此处的submitFlag=create请求参数表示你请求的动作,即你想要的功能的一个标识,常见的CRUD(增删改查)我们可以使用如下请求参数名来表达:

submitFlag=create请求参数名  GET请求方法) 新增页面展示、(submitFlag=create请求参数名  POST请求方法) 新增提交;

submitFlag=update请求参数名  GET请求方法) 新增页面展示、(submitFlag=update请求参数名  POST请求方法) 新增提交;

submitFlag=delete请求参数名  GET请求方法) 新增页面展示、(submitFlag=delete请求参数名  POST请求方法) 新增提交;

submitFlag=query请求参数名  GET请求方法) 新增页面展示、(submitFlag=query请求参数名  POST请求方法) 新增提交;

submitFlag=list请求参数名  GET请求方法) 列表页面展示;

submitFlag=view请求参数名  GET请求方法) 查看单条记录页面展示。

6.5.3.4、请求数据中指定参数名!=值

Java代码  

1.  //请求参数submitFlag 不等于 create  

2.  @RequestMapping(params="submitFlag!=create", method=RequestMethod.GET)    

 @RequestMapping(params="submitFlag!=create",method=RequestMethod.GET):表示请求中的参数“submitFlag!=create”且请求方法为“GET”即可匹配,如可匹配的请求URL“http://×××/parameter1?submitFlag=abc”。

 

6.5.3.5、组合使用是“且”的关系

Java代码  

1.  @RequestMapping(params={"test1""test2=create"})  //进行类级别的@RequestMapping窄化  

 @RequestMapping(params={"test1""test2=create"}):表示请求中的“test1”参数名  “test2=create”参数即可匹配,如可匹配的请求URL“http://×××/parameter3?test1&test2=create。

 

以上请求参数数据映射限定测试类为:cn.javass.chapter6.web.controller.method包下的RequestParameterController1、RequestParameterController2、RequestParameterController3。

 

原创粉丝点击