本系列連載技術知識共9期,每1-2日更新一篇~
第一期:MyBatis知識、原始Dao開發和mapper代理開發
第二期:MyBatis全域性配置檔案解析、輸入與輸出對映
第三期:MyBatis動態sql、MyBatis關聯查詢
第四期:MyBatis延遲載入、MyBatis查詢快取
第五期:MyBatis與Spring整合、MyBatis逆向工程
第六期:SpringMVC架構
第七期:如下,enjoy~
1、需求
以案例作為驅動,SpringMVC和MyBatis使用一個案例(商品訂單管理)。
功能需求:商品列表查詢
2、環境準備
資料庫環境:mysql5。6
java環境:
jdk1。7
MyEclipse2014
SpringMVC版本:spring3。2
需要spring3。2所有jar(一定要包括spring-webmvc-3。2。0。RELEASE。jar)
新建一個web專案,將所需jar包複製至lib下。
3、配置前端控制器
在web。xml中配置前端控制器。
<?xml version=“1。0” encoding=“UTF-8”?>
DispathcerServlet作為springmvc的中央排程器存在,DispatcherServlet建立時會預設從DispatcherServlet。properties檔案載入springmvc所用的各個元件,如果在springmvc。xml中配置了元件則以springmvc。xml中配置的為準,DispatcherServlet的存在降低了springmvc各各元件之間的耦合度。
4、配置處理器介面卡
在classpath下的springmvc。xml中配置處理器介面卡。
透過檢視原始碼:
此介面卡能執行實現Controller介面的Handler。
5、開發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
6、檢視編寫
建立/WEB-INF/jsp/order/itemsList。jsp檢視頁面。
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%><%@ taglib uri=“http://java。sun。com/jsp/jstl/core” prefix=“c” %><%@ taglib uri=“http://java。sun。com/jsp/jstl/fmt” prefix=“fmt”%><!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4。01 Transitional//EN” “http://www。w3。org/TR/html4/loose。dtd”>
7、配置Handler
在spring容器中(springmvc。xml)載入編寫的Handler。
<!—— 配置Handler ——>
8、配置處理器對映器
在classpath下的springmvc。xml中配置處理器對映器。
<!—— 配置處理器對映器 將bean的name作為url進行查詢,需要在配置Handler時指定beanname(就是url) ——>
9、配置檢視解析器
需要在springmvc。xml中配置解析jsp的檢視解析器。
<!—— 配置檢視解析器 解析jsp檢視,預設使用jstl標籤,所有classpath下得有jstl的包 ——>
10、專案部署除錯
將專案部署至Tomcat,訪問http://localhost:8080/SpringMVC/queryItems。action
效果圖:
從目前上面的程式碼來看,springmvc中一個類就一個方法,而struts中一個類可以寫多個方法,很不方便。
早期確實是這麼幹的,但是後來SpringMVC提倡用註解開發。
11、非註解的處理器對映器和介面卡
1)非註解的處理器對映器
前面我們配置org。springframework。web。servlet。handler。BeanNameUrlHandlerMapping是非註解的處理器對映器。這種對映器其實有一個問題就是要一個bean裡面配置一個url。
現在我們再配置另一個非註解對映器
org。springframework。web。servlet。handler。SimpleUrlHandlerMapping,它會將url和handler集中進行配置。
<!—— 配置Handler ——>
疑問:可以同時配置這兩個對映器嗎?
解答:多個對映器可以並存,前端控制器判斷url能讓哪些對映器對映,就讓正確的對映器處理。
2)非註解的處理器介面卡
前面我們配置的org。springframework。web。servlet。mvc。SimpleControllerHandlerAdapter是一個非註解的介面卡。它要求你編寫的Handler要實現Controller介面。
再說另一個非註解的介面卡:
org。springframework。web。servlet。mvc。HttpRequestHandlerAdapter。它要求編寫的Handler實現HttpRequestHandler介面。
public class ItemsController2 implements HttpRequestHandler{ @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //呼叫service查詢資料庫,查詢商品列表,這裡使用靜態資料模擬 List
在springmvc。xml中配置:
12、DispatcherServlet.properties
前端控制器從上邊的檔案中載入處理對映器、介面卡、檢視解析器等元件,如果不在springmvc。xml中配置,則使用預設載入的。
13、註解的處理器對映器和介面卡
在spring3。1之前使用org。springframework。web。servlet。mvc。annotation。DefaultAnnotationHandlerMapping註解對映器。
在spring3。1之後使用org。springframework。web。servlet。mvc。method。annotation。RequestMappingHandlerMapping註解對映器。
在spring3。1之前使用org。springframework。web。servlet。mvc。annotation。AnnotationMethodHandlerAdapter註解介面卡。
在spring3。1之後使用org。springframework。web。servlet。mvc。method。annotation。RequestMappingHandlerAdapter註解介面卡。
1)配置註解對映器和介面卡
<!——註解對映器 ——>
2)開發註解Handler
使用註解的對映器和註解的介面卡。(註解的對映器和註解的介面卡必須配對使用,理解為不能使用非註解對映器進行對映)
/** * 開發註解Handler * 使用@Controller標明它是一個控制器 * @author Joanna。Yan * */@Controllerpublic class ItemsController3{ //商品查詢列表 //@RequestMapping實現對queryItems方法和url進行對映,一個方法對應一個url //一般建議將url和方法名寫成一樣,方便維護 @RequestMapping(“/queryItems”) public ModelAndView queryItems() throws Exception{ //呼叫service查詢資料庫,查詢商品列表,這裡使用靜態資料模擬 List
3)在spring容器中載入Handler
<!—— 對於註解的Handler可以單個配置 實際開發中建議使用元件掃描 ——> <!——
使用元件掃描器省去在spring容器配置每個controller類的繁瑣。使用
4) 部署除錯
訪問:http://localhost:8080/SpringMVC/jyqueryItems。action
注意:在測試過程中單個配置註解的Handler執行沒有問題,在配置元件掃描器執行時,啟動Tomcat報錯:
View Code
原因是:我的Tomcat的jdk是1。8,專案的jdk版本是1。7,兩者不一樣造成的。記得要統一版本!
14、前端控制器原始碼分析
透過前端控制器原始碼分析springmvc的執行過程。
第一步:前端控制器接收請求
呼叫doDispatch
第二步:前端控制器呼叫處理器對映器查詢Handler
第三步:呼叫處理器介面卡執行Handler,得到執行結果ModeAndView
第四步:檢視渲染,將model資料填充到request域。
檢視解析,得到view:
呼叫view的渲染方法,將model資料填充到request域。
渲染方法:
15、檢視解析器配置字首和字尾
springmvc。xml中:
<!—— 配置檢視解析器 解析jsp檢視,預設使用jstl標籤,所有classpath下得有jstl的包 ——>
程式中不用指定字首和字尾:
//指定檢視// modelAndView。setViewName(“/WEB-INF/jsp/items/itemsList。jsp”); //下邊的路徑,如果在檢視解析器中配置jsp路徑的字首和jsp路徑的字尾,修改為 modelAndView。setViewName(“items/itemsList”);
更多幹貨陸續更新,請保持關注。
覺得有用,請順手 轉發 或給 優妹兒 點個贊哦!