文檔版本 | 開發工具 | 測試平台 | 工程名字 | 日期 | 作者 | 備注 |
---|---|---|---|---|---|---|
V1.0 | 2016.06.29 | lutianfei | none |
-
- springmvc架構
- springmvc業務流程架構
- springmvc架構元件說明
- Spring MVC入門程式
- 配置前端控制器
- 配置處理器擴充卡
- 開發Handler
- 視圖編寫
- 配置Handler
- 配置處理器映射器
- 配置視圖解析器
- 部署調試
- 非注解的處理器映射器 和 擴充卡
- 非注解的處理器映射器
- 非注解的處理器擴充卡
- springmvc的預設加載
- 注解的處理器映射器和擴充卡
- 配置注解映射器和擴充卡
- 開發注解Handler
- 在spring容器中加載Handler
- 視圖解析器配置字首和字尾
- 源碼分析了解
- 入門程式小結
- springmvc業務流程架構
- springmvc架構
- 内容安排:
- 第一天:springmvc的基礎知識
- 什麼是springmvc?
- springmvc架構原理(掌握)
- 前端控制器、處理器映射器、處理器擴充卡、視圖解析器
- springmvc入門程式
- 目的:對前端控制器、處理器映射器、處理器擴充卡、視圖解析器學習
- 非注解的處理器映射器、處理器擴充卡
- 注解的處理器映射器、處理器擴充卡(掌握)
- springmvc和mybatis整合(掌握)
- springmvc注解開發:(掌握)
- 常用的注解學習
- 參數綁定(簡單類型、pojo、集合類型(明天講))
- 自定義參數綁定(掌握)
- springmvc和struts2差別
- 第二天:springmvc的進階應用
- 參數綁定(集合類型)
- 資料回顯
- 上傳圖檔
- json資料互動
- RESTful支援
- 攔截器
- 第一天:springmvc的基礎知識
springmvc架構
- springmvc是spring架構的一個子產品,springmvc和spring無需通過中間整合層進行整合。
- springmvc是一個基于mvc的web架構。

