衡量一個MVC框架模式,主要通過三種web模式,本人認為springMVC是一個很好的MVC
模式,對模式的支持如下:
(1)派遣器模式
Spring有一個統一集中的派遣器org.springFramework.Web.Servlet.DispatcherServlet,
一般在web.XML中把所有的頁面請求都發送到該派遣器:
<servlet>
<servlet-name>countries</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>countries</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
(2)控制器模式
派遣器收到請求后,把不同的頁面派遣到不同的控制器進行處理:
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/home.htm">countriesController</prop>
<prop key="/notfound.htm">errorsController</prop>
</props>
</property>
</bean>
Spring有兩種MAPPING的機制,默認為BeanNameUrlHandlerMapping,我們這里采用的是
SimpleUrlHandlerMapping.
(3)攔截器模式
在控制器處理前,我們可以將其攔截,進行一些特殊或通用處理;攔截器可以選用Spring已經實現的或我們自己實現的:
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref local="localeChangeInterceptor"/>
<ref local="themeChangeInterceptor"/>
<ref local="copyInterceptor"/>
</list>
</property>
</bean>
詳細介紹:
① 分發器:Dispatcherservlet
整個spring應用只需要一個分發器
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 映射的類型-->
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
處理器映射
一般對應文件 servlet-name-servlet.xml,譬如 springapp-servlet.xml
BeanNameUrlHandlerMapping
一般使用SimpleUrlHandlerMapping
<!--Request Mapping -->
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings">
<props>
<prop key="login.do">LoginController</prop>
<prop key="login.html">LoginController</prop>
</props>
</property>
</bean>
② 控制器
控制器的基礎接口 Controller ,包含方法
ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response)
throws Exception;
一般使用 return new ModelAndView(“”);也可以使用response.sendRedirect(“”).;
AbstractController控制器繼承Controller類,增加譬如緩存、minetype等功能,處理多個動作,可以使用MultiActionController
但如果要表單和數據對象的交互,我們就使用命令控制器
一般使用AbstractCommandController帶參的形式,把相關的功能放在一個controller
譬如用戶的添加、修改、刪除,就可以采用 usemanage.do?msg=add/modify/delete的形式
SimpleFormController更為具體,但繼承它實現的OnSubmit的方法,不好用,譬如不能后退或者用于超鏈接等方式的地址直接響應。
③ 處理器映射攔截器
攔截器接口定義了三個方法,一個在處理器執行前被調用,一個在處理器執行后被調用,還有一個在整個請求完成后調用。譬如在在上午9點到下午6點重定向某個頁面,
在handlerMapping那個bean里面加入
<property name=”interceptors”>
<list>
<ref bean=”officeHourIntercptor”>
</list>
</property>
然后一個處理Bean
<bean id=” officeHourIntercptor” class=” TimeBaseIntercptor”>
<property name=”openTime”> <value>9</value> </property>
<property name=”closeTime”> <value>18</value> </property>
</bean>
④ 視圖與解析器
Spring框架控制器返回的是ModelAndView,對于一般的JSP和Servlet,一般使用InternalResourceViewResolver,繼承于UrlBaseViewResovler
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
</bean>
當一個web中使用不同類型的視圖技術,使用ResourceBandleViewResolver
⑤ 使用本地化信息
Spring框架大部分支持國際化,像web框架一樣,自動解析客戶端信息
但我們可以自己手動獲取客戶端信息,并做需要的參數設計來改變屬性
一般使用LocalChangeInterceptor修改本地化信息,這個像攔截器一樣使用
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName"><value>siteLanguage</value></property>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>