zoukankan      html  css  js  c++  java
  • 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="0"/>
            <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的路径寻找

  • 相关阅读:
    jQuery基础
    深入理解JVM内存模型(jmm)和GC
    oracle,哪些操作会导致索引失效?
    systemd
    一个我小时候玩过的我是猪不然关机的软件,我高仿了一个,超简单。
    自己写的求最大值实现,用到了模板函数。
    poj 1695
    poj 1192
    poj 1239
    poj 1170
  • 原文地址:https://www.cnblogs.com/loswing/p/3877980.html
Copyright © 2011-2022 走看看