文章出處

一、如何讓一個普通類成為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]

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

 

注:不指定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>

  

外部資源對象實現效果:跳轉到京東首頁

 


內部資源對象實現效果:

 

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()