• 深入理解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>

      

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

     


    内部资源对象实现效果:

     

  • 相关阅读:
    为什么整个互联网行业都缺前端工程师?
    css3做的圆特效
    又一个前端的小渣渣诞生了
    返回顶部代码!
    网页动画的十二原则
    JQuery缓冲加载图片插件lazyload.js的使用方法
    关于写手机页面demo的准备工作
    HTML5加载动画
    HTML5加载动画
    正则表达式语法
  • 原文地址:https://www.cnblogs.com/6zhi/p/6219917.html
Copyright © 2020-2023  润新知