- 浏览: 932416 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (251)
- WebService (17)
- IBatis (22)
- Hibernate (1)
- SpringMVC - 基础篇 (32)
- Spring (15)
- Java (11)
- JVM及调优 - 基础篇 (4)
- 集群 (14)
- 数据库 (17)
- WebSphere (5)
- 多线程 (4)
- 集合、容器 (2)
- DB Pool (1)
- Power Designer (5)
- Maven基础 (5)
- JS (14)
- WEB 前端 (5)
- 实用小工具 (17)
- 社会、人 (2)
- 乱七八糟 (18)
- ASM&CGLIB - 基础篇 (12)
- 缓存 (1)
- 性能 (1)
- 设计之殇 (1)
- 分布式事务 (1)
- 单点登录 (11)
- 分布式 Session (4)
- Memcached - 基础篇 (6)
最新评论
-
一笑_奈何:
楼主写的还真行不错。
扫盲贴 - J2EE集群之JNDI集群实现 -
xuezhongyu01:
博主写的很详细,但最后还是没明白,最后调用BasicDataS ...
Spring中的destroy-method方法 -
Mr梁:
commons-fileupload.jar commons- ...
SpringMVC 中文件上传 MultipartResolver -
Eywa:
总结的很不错
ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 -
TryRelax:
fastjson 比 jackson 好用吧?
Spring MVC Jackson DateFormat
映射处理器Handler Mapping
1.简析映射处理器
在spring
mvc中,使用映射处理器可以把web请求映射到正确的处理器上,spring内置了很多映射处理器,而且我们也可以自定义映射处理器。
下面的实例展示spring中最常用的两个映射处理器:
BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。
在正式开始前有必要了解以下相关要点:
(1)映射处理器都能把请求传递到处理器执行链接(HandlerExecutionChain)上,并且处理器执行链接必须包含能处理该请求的处理器(实质就是处理器链上动态添加了了此处理器,可以结合filter工作原理理解),而且处理器链接也能包含一系列拦截器。
(2)上面列举的spring最常用的两种处理器都是继承自AbstractHandlerMapping类
,因而它们具备父类的属性。
2.实例:BeanNameUrlHandlerMapping
在我们上面的工程的基础上进行修改
步骤一:建立后端控制器HelloWorldController.java,
步骤二:配置web.xml,
步骤三:配置spmvc-servlet.xml,
步骤四:在WEB-INF/page目录下hello.jsp
步骤五:启动服务器,输入…/helloController.do访问测试。
简析执行过程
(1)启动服务器后,当我们向服务器发送message.do请求时,首先被在web.xml中配置的前端控制器DispatcherServlet拦截到。
(2)前端控制器把此请求转交给后端控制器,下面分析转交过程:当在spmvc-servlet.xml中查找能执行
helloController
.do请求的映射处理器时,发现没有能处理此请求的映射处理器,这时便使用默认的映射处理器BeanNameUrlHandlerMapping:This is the default implementation used by the DispatcherServlet, along with DefaultAnnotationHandlerMapping (on Java 5 and higher).
我们还需注意:这种后端控制器的bean Name必须以“/”开头
,并且要结合DispatcherServlet的映射配置。同时beanName支持通配符配置
。比如如果配置:<bean name="/m*.do
" class="com.wy.controller.HelloWorldController" /> 时,当访问
helloController
.do时也可以成功访问到
HelloWorldController
类。
(3)BeanNameUrlHandlerMapping处理器,会查找在spring容器中是否在名为“
helloController
.do”的bean实例
。当查找到此实例后,则把此bean作为处理此请求的后端控制器。同时把自身加到映射处理器链上,并向处理器链传递此请求。
(4)后端控制器进行处理,并返回视图。
小结 :
BeanNameUrlHandlerMapping的实现更为简单,每个Controller的URL与其name属性对应,因此,只需要对每个Controller以URL作为name,就可以实现URL映射。
配置示例如下:
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet. handler.BeanNameHandlerMapping" /> <bean name="/a.html" class="example.chapter7.ControllerA" /> <bean name="/a.html" class="example.chapter7.ControllerB" />
之所以用Bean的name作为URL而不是id,是因为XML规范不允许在id标识中使用特殊字符“/”。当用户请求一个URL时,Spring将直接查找name为URL的Controller。
使用 SimpleUrlHandlerMapping的麻烦之处在于,添加或删除Controller时必须要对 SimpleUrlHandlerMapping做相应的修改,而BeanNameUrlHandlerMapping则无需手工编写映射,只需要在每个 Controller中仔细定义name属性。
如果使用XDoclet自动生成配置文件,则可以将name在Controller的注释中定义,维护起来 更加方便。
因此,我们推荐首先考虑使用BeanNameUrlHandlerMapping。
事实上,如果没有在XML配置文件中定义任何 UrlHandlerMapping,则Spring MVC默认使用BeanNameUrlHandlerMapping。
3.SimpleUrlHandlerMapping
步骤一:建立后端控制器UserContrller.java.代码如下:
package com.asm; //...省略导入的相关类 public class UserController extends SimpleFormController { protected ModelAndView processFormSubmission(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { System.out.println("调用逻辑层,处理表单"); ModelAndView mav = new ModelAndView("loginSuc"); return mav; } }
步骤二:在spmvc-servlet.xml中增加如下配置:
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <!-- 为映射处理器引入拦截器bean --> <property name="interceptors"> <list> <ref bean="workTimeInterceptor" /> </list> </property> <property name="mappings"> <props> <prop key="/op/*/login.do">userController</prop> </props> </property> </bean> <bean id="userController" class="com.asm.UserController"> <property name="commandClass" value="com.asm.User"/> </bean> <!-- 拦截器bean --> <bean id="workTimeInterceptor" class="com.asm.LoginTimeInterceptor"> <property name="startTime" value="6" /> <property name="endTime" value="18" /> </bean>
说明
:(1
)通过前面实例我们可以知道,SimpleController
这样的后端控制器必须绑定一个commandClass
对象,在这里我们通过配置文件
<
property
name
=
"commandClass"
value
=
"com.asm.User"
/>
绑定。
(2
)
<
prop
key
=
"/op/*/login.do"
>
userController
</
prop
>
配置说明只要访问是以op
开头,中间*
可以是任意字符,并以login.do
结尾的请求,便能访问到
userController
控制器。
(3 ) SimpleUrlHandlerMapping 是一个更强大的映射处理器,它除了支持上面 < props > 的这种配置,还支持Ant 风格的路径匹配。另外也可以进行如下形式的配置:
< property name = "mappings" >
< value >
/op/*/login.do= userController
</ value >
</ property >
(4 )拦截器:为了为某些特殊请求提供特殊功能,spring 为映射处理器提供了拦截器支持。它的配置文件很简单:一是把拦截器类纳入spring 容器管理,二是在映射处理器引入配置的拦截器bean 。
步骤三 :编写拦截器 LoginTimeInterceptor.java ,主要代码如下:
package com.asm; //...省略导入的相关类 public class LoginTimeInterceptor extends HandlerInterceptorAdapter { private int startTime; private int endTime; public void setStartTime(int startTime) { this.startTime = startTime; } public void setEndTime(int endTime) { this.endTime = endTime; } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("执行afterCompletion方法-->03"); super.afterCompletion(request, response, handler, ex); } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("执行postHandle方法-->02"); super.postHandle(request, response, handler, modelAndView); } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("执行preHandle方法-->01"); Calendar cal = Calendar.getInstance(); int hour = cal.get(Calendar.HOUR_OF_DAY); if (startTime <= hour && hour < endTime) { return true; } else { response.sendRedirect("http://www.iteye.com"); return false; } } }
说明:此拦截器作用:如果用户没有在6-18点登录,则重定向到javaeye站点
(1)拦截器必须HandlerInterceptorAdapter接口
(2)preHandle方法在后端控制器执行前被调用,postHandle方法在后端控制器执行后被调用;afterCompletion方法在整个请求处理完成后被调用。
(3) preHandle方法:返回true,映射处理器执行链将继续执行;当返回false时,DispatcherServlet处理器认为拦截器已经处理完了请求,而不继续执行执行链中的其它拦截器和处理器。它的API文档解释如下:true if the execution chain should proceed with the next interceptor or the handler itself. Else, DispatcherServlet assumes that this interceptor has already dealt with the response itself.
(4)这三个方法都是相同的参数,Object handler参数可以转化成一个后端控制器对象,比如这里可以转换成UserController对象。
步骤四:完成其它相关代码的编写
User.java 代码
package com.asm; public class User { private String username; private String password; //省略getter/setter方法 }
WEB-INF/page/loginSuc.jsp , 主要代码如下:
<body> 登录成功!欢迎来到后台管理页面 </body>
index.jsp 代码:
<form action="<%=request.getContextPath()%>/op/luanXie/login.do" method="post"> 用户名:<input type="text" name="username"><br/> 密 码:<input type="password" name="password"><br/> <input type="submit" value="登录"> </form>
步骤五 :访问index.jsp 页面,完成测试。
分析执行过程:为了清晰体会到整个处理器执行过程,我们首先在UserController.java 中增加如下代码:
protected Object formBackingObject(HttpServletRequest request) throws Exception { System.out.println("formBackingObject方法执行-->01"); return super.formBackingObject(request); } protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { System.out.println("initBinder方法执行-->02"); super.initBinder(request, binder); } protected void onBind(HttpServletRequest request, Object command) throws Exception { System.out.println("onBind方法执行-->03"); super.onBind(request, command); } protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors) throws Exception { System.out.println("onBindAndValidate方法执行-->04"); super.onBindAndValidate(request, command, errors); }
(1 )当访问…/login.do 时,会首先被前端控制器DispatcherServlet 拦截到,前端控制器通过查找spmvc-servlet.xml 配置文件,并交给后端控制器处理。
(2) 执行后,得到如下打印结果,通过打印结果我们知道它的一个大致执行过程。
执行 preHandle 方法 -->01
formBackingObject 方法执行 -->01
initBinder 方法执行 -->02
onBind 方法执行 -->03
onBindAndValidate 方法执行 -->04
调用逻辑层,处理表单
Admin----123456
执行 postHandle 方法 -->02
执行 afterCompletion 方法 -->03
小结:
混合使用多种 UrlHandlerMapping,但是必须为每个UrlHandlerMapping指定order属性来表示优先级 ,order值越小优先级越 高,Spring会先查询优先级高的UrlHandlerMapping。
若找到了对应的Controller,就不再继续查询,否则,按照优先级依次查 询,直到找到为止。
若所有的UrlHandlerMapping都无法返回一个合适的Controller,并且没有设置默认的Controller时, 就会返回给客户端一个“404 Not Found”错误,表示不存在这个URL。
发表评论
-
SpringMVC中内容协商【统一资源多种展现json xml html】
2013-09-12 15:58 3425在我们实际的开发中,往往需要SpringMVC ... -
Spring为某个属性注入值或为某个方法的返回值
2013-08-26 16:02 1486项目中用到需要初始化一些数据,Spring提供了filed的 ... -
SpringMVC 基础知识点小结
2013-08-23 15:26 2268参照:http://zachary-g ... -
使用SpringMVC Restful 开发思考
2013-03-18 14:23 1273一、rest思想 此部分 ... -
Spring MVC Jackson DateFormat
2012-10-14 15:59 2231使用Spring MVC 里的Jackson返回JSON时,遇 ... -
SpringMVC 中文件上传 MultipartResolver
2011-12-17 17:44 55165基于前面文章的基础上。 一、准备 需要的jar ... -
SpringMVC 异常处理初探
2011-12-12 12:18 8235Web应用中对于异常的处理方式与其他形式的应用并没有太大的不同 ... -
SpringMVC 使用JSR-303进行校验 @Valid
2011-12-11 18:04 31560一、准备校验时使用的JAR 说明: ... -
SringMVC 注解标记备忘录
2011-12-10 22:42 2133Spring MVC注解开发中常用标签,如下表: ... -
SpringMVC拦截器简单使用
2011-12-10 22:17 93572基于上一篇文章的基础上 一、拦截器的配置 1、 ... -
SpringMVC生成JSON(三)
2011-12-10 01:16 20637基于上一篇文章的代码基础上 一、准备工作 1、 下载依赖库 ... -
SpringMVC生成JSON(二)
2011-12-06 21:24 8277基于上一篇文章的代码基础上 开始Jackson之旅。 一、准 ... -
SpringMVC 生成JSON(一)
2011-12-04 19:37 3310本示例基于前面几篇文章的代码。 一、JSON-lib框 ... -
Spring MVC处理重定向的传参
2011-12-03 21:35 6540一、Spring MVC是如何处理重定向的传参? 现提供一种 ... -
Spring MVC3.0的RESTFul方式的访问
2011-12-03 20:59 1632上一篇以简单介绍了 ... -
SpringMVC之用注解控制器
2011-12-03 19:53 2528在传统的Spring MVC开发方法中,必须在Bean配置 ... -
SpringMVC例子代码小汇总
2011-11-20 11:18 1905一、结构 二、Jar版本及使用jar包 ... -
SpringMVC 拦截器实现分析
2011-11-20 00:10 5390一、Servlet Filter与Spring interce ... -
SpringMVC学习笔记(三) --- 映射处理器(续)
2011-10-07 21:46 1668<?xml version="1.0" ... -
SpringMVC学习笔记(二) --- 后端控制器之MultiActionController(一)
2011-10-07 21:07 2044创建处理多个请求的控制器 根据"每个请求一个 ...
相关推荐
在"springmvc学习笔记--springmvc注解开发.zip"这个压缩包中,我们可以深入探讨Spring MVC的注解驱动开发方式,这是一种简洁且高效的开发模式。 1. **Spring MVC基础**: Spring MVC的核心组件包括...
本学习笔记将涵盖前端控制器、文件上传、异常处理以及开发过程中的心得小结。 1. **前端控制器(DispatcherServlet)** 前端控制器是SpringMVC的核心组件,负责接收所有HTTP请求,然后根据请求的类型和映射规则...
2. **HandlerMapping**:处理器映射器,负责将请求URL映射为具体的处理器(Handler)。 3. **HandlerAdapter**:处理器适配器,负责调用具体的处理器。 4. **ViewResolver**:视图解析器,负责将逻辑视图名解析为...
如果你正在学习或使用SpringMVC,这些资源将非常有价值。记得定期检查更新,因为作者提到会不定期添加新的内容。同时,积极参与讨论,可以与其他开发者交流经验,共同提升。 至于文件"ahao5",它可能是资源的子目录...
SpringMVC是Java web开发中一个非常重要的框架,它基于模型-视图-控制器(Model-View-Controller)设计模式...这份“SpringMVC学习笔记”包括了从基础到进阶的全面内容,旨在帮助读者从零开始掌握SpringMVC的各个方面。
### SpringMVC学习课堂笔记知识点总结 #### 一、SpringMVC基础知识 ##### 1.1 什么是SpringMVC? SpringMVC是Spring框架的一部分,主要用于构建Web应用程序。它遵循了MVC(Model-View-Controller)设计模式,提供...
**SpringMVC 学习笔记一** 在Java Web开发领域,SpringMVC是Spring框架的一个重要组成部分,它是一个用于构建Web应用程序的Model-View-Controller(MVC)框架。本学习笔记将深入探讨SpringMVC的基本概念、核心组件...
**SpringMVC学习笔记(一)** 在Java Web开发领域,SpringMVC是Spring框架的一个重要组成部分,用于构建高效、可维护的Web应用程序。本文将深入探讨SpringMVC的基础概念、工作原理及其核心组件,帮助你更好地理解和...
### SpringMVC学习笔记 #### 一、SpringMVC概述 **1.1 什么是SpringMVC** SpringMVC作为Spring Framework的一个重要组成部分,主要针对Web应用开发提供了一个功能全面的MVC(Model-View-Controller)框架。它是...
通过这个SpringMVC学习笔记,开发者能够深入了解SpringMVC的工作原理,掌握其核心功能,并学会如何与GXT这样的前端库协同工作,从而创建高效、健壮的Web应用程序。同时,结合源码分析和实际工具的应用,能进一步提升...
总的来说,这份"SpringMVC学习笔记+学习源码.zip"资源涵盖了SpringMVC的基本概念、配置、控制器、数据绑定、异常处理、视图解析等多个方面的内容,对于初学者和有一定经验的开发者都是很好的学习资料。通过深入学习...
#### 三、SpringMVC入门程序 ##### 1. 非注解方式的处理器映射器与处理器适配器 - **处理器映射器**:根据配置文件中的URL映射找到对应的控制器。 - **处理器适配器**:根据配置文件中的设置来执行控制器。 ##### 2...
通过深入学习和实践 SpringMVC,开发者可以构建高效、可维护的 Web 应用程序,并充分利用 Spring 生态系统的强大功能。无论是在大型企业级应用还是小型项目中,SpringMVC 都是值得信赖的开发工具。
- 在`springmvc-servlet.xml`中配置处理器映射器、处理器适配器、视图解析器等相关组件。 通过这个简单的学习笔记,你可以理解Spring MVC的基本架构和工作流程,为进一步深入学习和实践打下基础。在实际开发中,你...
这个“springmvc学习笔记.zip”文件很可能包含了关于如何理解和使用SpringMVC的详细教程或个人学习记录。以下是一些核心知识点的详细说明: 1. **MVC架构**:MVC是一种设计模式,将应用程序分为三个主要组件:模型...
SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器(MVC)架构。在本文中,我们将深入探讨SpringMVC的基本概念、...通过不断学习和实践,我们可以掌握SpringMVC的精髓,提升我们的开发技能。
`springMVC-servlet.xml` 是 SpringMVC 的核心配置文件,其中定义了处理器映射、视图解析器等。比如: ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc=...
《黑马程序员SpringMVC课堂笔记》是一份详细记录了SpringMVC框架学习过程的资料,主要针对Java EE开发者,特别是那些希望通过黑马程序员的教程来提升自己SpringMVC技能的学员。SpringMVC作为Spring框架的重要组成...
除了注解方式外,SpringMVC 还支持非注解的处理器映射器和适配器。例如,BeanNameUrlHandlerMapping 和 SimpleUrlHandlerMapping 分别用于根据 Bean 名称和 URL 规则映射 Handler,而 ...
#### 三、SpringMVC入门案例 本节通过一个简单的商品列表查询案例来详细介绍SpringMVC的基本使用。 ##### 3.1 案例需求 - **功能**:展示商品列表。 - **技术栈**: - 数据库:MySQL 5.1 - Java环境:JDK 1.7.0_...