spring mvc 自定义Handlermapping
上次大概写了个可以解决velocity 多视图的东西。
但是实际运用过程中又到处找了些资料看了下。这里
小计下:
DispatcherServlet解析过程:
..1..HandlerMapping.getPageHandle
public class SpringMvcExtendHandlerMapping extends WebApplicationObjectSupport
implements HandlerMapping, Ordered{
..2..HandlerMapping.getPageHandle 内部就是new HandlerExecutionChain
handle==》new IPageHandle自定义(Controller)(-->内部new IWebPage)
HandlerAdapter==》new List<HandlerAdapter>(各种Handler拦截器)
这里是各种分发的核心部分,handle将是整个http请求从开始到结束的持有者,比如mvc 的许多页面分发都在这里第一次处理
比如new 那个control 啊都在这里处理
..3..HandlerAdapter.supports==》验证 handle是否是 instanceof IWebPage
spring mvc 靠这个来识别用那个HandlerInterceptorAdapter 来注入属性
..4..HandlerInterceptorAdapter.preHandle 视图解析前==》把request resopnse 放到handle里面
这个实际被大多人用来验证登录啊啥的,我这里主要是把request response 放到自己的IWebPage里面
..5..HandlerAdapter.handle 拦截器对页面请求进行过滤,mvc框架在这里根据你的配置对ModelAndView进行各种属性填入
也是modelAndView生成的地方
我们见到的各种Annotation 都在这里这里注入,new 出不同ModelAndView
..5.1..DispatcherServlet.applyDefaultViewName 这里进行view的路径寻找
估计使用来处理Servletbean的,没有细看
我将其 理解为spring mvc 将根据ModelAndView viewname找到真正的模板解析器识别的路径
..6..HandlerInterceptorAdapter.postHandle --》开始调用对应的 前面new 好的 IWebPage
这个可以理解为dopost doget的body
这里比较特殊就是Annotation的各种返回
我了在这里将action分发到对应的IWebPage的方法上去,原理借鉴了Annotation的各种
我的viewname也是在这里根据自己需要自己弄进入的,主要是通过后缀来分别不同模板引擎
..7..DispatcherServlet.processDispatchResult--》 找视图
=> DispatcherServlet.render 视图渲染
==>DispatcherServlet.resolveViewName 在viewResolvers找匹配的视图,//这个多视图的可以搞的地方,下面的view就是这里来的
==》ModelAndView.getView().render ==>真实的dopost ,doget 的输出
..8..HandlerInterceptorAdapter.afterCompletion--》页面全部完成了。
下面是具体的实现的思路
1、HandlerMapping 用于定位具体的Controller类我习惯叫pagehandle,我认为是模块分发modelfactory
eg:implement 这个是比较标准,我继承过其他的HandlerMapping 但是实际自己使用还是从接口开始更好实现
public class SpringMvcExtendHandlerMapping extends WebApplicationObjectSupport
implements HandlerMapping, Ordered{
这里可以通过从新定义:
public HandlerExecutionChain getHandler(HttpServletRequest request)
可以实现 对应的control分发
eg:
String requestPath = ResourceUtil.getRequestPath(request);
if(requestPath.contains("mytest")
{
//这个handle是比较啰嗦的东西,在mvc 这个东西就是Controller类,自定义么可以用但是需要配套HandlerAdapter
HandlerExecutionChain back = new HandlerExecutionChain(handle);
//这里是自定义的拦截器,通过配置文件可以,但是如果多HandlerInterceptorAdapter 你会发现各种莫名弄麻烦,
//不然自己把自己的用的上的直接绑上去更好用
back.addInterceptor(new SpringMvcExtendHandlerInterceporAdapter());
}
2、HandlerInterceptorAdapter。。 这个可以理解为页面分发pagefactory,自己可以写各种不同页面分发
public class SpringMvcExtendHandlerInterceptorAdapter extends
HandlerInterceptorAdapter {
spring mvc 没有在这里多做什么,基本都是留给用户乱搞的
我页面分发也是在这里搞的
这个东西么网上比较多,就是3个方法的使用
preHandle--》这里可以初始化你自己的handle(IWebPage)
postHandle--》这里可以识别action进行页面处理
afterCompletion--》这里么,统计下访量啊,注销下request,response
需要注意的是
DispatcherServlet 用的for 循环preHandle 只要有一个返回false 就不继续了,弄这个弄眼睛都花了
所以建议如果你程序要么只有一个HandlerInterceptorAdapter,要么就指定好对应的HandlerInterceptorAdapter
eg:在xml文件中用mvc标签
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" /><!--这里老老实实的过滤路径-->
<bean class="org.jeecgframework.core.interceptors.EncodingInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
eg:要么在你选择的HandlerMapping 配置文件中指定
eg:要么像我直接写死在HandlerMapping中
不要直接<bean class=""/>
3、HandlerAdapter
public class SpringMvcExtendHandlerAdapter implements org.springframework.web.servlet.HandlerAdapter{
一个共同参数
Object handler //这个对应HandlerMapping handle ,这个搞的我头都是大的
备注:HandlerExecutionChain里面的handle 就是这个了
这个里面三个方法
getLastModified 自己看下页面是否是二次请求
handle 这个用于方法在 HandlerInterceptorAdapter 的preHandle后,posthandle 之前,spring mvc用来找对应的controller
supports 验证传进来的handle 是否符合modelview 是否是当前HandlerAdapter 可以处理的
这里
4、SpringMvcExtendViewResolver
public class SpringMvcExtendViewResolver extends AbstractCachingViewResolver implements Ordered{
这个东西是springmvc 用来区分用那个视图解析器的
protected View loadView(String viewName, Locale locale) throws Exception
其中的viewname 就是DispatcherServlet.applyDefaultViewName这里处理返回的viewresolver能识别的路径
我弄的spring mvc 多视图就是靠这个弄的。
配置文件的问题。。
比较特殊的是
HandlerMapping 这个小屁
如果你直接<bean class="com.cnynld.web.tpl.springmvc.SpringMvcExtendHandlerMapping">
springmvc 会认为只用这个而不会将着2个东西启动起来莫名的很,各种Annotation都起作用,把我瓜的调试的晕了
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- 自定义handlemapping -->
<bean class="com.cnynld.web.tpl.springmvc.SpringMvcExtendHandlerMapping">
<property name="order" value=""/>
<property name="pageHandleMapping">
<map>
<entry key="vm1/" >
<bean id="APageHandle" class="com.cnynld.web.tpl.test.APageHandle"/>
</entry>
<entry key="vm2/" >
<bean id="DefaultPageHandle" class="com.cnynld.web.tpl.test.DefaultPageHandle"/>
</entry>
</map>
</property>
</bean> <!-- 启动mvc Annotation mapping -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!-- 启动mvc Annotation handleadapter -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <!-- 自定义mapping 对应的 handleadapter -->
<bean class="com.cnynld.web.tpl.springmvc.SpringMvcExtendHandlerAdapter"/>
nbsp;这里进行view的路径寻找
spring mvc 自定义Handlermapping的更多相关文章
- Spring MVC的handlermapping之SimpleUrlHandlerMapping初始化
前面信息同BeanNameUrlHandlerMapping,这里不再过多分析,详情请看 :Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化 ...
- Spring MVC 梳理 - handlerMapping和handlerAdapter分析
参考图片 综上所述我们来猜测一下spring mvc 中根据URL找到处理器Controller中相应方法的流程 ①:获取Request的URL ②:从UrlLookup这个map中找到相应的requ ...
- Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志
在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...
- Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)
本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...
- spring mvc 自定义编辑器
起始知识: Java标准的PropertyEditor的核心功能是将一个字符串转换为一个Java对象,以便根据界面的输入或配置文件中的配置字符串构造出一个JVM内部的java对象. 如何注册自定义的属 ...
- spring mvc(4) HandlerMapping
在前面一节里提到,DispatcherServlet在接收到请求后,通过HandlerMapping找到处理请求对应的Controller(其实处理请求器并不一定是Controller,还可以是Htt ...
- Spring MVC:HandlerMapping
HandlerMapping 的类图 Spring中存在两种类型的handlers.第一种是 handler mappings(处理程序映射).它们的角色定位与前面所描述的功能完全相同.它们尝试将当前 ...
- spring mvc 自定义转换器
<!-- 注册转化器 --> <mvc:annotation-driven conversion-service="conversionService" /> ...
- spring mvc自定义注解--登录时密码加密注解
1,定义注解名称接口 /** * 使用该注解不用再MD5转换了 * * @author adonis * */ @Target(ElementType.PARAMETER) @Retention(Re ...
随机推荐
- Eclipse : 找不到或无法加载主类
问题: 找不到或无法加载主类 解决思路: Step1: 去网上百度了下,基本上都说是环境变量的问题. 原因:环境变量设置有问题. 解决方法:重设环境变量 结果:当然问题没解决. Step2:再次百度, ...
- DNA Sequence - POJ 2778(AC自动机+矩阵乘法)
题目大意:DNA序列是有 ATGC 组成的,现在知道一些动物的遗传片段有害的,那么如果给出这些有害的片段,能否求出来所有长度为 N 的基因中有多少是不包含这些有害片段的. 分析:也是断断续续做了一 ...
- Mysql Binlog日志详解
一.Mysql Binlog格式介绍 Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...
- JAVAEE filter总结
1. 为什么需要filter? filter相当于客户端和服务器端之间的一扇门,就像保安一样.作用:比如说设置字符集和权限控制等等. 2. 细节; * . 只能对post请求起作用 * .可以使 ...
- Ubuntu12.04安装hadoop
1. 创建hadoop用户组和用户 a. 创建hadoop用户组 sudo addgroup hadoop b. 创建hadoop用户 sudo adduser –ingroup had ...
- Facebook 开源安卓版 React Native,开发者可将相同代码用于网页和 iOS 应用开发
转自:http://mt.sohu.com/20150915/n421177212.shtml Facebook 创建了React Java 库,这样,Facebook 的工程团队就可以用相同的代码给 ...
- DLL程序的创建步骤和測试程序
首先,创建DLL程序 然后,加入一个导出类 比如: //Test.h #pragma once class AFX_EXT_CLASS Test { public: Test(void); ~Te ...
- android:Adb connection Error:远程主机强迫关闭了一个现有的连接
用真机调试程序的时候,eclipse的console总是出现如下的错误“Adb connection Error:远程主机强迫关闭了一个现有的连接” 问题出现的原因:这是ddms调用adb引发的. 经 ...
- Linux 监控CPU 温度
安装测试系统: 硬件:普通PC机, 软件:redhat linux as 4 2.6 .9 , 安装系统自带的lm_sensors-2.8.7-2.i386 你也可以从[url]http://w ...
- 如何写好一个UITableView
本文是直播分享的简单文字整理,直播共分为上.下两部分. 第一部分: 优酷 :http://v.youku.com/v_show/id_XMTUzNzQzMDU0NA%3Cmark%3E.html Or ...