深刻SpringMVC

1、如何讓一個普通類成爲Controller?java

方案一:實現接口Controller
解析:handleRequest(request,response)web

方案二:繼承AbstractControllerspring

解析:handleRequestInternal(request,response)設計模式

若處理器繼承自AbstractController類,那麼該控制器就具備了一些新功能。由於AbstractController類還繼承自一個父類WebContentGenerator,WebContentGenerator具備supportMethods屬性mvc

部分源碼實現:app

 

原理:
發現AbstractController類中有一個handleRequest()方法,用到了模板方法設計模式。
保證該方法中去調度了一個抽象方法。抽象方法在子類中根據業務需求被重寫。jsp

 


 

 

 

applicationContext.xml:url

 


還能夠設置支持的HTTP數據提交方式。默認支持GET/POST/HEAD,限定請求提交方式spa

 

地址欄默認的是GET請求,輸入的Post請求則報405設計

 

 


2、若是想在一個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>

 實現效果: 

 


 

3、參數方法名稱解析器 [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


4、經過視圖解析器引入外部或內部資源對象

 <!-- 內部資源對象 -->
  <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>

  

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

 


內部資源對象實現效果:

 

相關文章
相關標籤/搜索