SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

本系列連載技術知識共9期,每1-2日更新一篇~

第一期:MyBatis知識、原始Dao開發和mapper代理開發

第二期:MyBatis全域性配置檔案解析、輸入與輸出對映

第三期:MyBatis動態sql、MyBatis關聯查詢

第四期:MyBatis延遲載入、MyBatis查詢快取

第五期:MyBatis與Spring整合、MyBatis逆向工程

第六期:SpringMVC架構

第七期:如下,enjoy~

1、需求

以案例作為驅動,SpringMVC和MyBatis使用一個案例(商品訂單管理)。

功能需求:商品列表查詢

2、環境準備

資料庫環境:mysql5。6

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

java環境:

jdk1。7

MyEclipse2014

SpringMVC版本:spring3。2

需要spring3。2所有jar(一定要包括spring-webmvc-3。2。0。RELEASE。jar)

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

新建一個web專案,將所需jar包複製至lib下。

3、配置前端控制器

在web。xml中配置前端控制器。

<?xml version=“1。0” encoding=“UTF-8”?> SpringMVC index。jsp <!—— springmvc前端控制器 ——> springmvc org。springframework。web。servlet。DispatcherServlet <!—— contextConfigLocation配置springmvc載入的配置檔案(該配置檔案中配置了處理器對映器、介面卡等等) 如果不配置contextConfigLocation,預設載入的是/WEB-INF/servlet名稱-servlet。xml(即springmvc-servlet。xml) ——> contextConfigLocation classpath:springmvc。xml <!—— 表示servlet隨服務啟動 ——> 1 springmvc <!——Servlet攔截方式 方式一:*。action,訪問以。action結尾由DispatcherServlet進行解析 方式二:/,所有訪問的地址都由DispatcherServlet進行解析,對於靜態檔案的解析需要配置不讓DispatcherServlet進行解析。 使用此方式可以實現RESTful風格的url 方式三:/*,這樣配置不對,使用這種配置,最終要轉發到一個jsp頁面時, 仍然會由DispatcherServlet解析jsp地址,不能根據jsp頁面找到handler,會報錯 ——> *。action

DispathcerServlet作為springmvc的中央排程器存在,DispatcherServlet建立時會預設從DispatcherServlet。properties檔案載入springmvc所用的各個元件,如果在springmvc。xml中配置了元件則以springmvc。xml中配置的為準,DispatcherServlet的存在降低了springmvc各各元件之間的耦合度。

4、配置處理器介面卡

在classpath下的springmvc。xml中配置處理器介面卡。

<!—— 處理器介面卡 所有處理器介面卡都實現HandlerAdapter介面 ——>

透過檢視原始碼:

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

此介面卡能執行實現Controller介面的Handler。

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

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 itemsList=new ArrayList(); 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(); modelAndView。addObject(“itemsList”, itemsList); modelAndView。setViewName(“/WEB-INF/jsp/items/itemsList。jsp”); return modelAndView; }}

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”>查詢商品列表

查詢條件:
商品列表:
商品名稱 商品價格 生產日期 商品描述 操作
${item。name } ${item。price } ${item。detail } 修改

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的包 ——>

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

10、專案部署除錯

將專案部署至Tomcat,訪問http://localhost:8080/SpringMVC/queryItems。action

效果圖:

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

從目前上面的程式碼來看,springmvc中一個類就一個方法,而struts中一個類可以寫多個方法,很不方便。

早期確實是這麼幹的,但是後來SpringMVC提倡用註解開發。

11、非註解的處理器對映器和介面卡

1)非註解的處理器對映器

前面我們配置org。springframework。web。servlet。handler。BeanNameUrlHandlerMapping是非註解的處理器對映器。這種對映器其實有一個問題就是要一個bean裡面配置一個url。

現在我們再配置另一個非註解對映器

org。springframework。web。servlet。handler。SimpleUrlHandlerMapping,它會將url和handler集中進行配置。

<!—— 配置Handler ——> <!—— 配置處理器對映器 將bean的name作為url進行查詢,需要在配置Handler時指定beanname(就是url) ——> <!—— 簡單url對映 simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增強版, 它可以將url和處理器bean的id進行統一對映配置。 ——> <!—— 對ItemsController1進行url對映,url是/queryItems1。action ——> ItemsController1 ItemsController1

疑問:可以同時配置這兩個對映器嗎?

解答:多個對映器可以並存,前端控制器判斷url能讓哪些對映器對映,就讓正確的對映器處理。

2)非註解的處理器介面卡

前面我們配置的org。springframework。web。servlet。mvc。SimpleControllerHandlerAdapter是一個非註解的介面卡。它要求你編寫的Handler要實現Controller介面。

再說另一個非註解的介面卡:

org。springframework。web。servlet。mvc。HttpRequestHandlerAdapter。它要求編寫的Handler實現HttpRequestHandler介面。

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

public class ItemsController2 implements HttpRequestHandler{ @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //呼叫service查詢資料庫,查詢商品列表,這裡使用靜態資料模擬 List itemsList=new ArrayList(); 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); //設定模型資料 request。setAttribute(“itemsList”, itemsList); //設定轉發的檢視 request。getRequestDispatcher(“/WEB-INF/jsp/items/itemsList。jsp”)。forward(request, response); // 從上邊可以看出此介面卡器的handleRequest方法沒有返回ModelAndView,可透過response修改定義響應內容,比如返回json資料:// response。setCharacterEncoding(“utf-8”);// response。setContentType(“application/json;charset=utf-8”);// response。getWriter()。write(“json串”); }}

在springmvc。xml中配置:

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

12、DispatcherServlet.properties

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

前端控制器從上邊的檔案中載入處理對映器、介面卡、檢視解析器等元件,如果不在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)配置註解對映器和介面卡

<!——註解對映器 ——> <!——註解介面卡 ——> <!——使用mvc:annotation-driven代替上邊註解對映器和註解介面卡 配置 mvc:annotation-driven預設載入很多的引數繫結方法, 比如json轉換解析器就預設載入了,如果使用mvc:annotation-driven就不用配置上面的RequestMappingHandlerMapping和RequestMappingHandlerAdapter 實際開發時使用mvc:annotation-driven ——> <!—— ——>

2)開發註解Handler

使用註解的對映器和註解的介面卡。(註解的對映器和註解的介面卡必須配對使用,理解為不能使用非註解對映器進行對映)

/** * 開發註解Handler * 使用@Controller標明它是一個控制器 * @author Joanna。Yan * */@Controllerpublic class ItemsController3{ //商品查詢列表 //@RequestMapping實現對queryItems方法和url進行對映,一個方法對應一個url //一般建議將url和方法名寫成一樣,方便維護 @RequestMapping(“/queryItems”) public ModelAndView queryItems() throws Exception{ //呼叫service查詢資料庫,查詢商品列表,這裡使用靜態資料模擬 List itemsList=new ArrayList(); 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(); modelAndView。addObject(“itemsList”, itemsList); //指定檢視 modelAndView。setViewName(“/WEB-INF/jsp/items/itemsList。jsp”); return modelAndView; } //定義其它方法 //商品新增 //商品修改}

3)在spring容器中載入Handler

