zoukankan      html  css  js  c++  java
  • 深入理解Spring Mvc

    如何让一个普通类成为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

     


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

     

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

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

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

    两大实现类:

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <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] 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <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="/h1.do">list</prop>
      <prop key="/h2.do">add</prop>
      </props>
      </property>
      </bean>
     
     <bean id="firstController" class="cn.happy.controller.MyMultiController">
     <property name="methodNameResolver" ref="nameResolver"></property>
     </bean>

     实现效果: 

     


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

    关键代码: 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <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


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <!-- 内部资源对象 -->
     <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>

      

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

     


    内部资源对象实现效果:

     

  • 相关阅读:
    HDU 1114 Piggy-Bank
    HDU 2955 Robberies
    NTOJ 290 动物统计(加强版)
    POJ 3624 Charm Bracelet
    HDU 2602 Bone Collector
    POJ 1523 SPF(无向图割顶)
    HDU 5311 Hidden String
    HDU 1421 搬寝室
    HDU 1058 Humble Numbers
    POJ 3259 Wormholes(spfa判负环)
  • 原文地址:https://www.cnblogs.com/6zhi/p/6219917.html
Copyright © 2011-2022 走看看