文檔版本 | 開發工具 | 測試平臺 | 工程名字 | 日期 | 作者 | 備註 |
---|---|---|---|---|---|---|
V1.0 | 2016.06.29 | lutianfei | none |
- 內容安排:
- 第一天: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配置、註解進行查找
- 第三步:
HandlerMapping處理器映射器
根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(即HandlerExecutionChain執行鏈
)並返回給DispatcherServlet前端控制器
。 - 第四步:
DispatcherServlet前端控制器
通過HandlerAdapter處理器適配器
調用Handler處理器
- 第五步:
HandlerAdapter處理器適配器
去執行Handler處理器
(Controller,也叫後端控制器)。 - 第六步:
Handler處理器
執行完成給HandlerAdapter處理器適配器
返回ModelAndView - 第七步:
HandlerAdapter處理器適配器
將Handler處理器
執行結果ModelAndView返回給DispatcherServlet前端控制器
ModelAndView
是springmvc框架的一個底層對象,包括 Model和view
- 第八步:
DispatcherServlet前端控制器
將ModelAndView傳給ViewReslover視圖解析器
- 根據邏輯視圖名解析成真正的視圖(jsp)
- 第九步:
ViewReslover視圖解析器
向DispatcherServlet前端控制器
返回View - 第十步:
DispatcherServlet前端控制器
對View進行渲染視圖(即將模型數據填充至視圖中)。
- 視圖渲染將模型數據(在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、
視圖View
(需要程序員開發jsp)- 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)
配置前端控制器
- 在web.xml中配置前端控制器。
配置處理器適配器
- 在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(6000f);
items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");
Items items_2 = new Items();
items_2.setName("蘋果手機");
items_2.setPrice(5000f);
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頁面
配置Handler
- 將編寫Handler在spring容器加載(springmvc.xml)。
配置處理器映射器
- 在classpath下的springmvc.xml中配置處理器映射器
配置視圖解析器
- 需要配置解析jsp的視圖解析器。
部署調試
處理器映射器根據url找不到Handler,報下邊的錯誤。說明url訪問地址錯誤。
處理器映射器根據url找到了Handler,轉發的jsp頁面找到,報下邊的錯誤,說明jsp頁面地址錯誤了。
- 修改
ItemsController1.java
文件中的modelAndView指定的視圖地址即可。
非註解的處理器映射器 和 適配器
非註解的處理器映射器
- 上面入門所用的處理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
問題:url配置是在bean中完成的
url和handler集中配置的映射器(簡單映射器):
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
結論:多個映射器可以並存,前端控制器判斷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 中
前端控制器從上邊的文件中加載處理映射器、適配器、視圖解析器等組件,如果不在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
代替上邊註解映射器和註解適配器配置
mvc:annotation-driven
默認加載很多的參數綁定方法,比如json轉換解析器就默認加載了,如果使用mvc:annotation-driven
不用配置上邊的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
//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(6000f);
items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");
Items items_2 = new Items();
items_2.setName("蘋果手機");
items_2.setPrice(5000f);
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>
視圖解析器配置前綴和後綴
<!-- 視圖解析器
解析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
- 在
doDispatch
方法的第896行找到getHandler()函數並進入HandlerExcecutionChain
- 繼續進入下一層
getHandler
函數,找到最終的HandlerExcecutionChain
定義
- 在
第三步:調用處理器適配器執行Handler,得到執行結果ModelAndView
- 在
doDispatch
函數第925行左右
- 在
第四步:視圖渲染,將model數據填充到request域。
- 在
DispatcherServlet.class
992行找到render
函數,並點入
- 視圖解析,得到view:
- 調用view的渲染方法,將model數據填充到request域
- 渲染方法:
- 在
入門程序小結
通過入門程序理解springmvc前端控制器、處理器映射器、處理器適配器、視圖解析器用法。
前端控制器配置:
- 第一種:
*.action
,訪問以.action結尾 由DispatcherServlet進行解析 - 第二種:
/
,所以訪問的地址都由DispatcherServlet進行解析,對於靜態文件的解析需要配置不讓DispatcherServlet進行解析,使用此種方式可以實現 RESTful風格的url
- 第一種:
處理器映射器:
- 非註解處理器映射器(瞭解)
- 註解的處理器映射器(掌握)
- 對標記
@Controller類
中標識有@RequestMapping
的方法進行映射。在@RequestMapping
裏邊定義映射的url。使用註解的映射器不用在xml中配置url和Handler的映射關係。
處理器適配器:
- 非註解處理器適配器(瞭解)
- 註解的處理器適配器(掌握)
- 註解處理器適配器和註解的處理器映射器是配對使用。理解爲不能使用非註解映射器進行映射。
- 實際開發使用:
mvc:annotation-driven