衡量一個(gè)MVC框架模式,主要通過三種web模式,本人認(rèn)為springMVC是一個(gè)很好的MVC
模式,對(duì)模式的支持如下:
(1)派遣器模式
Spring有一個(gè)統(tǒng)一集中的派遣器org.springFramework.Web.Servlet.DispatcherServlet,
一般在web.XML中把所有的頁(yè)面請(qǐng)求都發(fā)送到該派遣器:
<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)控制器模式
派遣器收到請(qǐng)求后,把不同的頁(yè)面派遣到不同的控制器進(jìn)行處理:
<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的機(jī)制,默認(rèn)為BeanNameUrlHandlerMapping,我們這里采用的是
SimpleUrlHandlerMapping.
(3)攔截器模式
在控制器處理前,我們可以將其攔截,進(jìn)行一些特殊或通用處理;攔截器可以選用Spring已經(jīng)實(shí)現(xiàn)的或我們自己實(shí)現(xiàn)的:
<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>
詳細(xì)介紹:
① 分發(fā)器:Dispatcherservlet
整個(gè)spring應(yīng)用只需要一個(gè)分發(fā)器
<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>
處理器映射
一般對(duì)應(yīng)文件 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>
② 控制器
控制器的基礎(chǔ)接口 Controller ,包含方法
ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response)
throws Exception;
一般使用 return new ModelAndView(“”);也可以使用response.sendRedirect(“”).;
AbstractController控制器繼承Controller類,增加譬如緩存、minetype等功能,處理多個(gè)動(dòng)作,可以使用MultiActionController
但如果要表單和數(shù)據(jù)對(duì)象的交互,我們就使用命令控制器
一般使用AbstractCommandController帶參的形式,把相關(guān)的功能放在一個(gè)controller
譬如用戶的添加、修改、刪除,就可以采用 usemanage.do?msg=add/modify/delete的形式
SimpleFormController更為具體,但繼承它實(shí)現(xiàn)的OnSubmit的方法,不好用,譬如不能后退或者用于超鏈接等方式的地址直接響應(yīng)。
③ 處理器映射攔截器
攔截器接口定義了三個(gè)方法,一個(gè)在處理器執(zhí)行前被調(diào)用,一個(gè)在處理器執(zhí)行后被調(diào)用,還有一個(gè)在整個(gè)請(qǐng)求完成后調(diào)用。譬如在在上午9點(diǎn)到下午6點(diǎn)重定向某個(gè)頁(yè)面,
在handlerMapping那個(gè)bean里面加入
<property name=”interceptors”>
<list>
<ref bean=”officeHourIntercptor”>
</list>
</property>
然后一個(gè)處理Bean
<bean id=” officeHourIntercptor” class=” TimeBaseIntercptor”>
<property name=”openTime”> <value>9</value> </property>
<property name=”closeTime”> <value>18</value> </property>
</bean>
④ 視圖與解析器
Spring框架控制器返回的是ModelAndView,對(duì)于一般的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>
當(dāng)一個(gè)web中使用不同類型的視圖技術(shù),使用ResourceBandleViewResolver
⑤ 使用本地化信息
Spring框架大部分支持國(guó)際化,像web框架一樣,自動(dòng)解析客戶端信息
但我們可以自己手動(dòng)獲取客戶端信息,并做需要的參數(shù)設(shè)計(jì)來改變屬性
一般使用LocalChangeInterceptor修改本地化信息,這個(gè)像攔截器一樣使用
<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"/>