一、SpringMVC原理
請求到來時,第一個接受這個請求的前端控制器叫DispatcherServlet(這個需要在web.xml中配置), 后端控制器叫Controller。負責處理請求URL和后端控制器映射的叫HandMapping,它有多種類型,比較靈活,也是在一個xml文件上進 行配置。負責業務邏輯處理的模型對象一般也是我們平常寫的DAO/DTO組件。只是它最后的返回更靈活,Controller返回一個 ModelAndView對象給DispatcherServlet,ModelAndView可以攜帶一個視圖對象,也可以攜帶一個視圖對象的邏輯名。 如果攜帶的是一個視圖對象的邏輯名,那DispatcherServlet需要一個ViewResolver來查找用於渲染回應的視圖對象。最 后,DispatcherServlet將請求分派給ModelAndView對象指定的視圖對象。視圖對象負責渲染返回給客戶的回應。
更具體的工作流程是:
①當用戶在瀏覽器中點擊一個鏈接或者提交一個表單時,那么就會產生一個請求(request)。當請求離開瀏覽器時,它會攜帶用戶請求的信息(比如說請求的URL信息,用戶名,密碼什么的)。
②請求的第一站到達的是Spring的DispatcherServlet,它是一個前端控制器,工作是將用戶的請求委托給其他的組件(這里是交給 Spring MVC的控制器)去處理。這里DispatcherServlet要決定將請求傳給哪一個控制器(Controller)去處理,那么這時就需要處理器映 射(Handler Mapping)了。處理器映射會看請求的URL信息,然后決定將請求交給哪一個控制器去處理。比如說有兩個控制器ControllerA和 ControllerB,分別處理后綴名為.html和.jsp送來的請求,那么當請求者的后綴名為.html時,那么 DispatcherServlet就將請求交給ControllerA進行處理。
③當選擇了一個合適的控制器后,DispatcherServlet就會將請求交給這個控制器去處理。在這個控制器上,用戶的請求將會將用戶提交的一些信 息交由控制器處理並等待。然而設計的比較好的控制器本身對信息做很少的處理或者根本不做處理,而是將業務邏輯交給一個或多個服務器對象(Model)去處 理。
④當控制器對用戶請求所攜帶的信息進行處理(或交給模型層處理)后,經常會產生一些其他的需要返回給瀏覽器進行顯示的數據。這些原始數據直接顯示出來顯然 是不友好的,那么就需要視圖(View)來對這些數據進行顯示了。控制器的最后一件事就是將模型數據打包,並且指定產生輸出的視圖的特定名稱,然后它將模 型、視圖名稱以及request請求一起發送給DispatcherServlet。所以控制器並沒有與視圖進行耦合,因為傳遞給 DispatcherServlet的視圖名稱並不是某一個指定的特殊的文件名稱(如后綴名一定是JSP或其他什么名稱),它只要是一個可以產生輸出和展 示結果的邏輯名稱就可以了。
⑤DispatcherServlet會向一個視圖解析器(ViewResolver)進行請求,視圖解析器可以將邏輯視圖名稱映射到一個特定的視圖顯示文件上面。
⑥現在DispatcherServlet知道哪一個視圖文件可以顯示結果了。該視圖將會利用模板數據產生輸出,這些輸出通過response對象返回給客戶端進行顯示。
關於DispatcherServlet中請求處理的流程,請參看下圖:
二、SpringMVC核心接口(狠重要)
1、HandlerMapping接口 -- 處理請求的映射
Spring提供了三種有用的HandlerMapping的實現:
—— BeanNameUrlHandlerMapping
根據控制器的名字將控制器映射到URL
例如:在映射文件的xml中這樣配置:
—— SimpleUrlHandlerMapping
用上下文配置文件中定義的屬性集合將控制器映射到URL
例如:在映射文件的xml中這樣配置:
—— CommonsPathMapHandlerMapping
使用控制器代碼中的元數據將控制器映射到URL
例如:在映射文件的xml中這樣配置:
2、Controller接口 -- 后端控制器之一
Controller繼承體系如下圖:

那 先讓我們看一下ModelAndView的功能:
2.1: 一般后端控制器:AbstractController抽象類實現類示例:
public class HelloController extends AbstractController{
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
request.setAttribute("hello", "welcome to spring!");
return new ModelAndView("welcome");
}
}
2.2:Command Controllers(命令后端控制器)
其中這些控制器的實現類包括:AbstractCommandController抽象類、AbstractWizardFormController抽象類、SimpleFormController類等。
2.3:其他 Controllers(其他后端控制器)

3、ThrowawayController接口 -- 后端控制器之二
SpringMVC的jar包中沒有實現它的類:
示例:
a:ThrowawayController類:
public class ExampleThrowAwayController implements ThrowawayController
{
private String msg;
public void setMsg(String msg)
{
this.msg = msg;
}
@Override
public ModelAndView execute() throws Exception
{
String hashCodeMsg = "["+hashCode()+"]-"+msg;
return new ModelAndView("throwaway", "msg", hashCodeMsg);
}
}
b:映射文件的[ServletName]-servlet.xml應配置:
<bean id="exampleThrowAwayController" class="com.huateng.ExampleThrowAwayController" scope="prototype">
4、HandlerInterceptor 接口--攔截器
繼承體系:
示例: