• 热门专题

SpringMVC自定义处理器里的那些事

作者:BEYOND'  发布日期:2016-12-26 20:23:23
Tag标签:处理器  

  • 一、如何让一个普通类成为Controller?

    ①:实现接口Controller
      解析:handleRequest(request,response)

    ②:继承AbstractController

      解析:handleRequestInternal(request,response)

    若处理器继承自AbstractController类,那么该控制器就具有了一些新功能。因为AbstractController类还继承自一个父类WebContentGenerator,WebContentGenerator具有supportMethods属性

    部分源码实现:

    原理:
    发现AbstractController类中有一个handleRequest()方法,用到了模板方法设计模式。
    保证该方法中去调度了一个抽象方法。抽象方法在子类中根据业务需求被重写。


    applicationContext.xml:


    还可以设置支持的HTTP数据提交方式。默认支持GET/POST/HEAD,限定请求提交方式。

     

    地址栏默认的是GET请求,输入的Post请求则报405。(高大上的405)

     


    二、如果想在一个Controller中定义N个方法,让他们分别执行,如何实现?[继承自MultiActionController]

     

    其次该如何去匹配这些方法?在这里引出一个方法名称解析器[MethodNameResolver]。

    作用:将url地址中的资源路径和方法名称做一一对应

    在MultiActionController中有一个成员变量
    private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver();
    MethodNameResolver接口:

    两大实现类:

    ①InternalPathMethodNameResolver---在请求地址中指定方法名称
    ②PropertyMethodNameResolver

    第一种方案关键代码:[InternalPathMethodNameResolver]

    <bean class='org.springframework.web.servlet.handler.SimpleUrlHandlerMapping'>
      <property name='mappings'>
      <props>
      <prop key='/*.do'>firstController</prop>
      </props>
      </property>
      </bean>
       
      <!-- 默认方法名称解析器-->
      <bean id='nameResolver' class='org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver'></bean>
       
    <bean id='firstController' class='cn.happy.controller.MyMultiController'>
     <property name='methodNameResolver' ref='nameResolver'></property>
     </bean>
    

      

    第二种方案关键代码:[PropertyMethodNameResolver] 

    <bean class='org.springframework.web.servlet.handler.SimpleUrlHandlerMapping'>
      <property name='mappings'>
      <props>
      <prop key='/*.do'>firstController</prop>
      </props>
      </property>
      </bean>
     
     <!-- 方法名称解析器 -->
      <bean id='nameResolver' class='org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver'>
      <property name='mappings'>
      <props>
      <prop key='/h3.do'>list</prop>
      <prop key='/h4.do'>add</prop>
      </props>
      </property>
      </bean>
     
     <bean id='firstController' class='cn.happy.controller.MyMultiController'>
     <property name='methodNameResolver' ref='nameResolver'></property>
     </bean>

    实现效果: 

     


    三、参数方法名称解析器 [ParameterMethodNameResolver]

    关键代码: 

    <bean class='org.springframework.web.servlet.handler.SimpleUrlHandlerMapping'>
      <property name='mappings'>
      <props>
      <prop key='/hello.do'>firstController</prop>
      </props>
      </property>
      </bean>
     
      <!--  参数方法名称解析器   默认的是action-->
      <bean id='nameResolver' class='org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver'>
      <property name='paramName' value='actionName'></property>
      </bean>
     
     
     <bean id='firstController' class='cn.happy.controller.MyMultiController'>
     <property name='methodNameResolver' ref='nameResolver'></property>
     </bean>

    注:不指定paramName,默认是action。


    四、通过视图解析器引入外部或内部资源对象

    <!-- 内部资源对象 -->
     <bean id='internal' class='org.springframework.web.servlet.view.JstlView'>
     <property name='url' value='/WEB-INF/jsp/index.jsp'></property>
     </bean>
      
      
     <!-- 外部资源对象 -->
     <bean id='jd' class='org.springframework.web.servlet.view.RedirectView'>
     <property name='url' value='http://www.jd.com'></property>
     </bean>
      
     <!-- 视图解析器 -->
     <bean class='org.springframework.web.servlet.view.BeanNameViewResolver'></bean>
      
     <!-- 处理器配置 -->
     <bean id='/hello.do' class='cn.happy.controller.MyController'></bean>

    外部资源对象实现效果:跳转到京东首页:


    内部资源对象实现效果:

     


    只有创造,才是真正的享受,只有拚搏,才是充实的生活。

                    --- 享受生活

延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规