<!—— 對於註解的Handler可以單個配置 實際開發中建議使用元件掃描 ——> <!—— ——> <!—— 可以掃描controller、service、。。。 這裡讓掃描controller,指定controller的包 ——>

使用元件掃描器省去在spring容器配置每個controller類的繁瑣。使用自動掃描標記@Controller的控制類。

4) 部署除錯

訪問:http://localhost:8080/SpringMVC/jyqueryItems。action

注意:在測試過程中單個配置註解的Handler執行沒有問題,在配置元件掃描器執行時,啟動Tomcat報錯:

View Code

原因是:我的Tomcat的jdk是1。8,專案的jdk版本是1。7,兩者不一樣造成的。記得要統一版本!

14、前端控制器原始碼分析

透過前端控制器原始碼分析springmvc的執行過程。

第一步:前端控制器接收請求

呼叫doDispatch

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

第二步:前端控制器呼叫處理器對映器查詢Handler

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

第三步:呼叫處理器介面卡執行Handler,得到執行結果ModeAndView

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

第四步:檢視渲染,將model資料填充到request域。

檢視解析,得到view:

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

呼叫view的渲染方法,將model資料填充到request域。

渲染方法:

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

SpringMVC:入門程式從需求到部署除錯多個步驟詳解,附演示案例

15、檢視解析器配置字首和字尾

springmvc。xml中:

<!—— 配置檢視解析器 解析jsp檢視,預設使用jstl標籤,所有classpath下得有jstl的包 ——> <!——配置jsp路徑的字首 ——> <!——配置jsp路徑的字尾 ——>

程式中不用指定字首和字尾:

//指定檢視// modelAndView。setViewName(“/WEB-INF/jsp/items/itemsList。jsp”); //下邊的路徑,如果在檢視解析器中配置jsp路徑的字首和jsp路徑的字尾,修改為 modelAndView。setViewName(“items/itemsList”);

更多幹貨陸續更新,請保持關注。

覺得有用,請順手 轉發 或給 優妹兒 點個贊哦!