上次大概写了个可以解决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的更多相关文章

  1. Spring MVC的handlermapping之SimpleUrlHandlerMapping初始化

    前面信息同BeanNameUrlHandlerMapping,这里不再过多分析,详情请看 :Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化 ...

  2. Spring MVC 梳理 - handlerMapping和handlerAdapter分析

    参考图片 综上所述我们来猜测一下spring mvc 中根据URL找到处理器Controller中相应方法的流程 ①:获取Request的URL ②:从UrlLookup这个map中找到相应的requ ...

  3. Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志

    在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...

  4. Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)

    本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...

  5. spring mvc 自定义编辑器

    起始知识: Java标准的PropertyEditor的核心功能是将一个字符串转换为一个Java对象,以便根据界面的输入或配置文件中的配置字符串构造出一个JVM内部的java对象. 如何注册自定义的属 ...

  6. spring mvc(4) HandlerMapping

    在前面一节里提到,DispatcherServlet在接收到请求后,通过HandlerMapping找到处理请求对应的Controller(其实处理请求器并不一定是Controller,还可以是Htt ...

  7. Spring MVC:HandlerMapping

    HandlerMapping 的类图 Spring中存在两种类型的handlers.第一种是 handler mappings(处理程序映射).它们的角色定位与前面所描述的功能完全相同.它们尝试将当前 ...

  8. spring mvc 自定义转换器

    <!-- 注册转化器 --> <mvc:annotation-driven conversion-service="conversionService" /> ...

  9. spring mvc自定义注解--登录时密码加密注解

    1,定义注解名称接口 /** * 使用该注解不用再MD5转换了 * * @author adonis * */ @Target(ElementType.PARAMETER) @Retention(Re ...

随机推荐

  1. WCF—Binding

    原文地址:http://www.cnblogs.com/jams742003/archive/2010/01/13/1646379.html Binding描述了哪些层面的信息 一个Binding包含 ...

  2. 迭代加深搜索算法总结 + Editing a Book UVa11212题解

    迭代加深搜索算法: 对于可以用回溯法解决,但是解答树结点数大的恐怖的问题的一种解决办法,有的问题甚至用bfs连一层节点都遍历不完就超时了.具体方法就是依次枚举搜索层数,从1到一个上限. 结构: int ...

  3. Java环境变量的配置及意义

    配置环境:Windows XP 首先是配置参数,这个网站上很多.很多网站上说要配置三个参数,即Path,classpath,JAVA_HOME三个.   简要的介绍一下这三个环境变量. Path使得系 ...

  4. Java三十个面试题总结

          都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来了,免得笑话我们这些未出校门 ...

  5. sql服务器内部参数使用详情(存储过程)

    exec sp_help;返回当前数据库中的所有存储过程.exec sp_help datebase.dbo.table名称 返回当前表中的所有对象.如字段名称等.这个吊exec sp_helpfil ...

  6. Eclipse Python配置

    Macbook上面安装pydev后,发现新建project后并没有PyDev的选项.在官网上搜索后发现是JDK版本太久.上Oracle官网下载了最新JDK(url: http://www.oracle ...

  7. Cocos2d-X学习——Android移植,使用第三方库.so被删掉问题

    2014-05-26 导语:Cocos2dx在安卓上移植的时候,增加第三方库,却发现新加的so库被删掉了. 正文: 1.我的环境: cocos2d-x 2.2.3, ndk-r9 2.网上找了非常多, ...

  8. Android URI简单介绍

    就Android平台而言,URI主要分三个部分:scheme, authority and path.当中authority又分为host和port.格式例如以下: scheme://host:por ...

  9. 我的搜索优化记录(一):中文分词优化IK Analyzer

    搜索绝对不仅仅是搭起框架,跑出结果就完成的工作,之后分词.排序等等的优化才是重头戏. 先交代下背景:这个搜索是我一个人负责搭建并优化的项目,主要索引对象为歌曲.歌手MV等等. 使用技术:Lucene. ...

  10. 第二篇:R语言数据可视化之数据塑形技术

    前言 绘制统计图形时,半数以上的时间会花在调用绘图命令之前的数据塑型操作上.因为在把数据送进绘图函数前,还得将数据框转换为适当格式才行. 本文将给出使用R语言进行数据塑型的一些基本的技巧,更多技术细节 ...