zoukankan      html  css  js  c++  java
  • 深入springMvc

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

    方案一:实现接口Controller
    解析:handleRequest(request,response)

    方案二:继承AbstractController

    解析:handleRequestInternal(request,response)

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

    部分源码实现:

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

    二、如果想在一个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="/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]

    关键代码: 

    <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>

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

    <!-- 内部资源对象 -->
     <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>

     

  • 相关阅读:
    纪中第三天
    纪中第一天
    图片验证码的实现
    使用监听器解决路径问题
    log4j测试示例
    redis示例
    kafka示例
    CSRF verification failed. Request aborted.
    TemplateDoesNotExist
    创建 django 项目命令
  • 原文地址:https://www.cnblogs.com/chimingyang/p/6219966.html
Copyright © 2011-2022 走看看