`
jinnianshilongnian
  • 浏览: 21434044 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404982
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997639
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631433
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257561
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593147
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248965
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847500
Group-logo
跟我学Nginx+Lua开...
浏览量:698136
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780438
社区版块
存档分类
最新评论

SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解——跟着开涛学SpringMVC

 
阅读更多

 

声明:本系列都是原创内容,觉得好就顶一个,让更多人知道!!写博客不容易,写原创更不容易!!

6.5、请求映射

处理器定义好了,那接下来我们应该定义功能处理方法,接收用户请求处理并选择视图进行渲染。首先我们看一下图6-1:

http请求信息包含六部分信息:
①请求方法,如GET或POST,表示提交的方式;
URL,请求的地址信息;
③协议及版本
④请求头信息(包括Cookie信息);
⑤回车换行CRLF);
⑥请求内容区(即请求的内容或数据),如表单提交时的参数数据、URL请求参数(?abc=123 ?后边的)等。
 
想要了解HTTP/1.1协议,请访问http://tools.ietf.org/html/rfc2616
 
那此处我们可以看到有①、②、④、⑥一般是可变的,因此我们可以这些信息进行请求到处理器的功能处理方法的映射,因此请求的映射分为如下几种:

URL路径映射:使用URL映射请求到处理器的功能处理方法;

请求方法映射限定:如限定功能处理方法只处理GET请求;

请求参数映射限定:如限定只处理包含“abc”请求参数的请求;

请求头映射限定:如限定只处理“Accept=application/json”的请求。

 

接下来看看具体如何映射吧。


6.5.1、URL路径映射

6.5.1.1、普通URL路径映射

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

6.5.1.2URI模板模式映射

@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.3Ant风格的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的功能吧。

 

package cn.javass.chapter6.web.controller.method;
//省略import
@Controller
@RequestMapping("/customers/**")                                     //①处理器的通用映射前缀
public class RequestMethodController {
    @RequestMapping(value="/create", method = RequestMethod.GET)//②类级别的@RequestMapping窄化
    public String showForm() {
        System.out.println("===============GET");
        return "customer/create";  
    }
    @RequestMapping(value="/create", method = RequestMethod.POST)//③类级别的@RequestMapping窄化
    public String submit() {
        System.out.println("================POST");
        return "redirect:/success";        
    }
}

 处理器的通用映射前缀(父路径):表示该处理器只处理匹配“/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、请求数据中有指定参数名

package cn.javass.chapter6.web.controller.parameter;
//省略import
@Controller
@RequestMapping("/parameter1")                                      //①处理器的通用映射前缀
public class RequestParameterController1 {
    //②进行类级别的@RequestMapping窄化
    @RequestMapping(params="create", method=RequestMethod.GET) 
    public String showForm() {
        System.out.println("===============showForm");
        return "parameter/create";        
    }
    //③进行类级别的@RequestMapping窄化
    @RequestMapping(params="create", method=RequestMethod.POST)  
    public String submit() {
        System.out.println("================submit");
        return "redirect:/success";        
    }
}
 

 

 @RequestMapping(params="create", method=RequestMethod.GET:表示请求中有“create”的参数名且请求方法为“GET”即可匹配,如可匹配的请求URLhttp://×××/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、请求数据中没有指定参数名

//请求参数不包含 create参数名
@RequestMapping(params="!create", method=RequestMethod.GET)//进行类级别的@RequestMapping窄化

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

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

package cn.javass.chapter6.web.controller.parameter;
//省略import
@Controller
@RequestMapping("/parameter2")                      //①处理器的通用映射前缀
public class RequestParameterController2 {
    //②进行类级别的@RequestMapping窄化
    @RequestMapping(params="submitFlag=create", method=RequestMethod.GET)  
    public String showForm() {
        System.out.println("===============showForm");
        return "parameter/create";        
    }
    //③进行类级别的@RequestMapping窄化
    @RequestMapping(params="submitFlag=create", method=RequestMethod.POST)   
    public String submit() {
        System.out.println("===============submit");
        return "redirect:/success";        
    }
}

 @RequestMapping(params="submitFlag=create", method=RequestMethod.GET):表示请求中有“submitFlag=create”请求参数且请求方法为“GET”即可匹配,如请求URLhttp://×××/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、请求数据中指定参数名!=

//请求参数submitFlag 不等于 create
@RequestMapping(params="submitFlag!=create", method=RequestMethod.GET)  

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

 

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

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

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

 

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

 

 

6.5.4、请求头数据映射限定

6.5.4.1、准备环境

浏览器:建议chrome最新版本;

插件:ModHeader

安装地址:https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj

 

插件安装步骤:

1、打开https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj,如图6-2


6-2

2、点击“添加至chrome”后弹出“确认安装”对话框,点击“安装”按钮即可,如图6-3:


6-3

3、安装成功后,在浏览器右上角出现如图6-4的图标表示安装成功:


6-4

4、鼠标右击右上角的“Modify Header”图标,选择选项,打开如图6-5:


6-5

7、修改完成后,输入URL请求,你可以在chrome的“开发人员工具的”网络选项卡下,看到如图6-7的信息表示添加请求头成功了:


6-7

到此我们的工具安装完毕,接下来看看如何使用请求头数据进行映射限定。

6.5.4.2、请求头数据中有指定参数名

@RequestMapping(value="/header/test1", headers = "Accept"):表示请求的URL必须为“/header/test1

且 请求头中必须有Accept参数才能匹配。

 

@RequestMapping(value="/header/test1", headers = "abc"):表示请求的URL必须为“/header/test1

且 请求头中必须有abc参数才能匹配,如图6-8时可匹配。


6-8

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

@RequestMapping(value="/header/test2", headers = "!abc"):表示请求的URL必须为“/header/test2

且 请求头中必须没有abc参数才能匹配。(将Modify Header的abc参数值删除即可)。


6.5.4.4、请求头数据中指定参数名=

@RequestMapping(value="/header/test3", headers = "Content-Type=application/json"):表示请求的URL必须为“/header/test3 且 请求头中必须有“Content-Type=application/json”参数即可匹配。(将Modify Header的Content-Type参数值改为“application/json”即可);


 

当你请求的URL为“/header/test3  如果请求头中没有或不是“Content-Type=application/json”参数(如“text/html”其他参数),将返回“HTTP Status 415”状态码【表示不支持的媒体类型(Media Type),也就是MIME类型】,即我们的功能处理方法只能处理application/json的媒体类型。

 

@RequestMapping(value="/header/test4", headers = "Accept=application/json"):表示请求的URL必须为“/header/test4 且 请求头中必须有“Accept =application/json”参数即可匹配。(将Modify Header的Accept参数值改为“application/json”即可);


当你请求的URL为“/header/test4  如果请求头中没有“Accept=application/json”参数(如“text/html”其他参数),将返回“HTTP Status 406”状态码【不可接受,服务器无法根据Accept头的媒体类型为客户端生成响应】,即客户只接受“application/json”媒体类型的数据,即我们的功能处理方法的响应只能返回“application/json”媒体类型的数据。

 

@RequestMapping(value="/header/test5", headers = "Accept=text/*":表示请求的URL必须为“/header/test5 且 请求头中必须有如“Accept=text/plain”参数即可匹配。(将Modify Header的Accept参数值改为“text/plain”即可);

 

Accept=text/*:表示主类型为text,子类型任意,如“text/plain”、“text/html”等都可以匹配。

 

@RequestMapping(value="/header/test6", headers = "Accept=*/*":表示请求的URL必须为“/header/test6 且 请求头中必须有任意Accept参数即可匹配。(将Modify Header的Accept参数值改为“text/html”或“application/xml”等都可以)。

 

Accept=*/*:表示主类型任意,子类型任意,如“text/plain”、“application/xml”等都可以匹配。

6.5.4.5、请求头数据中指定参数名!=

@RequestMapping(value="/header/test7", headers = "Accept!=text/vnd.wap.wml"):表示请求的URL必须为“/header/test7 且 请求头中必须有“Accept”参数但值不等于“text/vnd.wap.wml”即可匹配。

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

@RequestMapping(value="/header/test8", headers = {"Accept!=text/vnd.wap.wml","abc=123"}):表示请求的URL必须为“/header/test8 且 请求头中必须有“Accept”参数但值不等于“text/vnd.wap.wml”且 请求中必须有参数“abc=123”即可匹配。

 

注:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

如果您的请求中含有Accept:“*/*”,则可以匹配功能处理方法上的如“text/html”、“text/*”,“application/xml”等。

 

 

 

源代码下载

 

 

目录:
第一章 Web MVC简介 —— 跟开涛学SpringMVC

第二章 Spring MVC入门 —— 跟开涛学SpringMVC

第三章 DispatcherServlet详解 ——跟开涛学SpringMVC

第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC

第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC

第四章 Controller接口控制器详解(3)——跟着开涛学SpringMVC

第四章 Controller接口控制器详解(4)——跟着开涛学SpringMVC

第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC

第四章 Controller接口控制器详解(6)——跟着开涛学SpringMVC

第五章 处理器拦截器详解——跟着开涛学SpringMVC

 注解式控制器运行流程及处理器定义 第六章 注解式控制器详解——跟着开涛学SpringMVC

 

  • 大小: 9.8 KB
  • 大小: 13.9 KB
  • 大小: 12.2 KB
  • 大小: 26.1 KB
  • 大小: 39.3 KB
  • 大小: 48.7 KB
  • 大小: 12.5 KB
  • 大小: 9.5 KB
  • 大小: 12.2 KB
  • 大小: 62.8 KB
129
12
分享到:
评论
51 楼 liyanqiang1208 2016-12-29  
棒棒哒
50 楼 javawanglu 2016-11-29  
由衷的感谢博主能总结出如此精湛的文章,谢谢
49 楼 fhlm 2015-12-05  
48 楼 Mr.Melon 2015-04-24  
47 楼 明哥哥_25247 2015-04-09  
明哥哥_25247 写道
/**
* 请求头数据中指定参数通配
*/
@RequestMapping(headers="tom=cat/*",value="/myHeader")
public String headerValue(){
System.out.println("请求头数据中指定参数通配");
return "test";
}

以上在Modify Header中输入  tom(第一个值)  cat/cat2(第二个值) 貌似不可以,但是如果输入   tom    cat/*  才能进入,tao 哥 解释一下?....



抱歉,理会错了,原来headers的参数只能是Accept=cat/*....
我理会错了
46 楼 明哥哥_25247 2015-04-09  
/**
* 请求头数据中指定参数通配
*/
@RequestMapping(headers="tom=cat/*",value="/myHeader")
public String headerValue(){
System.out.println("请求头数据中指定参数通配");
return "test";
}

以上在Modify Header中输入  tom(第一个值)  cat/cat2(第二个值) 貌似不可以,但是如果输入   tom    cat/*  才能进入,tao 哥 解释一下?....
45 楼 strive708 2014-11-26  
很受用楼主的教程,学习了。
44 楼 nhmachine 2014-11-23  
       
43 楼 jxsczqh 2014-09-24  
42 楼 amazon_cn 2014-09-11  
⑤回车换行(CRLF);这个还没有讲吧???
41 楼 amazon_cn 2014-09-11  
楼主很牛,挺你!
40 楼 qqzj1990 2014-07-30  
感谢楼主的教程,非常详细,非常有帮助。
39 楼 hbbbs 2014-03-23  
看完这么详细的说明,不顶不行!  

专门登录账户来 点个顶!
38 楼 javalover123 2014-02-27  
不错,很详细
37 楼 286813122 2014-01-04  
楼主威武,写的真好,比单独看书强多了。
36 楼 czj4451 2013-09-18  
czj4451 写道
SpringMVC的源代码在哪下啊?

噢,找到了,导航页没有提供链接啊。
35 楼 czj4451 2013-09-18  
SpringMVC的源代码在哪下啊?
34 楼 bcpo17150 2013-08-26  
写的太好了!
33 楼 425125489 2013-08-17  
支持博主 希望能再出更多的好文章
32 楼 jinnianshilongnian 2013-07-18  
yangfuchao418 写道
jinnianshilongnian 写道
yangfuchao418 写道
能不能方法名自动映射成URL,不用再写什么注解配置了。只有需要其他名字的时候才加注解


springmvc 的 coc

http://developer.51cto.com/art/200906/131364.htm

coc还是需要 @RequestMapping 这种注解

直接不使用注解的只有使用给你发的连接的那种方式

相关推荐

    跟我学SpringMVC 教程

    第六章 注解式控制器详解 SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者请求限定 第六章 注解式控制器详解 SpringMVC强大的数据绑定(1) 第六章 注解式控制器...

    跟我学SpringMVC

    第六章 注解式控制器详解 SpringMVC3强大的请求映射规则详解 第六章 注解式控制器详解 Spring MVC 3.1新特性 生产者、消费者请求限定 第六章 注解式控制器详解 SpringMVC强大的数据绑定(1) 第六章 注解式控制器...

    SpringMVC教程

    第六章 注解式控制器详解2(SpringMVC3强大的请求映射规则详解).pdf 第六章 注解式控制器详解3(生产者、消费者请求限定).pdf 第六章 注解式控制器详解4(SpringMVC强大的数据绑定1).pdf 第六章 注解式控制器详解5...

    springmvc常用注解标签详解

    springmvc常用注解标签详解,@Controller控制器Controller 负责处理由DispatcherServlet 分发的请求,@RequestMappingRequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有...

    springMVC教学视频详解(包括spring和mybatis的整合)

    此视频包含:springmvc入门教程(原理分析、环境搭建、前端控制器配置、Handler编写调试、非注解映射器和适配器、注解映射器和适配器、前端控制器源代码分析、视图解析器配置前缀和后缀);springmvc和mybatis整合;...

    SSM框架教程Spring+SpringMVC+MyBatis全覆盖_Java热门框架视频教程

    16、Spring基于注解方式声明式事务控制 SpringMVC部分: 1、SpringMVC简介 2、SpringMVC组件解析 3、SpringMVC数据响应 4、SpringMVC数据请求 5、SpringMVC文件上传 6、SpringMVC+Spring完成练习 7、SpringMVC拦截...

    springmvc开发资料

    3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 4、 DispatcherServlet调用HandlerAdapter处理器适配器。 5、 ...

    SpringMVC讲解文档

    pringmvc入门程序 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习 非注解的处理器映射器、处理器适配器 注解的处理器映射器、处理器适配器(掌握)

    Spring MVC之@RequestMapping注解详解

    本篇文章主要介绍了Spring MVC之@RequestMapping 详解,RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。有兴趣的可以了解一下。

    springboot知识点整理

    4.2 静态资源映射规则 56 4.3 引入Thymeleaf 60 4.4 Thymeleaf语法 61 4.5 SpringMVC自动配置原理 67 4.6 SpringBoot扩展与全面接管 70 4.7 如何修改SpringBoot的默认配置 72 4.8 【实验】CRUD操作 73 4.8.1 默认...

    全新JAVAEE大神完美就业实战课程 超150G巨制课程轻松实战JAVAEE课程 就业部分.txt

    SpringMvc_day01.spring入门-springMVC三大核心器(视图解析器,处理器映射器and适配器).springMvc整合myBatis SpringMvc_day02高级参数.上传图片.JSON数据交互.拦截器 15-SSM企业案例-客户管理系统(学习1天) ...

Global site tag (gtag.js) - Google Analytics