一、瀏覽器發出請求,如url:localhost:8080/test/start.testhtml
二、請求會給到DispatcherServlet(總的控制中心——前端控制器),由它對請求進行派發,前端控制器是須要寫在配置文件web.xml中,即前端
<servlet> <servlet-name> test</servlet-name > <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class > <load-on-startup> 1</ load-on-startup> </servlet> <servlet-mapping> <servlet-name> test</servlet-name > <url-pattern> *.test</url-pattern > </servlet-mapping>
因爲限制了url的格式,若是請求是已.test結尾的。java
三、前端控制器DispatcherServlet接收到請求,派發給咱們本身的控制器,即具體的控制器,如StartController,如何派發給本身的控制器呢,就須要一個HandlerMapping,即創建了請求與控制器之間的映射,HandlerMapping須要配置在test-Servlet.xml文件中。web
這裏說一個比較簡單的控制器,SimpleUrlHandlerMapping,配置代碼以下:spring
<!-- 基於Url的控制器,比較簡單的控制器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > <property name="mappings" > <props> <prop key="start.test" >startController</ prop> <prop key="add_emp.test" >addEmpController</ prop> <!-- UrlFilenameViewController --> <prop key="add.test" >addEmpSuccController</ prop> </props> </property> </bean>
四、轉到哪一個具體的控制器,就須要按本身的要求去選擇了。瀏覽器
上面提到的,本身創建的控制器,實現的是簡單的Controller接口,以下:restful
<bean id= "startController" class ="test.StartController"></ bean>mvc
經常使用的,以及好用的控制器,在通常項目中常常使用到的。app
用於直接跳轉頁面的控制器:jsp
ParameterizableViewController,UrlFilenameViewController
配置以下:
(1)須要指定視圖名,name ="viewName" value= "login"。
<!-- 參數化的ViewController,咱們不須要本身創建,只須要直接使用就能夠了 --> <bean id= "loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" > <property name="viewName" value="login"/> </ bean>
(2)不須要指定視圖名,他是獲取Url中的「.test」前面那一段。如「add_emp」
<!-- 使用UrlFilenameViewController,就不須要配置視圖名這個過程。 --> <bean id= "addEmpController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" > </bean>
使用時機:有時候,把全部的jsp文件隱藏在WEB-INF中裏面。
進階,控制器,包括
AbstractController
命令控制器——AbstractCommandController
(3)這個控制器開始,能夠自動封裝表單參數成Object commandc對象,控制器中只須要。
//自動封裝表單參數成command,再強制裝換成 Emp對象。
Emp emp=(Emp)command;
//service.addEmp(emp);
System. out.println(emp);
在配置文件中,須要制定Command是一個什麼樣類型的類。
<!-- 指定command對象是一個什麼樣的類,此處爲員工類test.Emp --> <bean id= "addEmpSuccController" class="test.EmpController"> <property name="commandClass" value="test.Emp"/> </bean>
如此就能夠了。
(4)說到這個控制器可以自動封裝表單成爲咱們須要的Bean,表單中的類型爲int或String類型,能夠,若是是Date類型,就不能夠。
整型正確轉行,日期型不正確轉化
屬性編輯器的問題
如何提供本身的屬性編輯器。
DataBind——數據綁定
給數據綁定對象註冊一個日期類型的屬性編輯器,須要重寫初始化綁按期的方法
@Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { // TODO Auto-generated method stub super.initBinder(request, binder); }
自定義爲以下所示:
//註冊了日期轉換的編輯器 @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date. class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd" ), true)); }
表單控制器——SimpleFormController
(5)onSubmit方法,當表單用post方法提交時,會轉到這個方法。若是進入一個頁面以前有,有數據須要初始化,須要用到referenceData方法。建造一個map模型。
jsp頁面須要使用到jstl包。
@Override protected Map referenceData(HttpServletRequest request) throws Exception { Map<String, Object> model= new HashMap<String, Object>(); model.put( "deptList", new String[]{"sales", "manage"}); return model; } /** * onSubmit方法,是當表單提交時處理請求 * 3.0版本後少用。 * 若是使用command控制器,只要 Url符合要求,自動就會提交 * 若是使用Form控制器,只有表單是method="post"時,纔會去執行onSubmit方法。 */ @Override protected ModelAndView onSubmit(Object command) throws Exception { Emp emp = (Emp) command; // service.addEmp(emp); System. out.println(emp); return new ModelAndView(getSuccessView() ); }
test-servlet.xml配置文件須要配置以下:
<bean id= "addEmpController" class ="test.EmpFormController"> <property name="commandClass" value="test.Emp" /> <property name="formView" value="add_emp" /> <property name="successView" value="success" /> </bean>
(6)
五、視圖解析器。
<!--基於URL的視圖解析器, 從邏輯視圖名稱到真正視圖上面的映射 --> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" > <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
跳轉到哪一個頁面,是根據這裏設定的,
六、基於註解的MVC
加入包
當有多個配置文件時,能夠在web.xml中配置以下:
<servlet > <servlet-name >mvc</ servlet-name> < servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param > <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名稱不變 --> <param-value> /WEB-INF/classes/spring/*.xml </param-value> </init-param > <load-on-startup >1</ load-on-startup> </servlet >
看樣子是知道了,雖然是在src/config裏面創建配置文件,可是項目運行會把它放到上面的路徑中。
下面的配置是重點!
<init-param > <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名稱不變 --> <param-value> /WEB-INF/classes/spring/*.xml </param-value> </init-param >
在Controller中,添加註解,如
@Controller @RequestMapping("/test" ) public class TestController { @RequestMapping("/start/{name}" ) public String start(@PathVariable String name){ System. out.println(name); return "start" ; } }
上面使用了兩個註解。看到了吧
在servlet.xml中,首先,須要掃描包含控制器的包,找到這些註解。
<!-- 一、進行廣泛掃描 --> <context:component-scan base-package="test.controller" />
<!-- 二、視圖解析器,使用 jsp或者jstl 最適合使用這個類。基於Resources的解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/page/"/> <property name="suffix" value=".jsp"/> </bean>
詳細講 @RequestMapping ("/start" )
方法級別(必定要有),如上http://localhost:8080/@mvc/start.do
類級別,至關於根路徑http://localhost:8080/@mvc/test/start.do
restfull,Url層面上的。