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>
外部資源對象實現效果:跳轉到京東首頁
內部資源對象實現效果: