- 浏览: 1148819 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
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.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的功能吧。
- 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 ”即可匹配,如可匹配的请求 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 、请求数据中没有指定参数名
- //请求参数不包含 create参数名
- @RequestMapping (params= "!create" , method=RequestMethod.GET) //进行类级别的@RequestMapping窄化
@RequestMapping (params= "!create" , method=RequestMethod. GET ) : 表示请求中 没有 “ create ”参数名且请求方法为“ GET ”即可匹配,如可匹配的请求 URL “ http:// ××× /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 ”即可匹配,如请求 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 、请求数据中指定参数名!= 值
- //请求参数submitFlag 不等于 create
- @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 、组合使用是“且”的关系
@RequestMapping (params={ "test1" , "test2=create" }) : 表示请求中 的有“ test1 ”参数名 且 有 “ test2=create ”参数 即可匹配,如可匹配的请求 URL “ http:// ××× /parameter3?test1&test2=create 。
以上请求参数数据映射限定测试类为: cn.javass.chapter6.web.controller.method 包下的 RequestParameterController1 、 RequestParameterController2 、 RequestParameterController3 。
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 ” 但 如果 请求头中没有或不是“Conten t-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”等。
- springmvc-chapter6.rar (5.5 MB)
- 下载次数: 1
相关推荐
第六章 注解式控制器详解2(SpringMVC3强大的请求映射规则详解).pdf 第六章 注解式控制器详解3(生产者、消费者请求限定).pdf 第六章 注解式控制器详解4(SpringMVC强大的数据绑定1).pdf 第六章 注解式控制器详解5...
标题中的“源代码下载 第六章 注解式控制器详解”表明了我们即将探讨的是关于Spring MVC框架中的注解式控制器的深入理解,并且提供了一套相关的源代码供学习和参考。这一章节通常会涵盖如何使用注解来实现Web应用...
在 SpringMVC 框架中,注解标签扮演着非常重要的角色,它们使得开发者可以轻松地定义控制器、请求映射、依赖注入等内容。在本文中,我们将详细地解释 SpringMVC 中常用的注解标签,包括@Controller、@RequestMapping...
控制器是处理请求的核心组件,SpringMVC支持多种形式的控制器,包括简单控制器、映射控制器和注解控制器。这部分将详细解释不同控制器的工作原理和使用场景,帮助开发者选择合适的控制器来实现业务逻辑。 随后,...
从Spring 3.0开始,SpringMVC引入了注解式编程,使得开发者可以直接在方法上使用@RequestMapping等注解来定义请求映射,极大地简化了配置。此外,还可以使用@ModelAttribute、@RequestParam、@PathVariable等注解来...
第六章注解式控制器详解深入探讨了SpringMVC提供的注解式控制器。注解式控制器通过使用各种注解(如@Controller、@RequestMapping等)使得控制器的实现更为简洁和直观。本章不仅解析了注解式控制器的运行流程,还...
【SpringMvc注解详解】 SpringMvc 是 Spring 框架的一部分,主要负责处理 Web 请求。在 SpringMVC 中,注解扮演着至关重要的角色,它们简化了代码并减少了配置。以下是一些常用的 SpringMVC 注解及其详细解释: 1....
SpringMVC注解开发是Java Web开发中一种高效的方式,它极大地简化了控制器的定义和请求处理。在SpringMVC框架中,`@Controller`注解用于标识一个类作为处理HTTP请求的控制器。这个注解使得类中的方法可以被SpringMVC...
- **请求映射**:包括URL路径映射、请求方法映射限定、强大的请求映射规则。 - **数据绑定**:强大的数据绑定机制。 - **数据类型转换**:如何进行数据类型转换。 - **数据格式化**:如何对数据进行格式化。 - ...
在Spring MVC框架中,注解是实现控制器、数据绑定、模型映射等核心功能的关键元素。这些注解简化了代码,使得开发更加高效且易于维护。以下是对Spring MVC常用注解的详细解释: 1. `@Controller`:这是定义一个类...
在本课程"跟开涛学SpringMVC(4.6)Controller接...在学习过程中,结合"跟开涛学SpringMVC(4.6)Controller接口控制器详解(6)Java开发Java经验技巧共10页.pdf"这份资料,你将能深入理解并掌握SpringMVC的核心概念。
这个整合项目是基于Spring 3.0.5、Spring MVC 3和MyBatis 3.0.2版本,采用注解方式进行配置,简化了XML配置文件,提高了开发效率。 Spring MVC是Spring框架的一部分,主要负责Web请求的处理。在本项目中,通过注解...
@RequestMapping注解用于将URL请求映射到特定的方法,@RequestParam用于获取请求参数,@PathVariable用于处理URL模板变量。此外,@Autowired可以实现依赖注入,简化对象的创建和管理。 在SpringMVC与MySQL数据库...
3. **处理请求**:HandlerMapping根据请求映射到对应的控制器(Controller),并执行相应的方法。 4. **渲染结果**:控制器处理完请求后,返回一个ModelAndView对象,包含数据模型和视图名。 5. **视图解析**:...
《跟开涛学SpringMVC(4.3)Controller接口控制器详解》是针对Java开发者的一份深入学习资料,主要探讨了SpringMVC框架中的Controller组件。SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的请求和响应。...