核心類與接口: css
先來了解一下,幾個重要的接口與類。如今不知道他們是幹什麼的不要緊,先混個臉熟,爲之後認識他們打個基礎。 web
DispatcherServlet -- 前置控制器 spring
HandlerMapping接口 -- 處理請求的映射 mvc
HandlerMapping接口的實現類: app
SimpleUrlHandlerMapping 經過配置文件,把一個URL映射到Controller 框架
DefaultAnnotationHandlerMapping 經過註解,把一個URL映射到Controller類上 jsp
HandlerAdapter接口 -- 處理請求的映射 url
AnnotationMethodHandlerAdapter類,經過註解,把一個URL映射到Controller類的方法上 spa
Controller接口 -- 控制器 orm
因爲咱們使用了@Controller註解,添加了@Controller註解註解的類就能夠擔任控制器(Action)的職責,
因此咱們並無用到這個接口。
HandlerInterceptor 接口--攔截器
無圖,咱們本身實現這個接口,來完成攔截的器的工做。
ViewResolver接口的實現類
UrlBasedViewResolver類 經過配置文件,把一個視圖名交給到一個View來處理
InternalResourceViewResolver類,比上面的類,加入了JSTL的支持
View接口
JstlView類
LocalResolver接口
HandlerExceptionResolver接口 --異常處理
SimpleMappingExceptionResolver實現類
ModelAndView類
無圖。
DispatcherServlet說明
使用Spring MVC,配置DispatcherServlet是第一步。
DispatcherServlet是一個Servlet,因此能夠配置多個DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據某某規則分發到目標Controller(咱們寫的Action)來處理。
「某某規則」:是根據你使用了哪一個HandlerMapping接口的實現類的不一樣而不一樣。
先來看第一個例子:
<load-on-startup>1</load-on-startup>是啓動順序,讓這個Servlet隨Servletp容器一塊兒啓動。
<url-pattern>*.form</url-pattern> 會攔截*.form結尾的請求。
<servlet-name>example</servlet-name>這個Servlet的名字是example,能夠有多個DispatcherServlet,是經過名字來區分的。每個DispatcherServlet有本身的WebApplicationContext上下文對象。同時保存的ServletContext中和Request對象中,關於key,之後說明。
在DispatcherServlet的初始化過程當中,框架會在web應用的 WEB-INF文件夾下尋找名爲[servlet-name]-servlet.xml 的配置文件,生成文件中定義的bean。
第二個例子:
指明瞭配置文件的文件名,不使用默認配置文件名,而使用springMVC.xml配置文件。
其中<param-value>**.xml</param-value> 這裏可使用多種寫法
一、不寫,使用默認值:/WEB-INF/<servlet-name>-servlet.xml
二、<param-value>/WEB-INF/classes/springMVC.xml</param-value>
三、<param-value>classpath*:springMVC-mvc.xml</param-value>
四、多個值用逗號分隔
Servlet攔截匹配規則能夠自已定義,攔截哪一種URL合適?
當映射爲@RequestMapping("/user/add")時,爲例:
一、攔截*.do、*.htm, 例如:/user/add.do
這是最傳統的方式,最簡單也最實用。不會致使靜態文件(jpg,js,css)被攔截。
二、攔截/,例如:/user/add
能夠實現如今很流行的REST風格。不少互聯網類型的應用很喜歡這種風格的URL。
弊端:會致使靜態文件(jpg,js,css)被攔截後不能正常顯示。想實現REST風格,事情就是麻煩一些。後面有解決辦法還算簡單。
三、攔截/*,這是一個錯誤的方式,請求能夠走到Action中,但轉到jsp時再次被攔截,不能訪問到jsp。