springmvc業務流程架構
- 第一步:使用者發送請求至
DispatcherServlet前端控制器
- 第二步:
收到請求調用DispatcherServlet前端控制器
查找HandlerMapping處理器映射器
Handler處理器
- 可以根據xml配置、注解進行查找
- 第三步:
根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(即HandlerMapping處理器映射器
)并傳回給HandlerExecutionChain執行鍊
。DispatcherServlet前端控制器
- 第四步:
通過DispatcherServlet前端控制器
調用HandlerAdapter處理器擴充卡
Handler處理器
- 第五步:
去執行HandlerAdapter處理器擴充卡
(Controller,也叫後端控制器)。Handler處理器
- 第六步:
執行完成給Handler處理器
傳回ModelAndViewHandlerAdapter處理器擴充卡
- 第七步:
将HandlerAdapter處理器擴充卡
執行結果ModelAndView傳回給Handler處理器
DispatcherServlet前端控制器
-
是springmvc架構的一個底層對象,包括 Model和viewModelAndView
-
- 第八步:
将ModelAndView傳給DispatcherServlet前端控制器
ViewReslover視圖解析器
- 根據邏輯視圖名解析成真正的視圖(jsp)
- 第九步:
向ViewReslover視圖解析器
傳回ViewDispatcherServlet前端控制器
- 第十步:
對View進行渲染視圖(即将模型資料填充至視圖中)。DispatcherServlet前端控制器
- 視圖渲染将模型資料(在ModelAndView對象中)填充到request域
- 第十一步:
向使用者響應結果DispatcherServlet前端控制器
springmvc架構元件說明
- 1、
(不需要程式員開發)前端控制器DispatcherServlet
- 使用者請求到達前端控制器,它就相當于mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它元件處理使用者的請求,dispatcherServlet的存在降低了元件之間的耦合性。
- 2、
(不需要程式員開發)處理器映射器HandlerMapping
- HandlerMapping負責根據使用者請求找到Handler即處理器,springmvc提供了不同的映射器實作不同的映射方式,例如:配置檔案方式,實作接口方式,注解方式等。
- 3、
(需要程式員開發)處理器Handler
- Handler是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的使用者請求進行處理。需要程式員根據業務需求開發Handler。
- 注意:編寫Handler時按照HandlerAdapter的要求去做,這樣擴充卡才可以去正确執行Handler
- 4、
處理器擴充卡HandlerAdapter
- 作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
- 通過HandlerAdapter對處理器進行執行,這是擴充卡模式的應用,通過擴充擴充卡可以對更多類型的處理器進行執行。
- 5、
(不需要程式員開發)視圖解析器View resolver
- 作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)
- View Resolver負責将處理結果生成View視圖,View Resolver首先根據
解析成邏輯視圖名
即具體的頁面位址,再生成View視圖對象,最後對View進行渲染将處理結果通過頁面展示給使用者。實體視圖名
- 6、
(需要程式員開發jsp)視圖View
- View是一個接口,實作類支援不同的View類型(jsp、freemarker、pdf…)
- springmvc架構提供了很多的View視圖類型,包括:jstlView、freemarkerView、pdfView等。
- 一般情況下需要通過
或頁面标簽
将模型資料通過頁面展示給使用者,需要由程式員根據業務需求開發具體的頁面。頁面模版技術
Spring MVC入門程式
- 需求: springmvc和mybaits使用一個案例(商品訂單管理)。
- 環境準備
- 資料庫環境:mysql5.1
- java環境:
- jdk1.7.0_72
- eclipse indigo
- springmvc版本:spring3.2
- 需要spring3.2所有jar(一定包括spring-webmvc-3.2.0.RELEASE.jar)
Spring MVC入門第1天--架構說明與快速入門
配置前端控制器
- 在web.xml中配置前端控制器。
Spring MVC入門第1天--架構說明與快速入門
配置處理器擴充卡
- 在classpath下的springmvc.xml中配置處理器擴充卡
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 處理器映射器 -->
<!-- 根據bean的name進行查找Handler 将action的url配置在bean的name中 -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
通過檢視原代碼:
- 此擴充卡能執行實作 Controller接口的Handler并傳回ModelAndView類型資料。
開發Handler
- 需要實作 controller接口,才能由
擴充卡執行。org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
public class ItemsController1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//調用service查找 資料庫,查詢商品清單,這裡使用靜态資料模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中填充靜态資料
Items items_1 = new Items();
items_1.setName("聯想筆記本");
items_1.setPrice(f);
items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");
Items items_2 = new Items();
items_2.setName("蘋果手機");
items_2.setPrice(f);
items_2.setDetail("iphone6蘋果手機!");
itemsList.add(items_1);
itemsList.add(items_2);
//傳回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相當 于request的setAttribut,在jsp頁面中通過itemsList取資料
modelAndView.addObject("itemsList", itemsList);
//指定視圖
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
視圖編寫
- 添加itemsList.jsp頁面
Spring MVC入門第1天--架構說明與快速入門
配置Handler
- 将編寫Handler在spring容器加載(springmvc.xml)。
Spring MVC入門第1天--架構說明與快速入門
配置處理器映射器
- 在classpath下的springmvc.xml中配置處理器映射器
Spring MVC入門第1天--架構說明與快速入門
配置視圖解析器
- 需要配置解析jsp的視圖解析器。
Spring MVC入門第1天--架構說明與快速入門
部署調試
- 通路位址:http://localhost/springmvcfirst1208/queryItems.action
- 處理器映射器根據url找不到Handler,報下邊的錯誤。說明url通路位址錯誤。
Spring MVC入門第1天--架構說明與快速入門 - 處理器映射器根據url找到了Handler,轉發的jsp頁面找到,報下邊的錯誤,說明jsp頁面位址錯誤了。
- 修改
檔案中的modelAndView指定的視圖位址即可。ItemsController1.java
Spring MVC入門第1天--架構說明與快速入門
非注解的處理器映射器 和 擴充卡
非注解的處理器映射器
- 上面入門所用的處理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
- 問題:url配置是在bean中完成的
- url和handler集中配置的映射器(簡單映射器):
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
Spring MVC入門第1天--架構說明與快速入門 - 結論:多個映射器可以并存,前端控制器判斷url能讓哪些映射器映射,就讓正确的映射器處理。
- handler要加入id屬性
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />
非注解的處理器擴充卡
- 入門所使用擴充卡:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
- 要求: 編寫的Handler實作 Controller接口。
- 另一種擴充卡:
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
- 添加擴充卡聲明 :
<!-- 另一個非注解的擴充卡 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
- 要求編寫的Handler實作 HttpRequestHandler接口。
- 添加handle屬性
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems1.action"> itemsController1</prop>
<prop key="/queryItems2.action"> itemsController2</prop>
</props>
</property>
</bean>
- 使用此方法可以通過修改response,設定響應的資料格式,比如響應json資料
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");*/
springmvc的預設加載
- 在 DispatcherSerlvet.properties 中
Spring MVC入門第1天--架構說明與快速入門 - 前端控制器從上邊的檔案中加載處理映射器、擴充卡、視圖解析器等元件,如果不在springmvc.xml中配置,使用預設加載的。
注解的處理器映射器和擴充卡
- 在spring**3.1之前使用的注解映射器:org.springframework.web.servlet.mvc.annotation.**DefaultAnnotationHandlerMapping。
- 在spring3.1之後使用的注解映射器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping。
- 在spring**3.1之前使用的注解擴充卡 : org.springframework.web.servlet.mvc.annotation.**AnnotationMethodHandlerAdapter。
- 在spring3.1之後使用的注解擴充卡 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter。
配置注解映射器和擴充卡
- 開發中使用
代替上邊注解映射器和注解擴充卡配置mvc:annotation-driven
-
預設加載很多的參數綁定方法,比如json轉換解析器就預設加載了,如果使用mvc:annotation-driven
不用配置上邊的RequestMappingHandlerMapping和RequestMappingHandlerAdaptermvc:annotation-driven
-
//springmvc.xml
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
開發注解Handler
-
和注解的映射器
必須配對使用注解的擴充卡
- @RequestMapping(“/queryItems”):這裡映射可以不加字尾
但是輸入網址時必須加。.action
//使用Controller注解 辨別下面的類是一個控制器
@Controller
public class ItemsController3 {
//商品查詢清單
//@RequestMapping實作 對queryItems方法和url進行映射,一個方法對應一個url
//一般建議将url和方法寫成一樣
@RequestMapping("/queryItems")
public ModelAndView queryItems()throws Exception{
//調用service查找 資料庫,查詢商品清單,這裡使用靜态資料模拟
List<Items> itemsList = new ArrayList<Items>();
//向list中填充靜态資料
Items items_1 = new Items();
items_1.setName("聯想筆記本");
items_1.setPrice(f);
items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");
Items items_2 = new Items();
items_2.setName("蘋果手機");
items_2.setPrice(f);
items_2.setDetail("iphone6蘋果手機!");
itemsList.add(items_1);
itemsList.add(items_2);
//傳回ModelAndView
ModelAndView modelAndView = new ModelAndView();
//相當 于request的setAttribut,在jsp頁面中通過itemsList取資料
modelAndView.addObject("itemsList", itemsList);
//指定視圖
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
在spring容器中加載Handler
- 對于注解的Handler可以單個配置,但實際開發中建議使用元件掃描
- 元件掃描可以掃描controller、service、…
<!--
Handler的單個配置
-->
<!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->
<!--
元件掃描:這裡掃描的是controller包
-->
<context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
- 部署調試
- 通路:http://localhost/springmvcfirst1208/queryItems.action
視圖解析器配置字首和字尾
<!-- 視圖解析器
解析jsp解析,預設使用jstl标簽,classpath下的得有jstl的包
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路徑的字首 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 配置jsp路徑的字尾 -->
<property name="suffix" value=".jsp"/>
</bean>
- 此時程式中不用指定字首和字尾,上述
最後可修改如下:ItemsController3.java
//指定視圖
//下邊的路徑,如果在視圖解析器中配置jsp路徑的字首和jsp路徑的字尾,修改為
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
//上邊的路徑配置可以不在程式中指定jsp路徑的字首和jsp路徑的字尾
modelAndView.setViewName("items/itemsList");
源碼分析(了解)
- 通過前端控制器源碼分析springmvc的執行過程。
- 第一步:前端控制器接收請求
- 由
的web.xml
轉到org.springframework.web.servlet.DispatcherServlet
DispatcherServlet
- 找到方法:
doDispatch
- 由
- 第二步:前端控制器調用處理器映射器查找 Handler
- 在
方法的第896行找到getHandler()函數并進入doDispatch
HandlerExcecutionChain
Spring MVC入門第1天--架構說明與快速入門 - 繼續進入下一層
函數,找到最終的getHandler
定義HandlerExcecutionChain
Spring MVC入門第1天--架構說明與快速入門
- 在
- 第三步:調用處理器擴充卡執行Handler,得到執行結果ModelAndView
- 在
函數第925行左右doDispatch
Spring MVC入門第1天--架構說明與快速入門
- 在
- 第四步:視圖渲染,将model資料填充到request域。
- 在
992行找到DispatcherServlet.class
函數,并點入render
Spring MVC入門第1天--架構說明與快速入門 - 視圖解析,得到view:
Spring MVC入門第1天--架構說明與快速入門 - 調用view的渲染方法,将model資料填充到request域
Spring MVC入門第1天--架構說明與快速入門 - 渲染方法:
Spring MVC入門第1天--架構說明與快速入門
- 在
入門程式小結
- 通過入門程式了解springmvc前端控制器、處理器映射器、處理器擴充卡、視圖解析器用法。
- 前端控制器配置:
- 第一種:
,通路以.action結尾 由DispatcherServlet進行解析*.action
- 第二種:
,是以通路的位址都由DispatcherServlet進行解析,對于靜态檔案的解析需要配置不讓DispatcherServlet進行解析,使用此種方式可以實作 RESTful風格的url/
- 第一種:
- 處理器映射器:
- 非注解處理器映射器(了解)
- 注解的處理器映射器(掌握)
- 對标記
中辨別有@Controller類
的方法進行映射。在@RequestMapping
裡邊定義映射的url。使用注解的映射器不用在xml中配置url和Handler的映射關系。@RequestMapping
- 處理器擴充卡:
- 非注解處理器擴充卡(了解)
- 注解的處理器擴充卡(掌握)
- 注解處理器擴充卡和注解的處理器映射器是配對使用。了解為不能使用非注解映射器進行映射。
- 實際開發使用:
mvc:annotation-driven