在SpringMVC框架中,擔(dān)任前端控制器的org.springframework.web.servlet.DispatcherServlet。Web.xml文件配置代碼如下:
1
<servlet>
2
<servlet-name>dispatcherServlet</servlet-name>
3
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
4
<init-param>
5
<param-name>contextConfigLocation</param-name>
6
<param-value>/WEB-INF/applicationContext.xml</param-value>
7
</init-param>
8
<load-on-startup>1</load-on-startup>
9
</servlet>
10
11
<servlet-mapping>
12
<servlet-name>dispatcherServlet</servlet-name>
13
<url-pattern>*.do</url-pattern>
14
</servlet-mapping>
DispatcherServlet負(fù)責(zé)分發(fā)請(qǐng)求至控制對(duì)象(Controller),控制對(duì)象要實(shí)現(xiàn)Controller接口中的handleRequest()方法:
ModelAndView handleRequest()HttpServletRequest request, HttpServletResponse response) throws Exception;
在web MVC架構(gòu)下,控制對(duì)象的作用為收集使用者的請(qǐng)求,進(jìn)行web層的相關(guān)操作,不應(yīng)當(dāng)在控制對(duì)象中執(zhí)行業(yè)務(wù)邏輯,也不應(yīng)當(dāng)讓Servlet相關(guān)的API浸入至業(yè)務(wù)層。
實(shí)際上,DispatcherServlet必須根據(jù)一個(gè)HandlerMapping對(duì)象,決定請(qǐng)求由哪一個(gè)Controller來(lái)處理,DispatcherServlet默認(rèn)用BeanNameUrlHandlerMapping,也就是根據(jù)Bean在定義時(shí)的“name”屬性及使用者請(qǐng)求的URL,決定使用哪個(gè)Controller實(shí)例。
在Controller返回ModelAndView后,DispatcherServlet會(huì)交由ViewR esolver對(duì)象來(lái)作View層的相關(guān)解析。例如InternalResourceViewResolver,需要設(shè)置viewClass,默認(rèn)是org.springframework.web.servlet.view.InternalResourceView。
InternalResourceViewResolver的prefix和suffix屬性會(huì)與ModelAndView返回的路徑信息結(jié)合。
一個(gè)簡(jiǎn)單的Spring MVC的Hello world例子如下:
編寫(xiě)SayHelloController.java文件,實(shí)現(xiàn)Controller接口
1
public class SayHelloController implements Controller
{
2
3
private String viewPage;
4
5
public ModelAndView handleRequest(HttpServletRequest request,
6
HttpServletResponse response) throws Exception
{
7
String username = request.getParameter("username");
8
return new ModelAndView(viewPage, "username", username);
9
}
10
11
public void setViewPage(String viewPage)
{
12
this.viewPage = viewPage;
13
}
14
}
編寫(xiě)配置文件applicationContext.xml
1
<bean id="viewResolver"
2
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
3
<property name="prefix" value="/WEB-INF/" />
4
<property name="suffix" value=".jsp" />
5
</bean>
6
<bean name="/sayHello.do" class="SpringMVC.SayHelloController">
7
<property name="viewPage" value="sayHello"/>
8
</bean>
9
項(xiàng)目的組織結(jié)構(gòu)如下圖:

Handler Mapping
BeanNameUrlHandlerMapping是簡(jiǎn)單的HandlerMapping,Spring中常用的是SimpleUrlHandlerMapping。
一段配置如下:
1
<bean name="loggingInterceptor" class="SpringMVC.LoggingInterceptor"/>
2
3
<bean id="urlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
4
<property name="interceptors">
5
<list>
6
<ref bean="loggingInterceptor"/>
7
</list>
8
</property>
9
<property name="mappings">
10
<props>
11
<prop key="/sayHello.do">sayHelloController</prop>
12
</props>
13
</property>
14
</bean>
15
16
<bean name="sayHelloController" class="SpringMVC.SayHelloController">
17
<property name="viewPage" value="sayHello"/>
18
</bean>
Handler Interceptor
在執(zhí)行Controller的前后,或是在View繪制之后打算作一些操作,可以實(shí)現(xiàn)HandlerInterceptor接口:
1
public interface HandlerInterceptor
{
2
3
public void afterCompletion(HttpServletRequest arg0,
4
HttpServletResponse arg1, Object arg2, Exception arg3)
5
throws Exception;
6
7
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
8
Object arg2, ModelAndView arg3) throws Exception;
9
10
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
11
Object arg2) throws Exception ;
12
13
}
可以繼承HandlerInterceptorAdapter,它實(shí)現(xiàn)了HandlerInterceptor接口。然后在xml文件中配置上上段代碼。
ModelAndView
ModelAndView類(lèi)代表了Spring MVC程序中,呈現(xiàn)畫(huà)面所使用的Model數(shù)據(jù)對(duì)象與View數(shù)據(jù)對(duì)象。由于Java程序的方法中一次只能返回一個(gè)對(duì)象,所以ModelAndView的作用是封裝這兩個(gè)對(duì)象,方便同時(shí)返回Model與View。
Model可以用一個(gè)Map封裝;View可以用一個(gè)簡(jiǎn)單字符串,也可以用一個(gè)實(shí)現(xiàn)了View接口的對(duì)象。一個(gè)實(shí)現(xiàn)View的實(shí)例是RediectView,它將使用重定向。而默認(rèn)是使用轉(zhuǎn)發(fā)。
View Resolver
View名稱(chēng)的解析是委托給實(shí)現(xiàn)ViewResolver接口的實(shí)例。其一個(gè)實(shí)例是InternalResourceViewResolver。
還有其他的如BeanNameViewResolver。當(dāng)ModelAndView返回的view名稱(chēng)是“hello”時(shí),會(huì)尋找id屬性是hello的View Bean。
ViewResolver在名稱(chēng)解析完畢后,實(shí)際的View繪制于Model對(duì)象的轉(zhuǎn)換處理時(shí)交給實(shí)現(xiàn)View接口的實(shí)例。例如InternalResourceViewResolver默認(rèn)的viewClass是InternalResourceView。還有其他的如JstlView、TilesView、VelocityView等。