2.SpringMVC介紹 2.1.SpringMVC是什么 SpringMVC是Spring組織下的一個表現層框架,和Struts2一樣,它是Spring框架組織下的一部分,我們可以從Spring的整體結構中看得出來: 2.2.SpringMVC的作用 1.接收Web請求中的引數 2.把處理好的資料回傳給頁面 2.3.為什么要學習SpringMVC 技術是要更新換代的,可以說Springmvc是對Struts2的技術更新,Struts2太老了,許多設計已經過時,效率不符合現在業務(互聯網)的需要,而且SpringMVC與Spring是一家的它們之間的銜接是無縫的,所以使用SpringMVC更方便和Spring進行整合, 更重要的一點是Struts2存在安全漏洞,之前的某些版本曾經造成過一些企業的損失,這也加速了Struts2的迅速老去, 那為什么之前還要學習Struts2呢?是因為今后作業中不一定都是從事新的系統開發,你有可能去維護一個已經上線的老系統,比如許多傳統行業里面應用的系統Struts2的使用率仍然不小,因此從學習的角度Struts2也要學習掌握, 2.4.了解SpringMVC的處理流程 要想引入SpringMVC做表現層開發,最基本的需要完成兩件事: 1. 配置好前端控制器DispatcherServlet, 2. 開發后端控制器并在SpringMVC的組態檔中加入企業級的配置, 3.SpringMVC環境搭建及入門程式 3.1.軟體環境 Jdk:jdk1.7.0_72 Eclipse:mars Tomcat:apache-tomcat-7.0.53 Springmvc:4.1.3 說明: 作為本課練習對jdk,eclipse版本的要求不嚴格, 但在實際專案中團隊的開發版本是有嚴格要求的,最新版本不代表是最好的,實際專案都選用最穩定的版本, 3.2.環境搭建 3.2.1.第一步:創建一個java web工程(UTF-8)并匯入jar包 1.創建一個java web工程 2.匯入jar包 在web工程中拷貝到lib檔案夾下的jar包可以自動被匯入工程 spring原生jar包: Spring常用依賴jar包: 3.2.2.第二步:配置前端控制器 【web.xml】是整個web請求的入口組態檔 <說明> ·前端控制器: org.springframework.web.servlet.DispatcherServlet,它是SpringMVC接收web請求的第一入口,也是唯一入口,這是一個servlet物件,因此需要在web.xml中進行配置, ·<load-on-startup>:此項配置是控制當前servlet是否隨tomcat啟動而被加載 配置的值必須是整數 值 >= 0:表示當前servlet隨著tomcat啟動而被加載,值的大小表示加載的順序,越小越優先 值 < 0:表示當前servlet不會隨著tomcat啟動而被加載,只有當它被使用的時候才加載, DispatcherServlet啟動后會立刻去找SpringMVC的組態檔,然后根據組態檔中的內容進行加載和掃描 ·<init-param>: 用這個標簽加載SpringMVC組態檔,意義就是在DispatcherServlet的初始化程序中加載組態檔, <param-name>為【contextConfigLocation】 <param-value>為【classpath:SpringMVC組態檔的類目錄下的相對路徑】 ·SpringMVC默認組態檔: 如果沒有顯示的配置SpringMVC的核心組態檔,SpringMVC會去[/WEB-INF/]下找默認的核心組態檔,默認核心組態檔的命名:servlet-name的值 + -servlet.xml,在實際作業中要知道:當發現web.xml沒有配置核心組態檔時要知道去[/WEB-INF/]下找它的默認組態檔, 因為各種框架的默認組態檔的位置可能不同,所以企業很少采用默認的組態檔路徑,因此我們需要統一規劃組態檔的存放位置,通過手動配置完成組態檔的加載, ·常用URL樣式: [/*]: SpringMvc禁止使用,不支持, [*.action]: 以.action為結尾的url地址請求可以進入DispatcherServlet, 放行所有資源檔案后綴的url, [/]: 所有url地址請求均可進入DispatcherServlet, 但只放行以.jsp為結尾的url,其他資源檔案后綴的url都不放行(這個明天的RESTful的時候會具體用到, 今天先不講) 資源檔案請求url: <link href="https://www.cnblogs.com/haizai/p/css/bootstrap.min.css" rel="stylesheet"> <script src="https://www.cnblogs.com/haizai/p/https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>springmvc</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置springmvc前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置SpringMVC的組態檔 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMvc.xml</param-value> </init-param> <!-- 配置DispacherServlet隨tomcat啟動而被加載 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 配置什么樣的url路徑可以進入DispatcherServlet --> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app> 3.2.3.第三步:創建springmvc核心組態檔 新建一個source folder: config 在config下創建一個xml檔案: SpringMvc.xml,檔案頭可以從其他地方直接拷貝過來, <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> </beans> 3.2.4.第四步:啟動tomcat測驗環境 到此為止SpringMvc基本框架搭建完成,啟動tomcat,日志中不報錯,就說明環境搭建成功, 下面就是入門程式的開發, 3.3.案例需求 3.3.1.需求 使用SpringMVC實作商品串列的展示, 3.3.2.需求分析 1.要展示全部商品串列,所以不需要引數,請求url: http://localhost:8080/<具體web應用的名字>/list.action 2.主要關注SpringMvc的入門程式,所以暫不考慮連接資料庫等多余功能,在業務處理中只做假的模擬資料回傳給頁面, 3.4.入門程式 3.4.1.第一步:創建jsp頁面 創建jsp頁面的目錄: 前端頁面不是本課內容,參考: 參考資料\參考案例\jsp\itemList.jsp直接拷貝到工程jsp目錄中, 問題:放在WebContent目錄下和放到WEB-INFO目錄下的區別? WEB-INFO是受tomcat保護目錄,它里面的檔案只能由servlet去訪問,不能通過url地址欄去請求訪問, WebContent下的檔案可以直接通過url地址欄去訪問,一般的歡迎頁和靜態資源檔案都放在這里, 3.4.2.第二步:創建和配置后端控制器 創建包: cn.baidu.controller用于存放后端控制器,cn.baidu.pojo用于存放保存回傳資料的bean 創建后端控制器類: <說明> ·@Controller:表明用這個注解修飾的類需要SpringMVC掃描成SpringMVC的組件, package cn.baidu.controller; import org.springframework.stereotype.Controller; // 定義一個java類,@Controller注解標注在類定義的上方表明這個類需要SpringMVC掃描, @Controller public class ItemsController { } 在SpringMvc.xml中配置后端控制器類的掃描 <說明> <context:component-scan base-package="要掃描的包路徑" /> 掃描指定包及子包下的@Controller、@Service、@Repository等注解修飾的java類, 其中在SpringMVC組態檔中只掃描@Controller修飾的類所在的包,并注冊為SpringMVC的組件, 其它注解修飾的類在Spring組態檔中掃描,并注冊為Spring的組件, <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置SpringMVC下Controller類的掃描 --> <context:component-scan base-package="cn.baidu.controller" /> </beans> 注意: 如果想掃描多個包,可以配置多個<context:component-scan base-package="指定的包名" /> 3.4.3.第三步:撰寫方法回應url請求 注解型別的Controller類中使用@RequestMapping注解修飾的方法回應url請求,一個url對應一個方法,不可能多個url同時對應一個方法,也不可能多個方法同時回應一個url請求, <說明> ·@RequestMapping(“具體URL”): 指明這個方法回應的具體url是什么,這里面配置的url是工程名后的具體url,以【/】開頭,如果不寫【/】也可以,推薦寫, @RequestMapping(“具體URL”)和它修飾的方法就形成一對key/value,key就是URL,value就是由注解修飾的方法包裝在handler物件中(handler是SpringMVC內置的專門用來封裝url請求回應方法的物件),最終再把這些key/value放到一個map物件中保存, ·Model: 模型物件,是SpringMVC默認支持的一種形參型別, 作用:負責將回傳給頁面的資料賦值給request物件(這個賦值的程序是SpringMVC底層做的,將你賦給Model物件的屬性名和值賦給request物件,這個詳細程序不需要我們掌握它的詳細邏輯,理解一下即可,) 這樣JSP就可以用EL運算式從request物件中取得這個屬性名的資料了, ·記住:對于jsp永遠都是從request物件中通過屬性名取值, package cn.baidu.controller; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import cn.baidu.pojo.Items; // 定義一個java類,@Controller注解標注在類定義的上方表明這個類需要SpringMVC掃描, @Controller public class ItemsController { // 標注url到請求方法的key/value對應關系 @RequestMapping("/list") public String list(Model model) throws Exception { //商品串列(臨時資料) List<Items> itemsList = new ArrayList<Items>(); Items items1 = new Items(); items1.setName("聯想筆記本"); items1.setPrice(6000f); items1.setDetail("ThinkPad T430 聯想筆記本電腦!"); Items items2 = new Items(); items2.setName("蘋果手機"); items2.setPrice(5000f); items2.setDetail("iphone6蘋果手機!"); itemsList.add(items1); itemsList.add(items2); // 1. 設定回傳給頁面的資料 // 第一個引數是屬性名稱, 第二個引數是屬性值 //model在SpringMVC底層是將它里面的屬性名和屬性值賦值給了request物件,而jsp頁面通過request域進行取值 model.addAttribute("itemList", itemsList); //簡化完的剩余的字串叫做視圖的邏輯視圖名 //視圖的物理路徑 = 前綴 + 邏輯視圖名 + 后綴. return "itemList"; model.addAttribute("itemsList", itemsList); // 2. 指定回傳頁面的地址 return "/WEB-INF/jsp/itemList.jsp"; } } 回傳的頁面是否存在、是否正確都需要先判斷一下,在SpringMVC中使用一個視圖決議器的組件來做這些處理, 配置視圖決議器:在SpringMVC.xml中配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置指定包下的組件掃描 --> <context:component-scan base-package="cn.baidu.controller" /> <!-- 配置視圖決議器 --> <bean > </bean> </beans> 3.4.4.第四步:啟動tomcat測驗 訪問地址: http://localhost:8080/springmvc/list.action 3.4.5.第五步:優化方法的回傳路徑 上面直接回傳jsp的路徑倒是很直接,但是每個方法都回傳一長串路徑看著有點亂,而且每個方法回傳的路徑中【/WEB-INF/jsp/】和【.jsp】都是重復的,未免顯得有些冗余, 能否將這些重復的部分提取出來放到SpringMVC的組態檔中呢?答案是肯定的——修改視圖決議器的配置: 【SpringMVC.xml】中配置視圖決議器的前綴和后綴專門用來拼接視圖檔案的路徑: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置指定包下的組件掃描 --> <context:component-scan base-package="cn.baidu.controller" /> <!-- 配置視圖決議器 --> <bean > <!-- 前綴 --> <property name="prefix" value="https://www.cnblogs.com/WEB-INF/jsp/" /> <!-- 后綴 --> <property name="suffix" value="https://www.cnblogs.com/haizai/p/.jsp" /> </bean> </beans> 說明: 1.作用: 用視圖決議器中配置的前綴和后綴簡化Controller類中的編碼 2.代碼的簡化: ······ // 2. 指定回傳頁面的地址 return "itemList"; ······ 3.邏輯視圖名與視圖檔案物理路徑 簡化后Controller方法中回傳的字串叫做邏輯視圖名, 視圖檔案物理路徑=前綴 + 邏輯視圖名 + 后綴, SpringMVC能保證每次回傳的字串都會自動走視圖決議器,然后按照上面的方式拼接,再進行后續處理, 3.5.本節總結 本單元內容主要是搭建了一個SpringMVC開發環境并學習了它的入門程式, 這個開發環境只有SpringMVC,所以不是我們正式的環境,了解即可,不重要, 入門程式中學習到的兩個注解@Controller和@RequestMapping用法以及回傳資料和回傳頁面的處理方式要掌握, <!-- 配置后端控制器的掃描 --> <!-- 這個標簽可以掃描的注解 : @Controller , @Service, @Repository,這是前三個的父注解@Compontent --> <context:component-scan base-package="cn.baidu.controller"></context:component-scan> <!-- 顯示配置處理器映射器和處理器配接器 --> <!-- 默認形式的處理器映射器和處理器配接器 : 默認的組件是不推薦使用的,因為它們是舊版 DefaultAnnctationHandlerMapping和AnnotationMethodHandlerAdapter --> <!-- 配置當前版本下最新的注解形式的處理器映射器和處理器配接器 : 雖然是最新的,但是一旦版本變更可能會引起新的修改--> <!-- <bean /> <bean /> --> <!-- 企業中系統一勞永逸的方式 : 注解驅動方式 --> <!-- 作用 : 會加載當前版本下最新的注解形式的處理器映射器和處理器配接器,能提高執行效率 --> <mvc:annotation-driven/> <!-- 配置視圖決議器 --> <!-- 這個視圖決議器就是用來決議jsp頁面的,也是springmvc默認的視圖決議器 --> <bean > <!-- 配置前綴和后綴為了簡化開發 --> <property name="prefix" value="https://www.cnblogs.com/WEB-INF/jsp/"></property> <!-- 配置后綴 --> <property name="suffix" value="https://www.cnblogs.com/haizai/p/.jsp"></property> </bean> 4.SpringMVC框架 4.1.框架結構(重點) 1.學習框架結構的目的: 開發不用, 但面試時會問到 2.框架結構詳細內容:(面試題) 說明:前端控制器是接收web請求的入口,地位最重要,如果還要做其他具體的作業會使它的負擔過于繁重,因此SpringMVC找來了四個幫手,叫做四個組件,來幫助前端控制器承擔一些具體的作業,這樣前端控制器就只發號司令做為集中控制調度中心,具體的作業交給四個組件來完成, 具體作業分為兩部分: 1.處理請求:兩個組件,一個來找Handler,一個來執行Handler 1)處理器映射器負責找到URL對應的Handler物件 2)處理器配接器負責執行找到的Handler物件, 2.回傳結果:兩個組件,一個來找頁面,一個來執行頁面渲染 1)視圖決議器負責找到要回傳的頁面 2)視圖物件負責渲染頁面,渲染頁面需要的資料由前端控制器傳給它, ●啥是freemaker? 就是模版, 通過模版和資料生成輸出的文本(HTML網頁, 電子郵件等). 比如網易首頁點擊進入的一個html頁面, 這些靜態的html都是由freemarker生成的, 而struts2只支持jsp. 4.2.框架流程 1.用戶發送請求至前端控制器DispatcherServlet 2.DispatcherServlet收到請求呼叫HandlerMapping處理器映射器, 3.處理器映射器根據請求url找到具體的處理器,生成處理器物件及處理器攔截器(如果有則生成)一并回傳給DispatcherServlet 4.DispatcherServlet通過HandlerAdapter處理器配接器呼叫處理器 5.執行處理器(handler也叫后端控制器-->Service-->DAO) 6.Handler執行完成回傳ModelAndView 7.HandlerAdapter將handler執行結果ModelAndView回傳給DispatcherServlet 8.DispatcherServlet將ModelAndView傳給ViewReslover視圖決議器 9.ViewReslover根據handler中設定的頁面資訊決議成一個View視圖物件并回傳它. 10.DispatcherServlet呼叫View物件的介面方法對實際的視圖檔案(如: jsp檔案)進行渲染(即將模型資料填充至視圖檔案中) 11.DispatcherServlet回應用戶 口述 : 先掃描@Controller修飾的類 打開這個類找出里面所有由@Requestmapping修飾的方法 通過反射得到這個方法的method物件 把method物件封裝到一個handler物件中(handlder是SpringMVC內置的物件用來統一呼叫方法的) 最終把RequestMapping中配置的url作為key,把handler物件作為value放到一個map物件中 這個map物件由處理器映射器來維護 4.3.需要認識的SpringMVC組件 SpringMVC的整個控制層采用組件式的結構, SpringMVC的組件有: 前端控制器DispatcherServlet、 處理器Handler(相對于前端控制器的后端控制器)、 處理器映射器HandlerMapping、 處理器配接器HandlerAdapter、 視圖物件View、 視圖決議器ViewResolver, 其中HandlerMapping、HandlerAdapter、ViewResolver是springmvc的三大核心組件,Handler涉及具體業務需要程式員實作,View由ViewResolver生成,負責渲染頁面, 三大組件干的事情其實都可以集中交給DispatcherServlet來干,但都交給它會使它過于臃腫,處理效率會大大降低,因此分而治之才是上策, 4.3.1.DispatcherServlet:前端控制器 DispatcherServlet負責接收用戶請求,是整個流程的控制中心,但它幾乎不做任何具體的作業,只進行任務調度,具體的作業由具體的組件來完成,這就是組件式結構的優勢,專項事情又專門的組件來做,這樣能提高專項的處理能力同時集中調度的存在降低了組件之間的耦合性, 4.3.2.Handler:處理器 在DispatcherServlet的控制下Handler對具體的用戶請求進行處理, 由于Handler涉及到具體的用戶業務請求,所以一般情況需要程式員根據業務需求開發Handler, 4.3.3.HandlerMapping: 處理器映射器 HandlerMapping負責為每個請求找到一個合適的處理器handler,其實簡單來說就是維持了一個url到handler的映射Map,springmvc提供了不同的映射器,實作不同的映射方式,例如:組態檔方式,實作介面方式,注解方式等, 比如注解方式的映射器會根據核心組態檔中配置的<context:component-scan base-package="包路徑" />指定的包路徑(包括子目錄)進行掃描,找@Controller標注的Java類,該類中所有使用@RequestMapping修飾的方法都是一個handler物件,并根據@RequestMapping的值作為key,對應的方法的handler物件作為value,形成一個url到方法的k/v鍵值對映射,而且這種掃描只要在tomcat啟動時做一次,不會影響系統的性能, 4.3.4.HandlerAdapter: 處理器配接器 1.什么是配接器: 2.配接器的作用:統一呼叫介面,好擴展, 3.Springmvc中的處理器配接器: 處理器配接器HandlerAdapter負責執行具體的處理器, SpringMVC有多個配接器,當HandlerMapping找到了url對應的handler物件后,前端控制器會挑選一個能夠執行這個handler的處理器配接器,然后給這個配接器發送指令,同時把這個handler物件傳給這個配接器,讓它執行handler,最終將handler的回傳值和邏輯視圖名字串回傳給前端控制器, 4.3.5.ViewResolver: 視圖決議器 視圖決議器(ViewResolver)負責決議出視圖檔案的物理路徑,并根據這個路徑生成視圖View物件, ViewResolver首先把邏輯視圖名決議成實際的頁面位置,再生成視圖View物件并回傳給前端控制器, 4.3.6.View:視圖物件型別 1.View視圖物件 View物件負責渲染視圖檔案,將資料結果通過視圖檔案展示給用戶,前端控制器呼叫View物件的介面方法render(),引數就是后臺回傳的資料,在render方法拿資料渲染視圖檔案生成回傳給客戶端的結果, springmvc框架提供了很多的View型別,包括:jstlView、freemarkerView、pdfView等, 2.視圖檔案 視圖檔案可以是jsp、pdf、freemaker等,最常用的就是jsp,一般情況下需要通過頁面jsp標簽或頁面模版將處理器回傳的model資料通過頁面展示給用戶,需要由程式員根據業務需求開發具體的頁面, 4.3.7.組件總結 SpringMVC的三大組件(理解記憶):處理器映射器、處理器配接器、視圖決議器 需要程式員撰寫代碼的有:處理器(包括處理器、具體業務的service和dao)、視圖檔案(jsp) 4.4.SpringMvc三大組件的配置 Springmvc三大組件配置在核心組態檔中,springmvc支持組件免配置、顯示配置和企業的配置方法 4.4.1.組件的免配置 1.何為免配置: 即什么都不配,此時SpringMVC仍然可以正常運行,全憑它自己的DispatcherServlet.properties,會從中找到合適的組件去執行,這個屬性檔案的位置: 2.DispatcherServlet.properties的作用: 如果沒有顯示配置三大組件(其中一個或者全部),依靠這個屬性檔案中的默認配置組件,springmvc也能正確的執行, 3.上面的入門程式中自動選擇的三大組件分別是: a)處理器映射器 b)處理器配接器 c)視圖決議器 默認的視圖決議器只有一個, 4.壞處: 每次請求都要去這里去找合適的組件,所以執行效率很低,因此什么都不配置是不可取的,需要我們顯示配置來提高執行效率, 4.4.2.SpringMvc顯式配置處理器映射器和處理器配接器 1.顯式配置默認選擇的處理器映射器和處理器配接器(舊版) 2.顯式配置官方推薦的處理器映射器和處理器配接器(新版) 3.企業中的配置方法:注解驅動 作用:幫助我們顯式配置當前Spring版本的最新的注解形式的處理器映射器和處理器配接器 好處:簡化配置,一勞永逸 4.面試題: springmvc是否要配置注解驅動和注解掃描? 有什么區別? 答: 都需要配置,兩個東西的作用完全不一樣,不要混淆視聽, 注解驅動:作用就是替我們顯式的配置當前spring版本下最新版本的注解形式的處理器映射器和處理器 配接器 注解掃描:掃描指定包及子包下的@Controller、@Service、@Repository等注解修飾的java類,其 中@Controller修飾的類注冊為SpringMVC的組件,其它注解修飾的類注冊為Spring的 組件, 4.4.3.SpringMvc顯式配置視圖決議器 前面已經學過,此處只給出配置的例子, 4.4.4.顯示配置的意義 處理器映射器、配接器:提高執行效率 視圖決議器(有前綴和后綴):簡化編碼 4.5.本節重點 掌握: SpringMVC的框架流程,能說出來從請求到回傳頁面的處理流程; SpringMVC三大組件的最終形態的顯示配置方法, 理解: 三大核心組件的功能, 了解: Springmvc默認組件配置; 單獨配置新版的處理器映射器和處理器配接器, 下面是完整的springmvc核心組態檔的配置:SpringMVC.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置指定包下的組件掃描 --> <!-- 作用:SpringMVC可以自動去掃描指定包以及子包下的java檔案,如果掃描到有@Controller(控制層的類) @Service(業務層的類) @Repository(資料庫訪問層的類)這些注解修飾的類,則把這些類注冊為 SpringMVC的組件 --> <context:component-scan base-package="cn.baidu.controller" /> <!-- 1. SpringMVC默認的三大組件選擇(處理器映射器、處理器配接器、視圖決議器) 如果沒有顯示的配置三大組件,SpringMVC也能正常執行,是因為會默認去找SpringMVC的默認 屬性檔案DispatcherServlet.properties,從中找到合適的三大組件去執行,但這種方式在么次 請求的時候都會去找一遍,所以效率很低,因此采用默認的三大組件選擇是不可取的, 我們應該顯示的配置它們,這樣可以提高系統的訪問效率, --> <!-- 2. 顯示的配置處理器映射器和處理器配接器 --> <!-- 默認的注解形式的處理器映射器:老版本,不推薦使用 --> <!-- <bean /> --> <!-- 默認的注解形式的處理器配接器:老版本,不推薦使用 --> <!-- <bean /> --> <!-- 當前最新版本的注解形式的處理器映射器 --> <!-- <bean /> --> <!-- 當前最新版本的注解形式的處理器配接器 --> <!-- <bean /> --> <!-- 3. 企業中配置注解形式的處理器映射器和處理器配接器的方法:注解驅動 --> <!-- 作用:顯示的配置了當前Spring版本下最新的注解形式的處理器映射器和處理器配接器,由于它 沒有和任何class關聯,所以即使Spring版本升級,該項配置也不會發生任何改動,企業中 喜歡采用這種一勞永逸的方法, --> <mvc:annotation-driven /> <!-- 配置視圖決議器 --> <!-- 作用:利用顯示配置視圖決議器中的前綴和后綴可以簡化Controller方法中的視圖資訊的設定,只需 在setViewName方法中設定邏輯視圖名稱(視圖檔案的名稱,比如jsp檔案)即可,每次視圖解 析器都會自動的進行視圖檔案物理路徑的拼接:前綴 + 邏輯視圖名稱 + 后綴,從而方便了我們的 編碼作業, --> <bean > <!-- 前綴 --> <property name="prefix" value="https://www.cnblogs.com/WEB-INF/jsp/" /> <!-- 后綴 --> <property name="suffix" value="https://www.cnblogs.com/haizai/p/.jsp" /> </bean> </beans> 5.SSM整合 5.1.SSM整合包含的框架 5.2.SSM整合思路 5.2.1.整合思路的重要性 整合的步驟是固定的, 程序是可以復制的, 人家告訴我們怎么整合就怎么來做就可以了. 具體來說, 第一是你手頭有現成的資料照著做即可; 第二如果你沒有資料, 怎么辦? 這時候如果能記住思路, 我們就可以上網去找資料. 但如果思路記不住就連資料怎么找都不知道了, 所以說思路是很重要的, 要記住. 5.2.2.具體的整合思路(重點) 首先,先劃分大層次,整合后分為三層:表現層 業務層 資料訪問層,再加上web.xml這是整體的骨架; 其次,再逐層規劃每一層具體要干什么, ssm整合的思路如下: Spring與MyBatis的整合在MyBatis第二天的時候已經學習過了,這里仍然沿用,SpringMVC與Spring又是一家的,所以它們之間是不需要整合配置的,即所謂的無縫整合,直接就可以用,只不過需要在web.xml中配置它們兩個,具體規劃如下: SSM整合分三層:DAO層、Service層、Controller層 代碼目錄: ·DAO層: pojo:pojo類 dao:映射檔案、介面檔案——Mybatis逆向工程自動生成,DAO通過SM整合jar包來掃描 ·Service層: service:service介面和實作類——利用@Service注解修飾,讓spring來掃描 ·Controller層: controller:Controller類及方法——利用@Controller注解修飾,讓SpringMVC來掃描 配置目錄: ·config: MyBatisConfig.xml——MyBatis配置 ApplicationContext-dao.xml——資料源、連接池、會話工廠、mapper包掃描 ApplicationContext-service.xml——注解掃描(service層的組件掃描)、事務管理 (以上兩個組態檔可以配置在一個檔案中,這里為了體現分層的思路所以分開配置,) SpringMVC.xml——注解掃描(Controller層的組件掃描)、注解驅動、視圖決議器 web.xml Spring監聽(管理service層和dao層)、SpringMVC前端控制器(管理Controller層) JSP:在【/WEB-INF/】創建jsp目錄,存放jsp頁面, 面試題:事務配置在哪一層?為什么? 事務配置在service層,因為service層控制的是業務,在一個service中有可能呼叫多個DAO中的方法進行一系列的操作,這些操作要么都成功,要么都失敗,比如匯款,匯出操作成功了,但是存入給另一個人時發現卡被注銷了,這個時候要整個業務回滾,否則錢就會丟失,所以必須在service層做事務控制, 注意: 不要糾結Controller層的類域Service層的類能否放到一個目錄下,這個問題沒有意義,因為分層的意思就是強制將它們分開,Controller層的目錄就放Controller的類,Service層的目錄就放Service的類,DAO層的目錄就放Dao的類, 組態檔是否合并的問題,這個問題也不要糾結,看個人喜好,如果想讓組態檔單一化,就可以把兩個ApplicationContext檔案合并,但SpringMVC.xml與ApplicationContext不要合并,因為前者是表現層由Spring的子集框架SpringMVC專門負責,后者是業務層以及DAO層由Spring本身自己負責, 5.3.軟體環境 Jdk: jdk1.7.0_72 Eclipse: mars Tomcat: apache-tomcat-7.0.53 Springmvc: 4.1.3 MyBatis: mybatis-3.2.7 MySql: 5.1.28 SM整合包: 1.2.2 5.4.資料庫環境 使用【資料\參考案例\sql】下的創建庫建表腳本【springmvc.sql】創建我們使用的資料庫環境, 5.5.SSM整合步驟 5.5.1.第一步: 新建一個web工程 5.5.2.第三步: 匯入jar包 將【資料\jar\ssm整合后jar全集】下的jar包拷貝到WebContent/WEB-INF/lib下, 會自動關聯到工程中 5.5.3.第二步: 創建目錄結構 根據思路創建工程目錄: 1.代碼目錄: cn.baidu包下創建四個子包 controller: 存放cnotroller層的代碼 service : 存放service層的代碼 dao: 存放dao層的代碼 pojo: 存放pojo的代碼 2.組態檔目錄: 選擇工程右鍵創建source folder: config, 用于存放全部組態檔. 3.視圖目錄: 在WebContent/WEB-INF下創建jsp目錄,用于存放jsp檔案. 5.5.4.第四步: 使用mybatis逆向工程生成代碼 1.將【資料\MyBatis逆向工程】下的【MyBatisGeneration】工程匯入eclipse, 2.修改組態檔符合當前的開發環境和目錄結構, a)資料庫名 b)Pojo包名 c)Mybatis映射檔案的包名 d)Mybatis映射介面的包名(與c相等) e)需要生成代碼的資料庫表 3.注意: a)執行前要把原先舊的代碼全部洗掉, b)執行完生成程式后第一次重繪的時候表現出來的包名不對,再重繪一次就好了,這是eclipse的一個bug, 4.將生成的代碼拷貝到我們的工程中去, 5.5.5.第五步: 創建DAO層組態檔 1.在【資料\參考案例\config】下是mybatis課程中sm整合的時候需要的組態檔,整體匯入, 2.整理mybatis的組態檔: a)MyBatisConfig.xml:清空<configuration>標簽內全部的內容,保留一個空的組態檔是為了今后對mybatis的擴展, b)ApplicationContext.xml:保留其中的屬性檔案、資料源(連接池)、會話工廠、動態代理包掃描的配置,其他的都洗掉,根據上面的思路它應該屬于dao層的spring組態檔,改名為ApplicationContext-dao.xml c)其他組態檔保持不變, 3.修改后的組態檔: 【MyBatisConfig.xml】 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 型別別名的配置 --> <!-- <typeAliases> <typeAlias type="cn.baidu.pojo.UserModel" alias="UserModel"/> <package name="cn.baidu.pojo"/> </typeAliases> --> </configuration> 【ApplicationContext-dao.xml】 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 1 屬性檔案的配置 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 2 資料源的配置 --> <bean id="dataSource" destroy-method="close"> <property name="driverClassName" value="https://www.cnblogs.com/haizai/p/${jdbc.driver}"/> <property name="url" value="https://www.cnblogs.com/haizai/p/${jdbc.url}"/> <property name="username" value="https://www.cnblogs.com/haizai/p/${jdbc.username}"/> <property name="password" value="https://www.cnblogs.com/haizai/p/${jdbc.password}"/> <property name="maxActive" value="https://www.cnblogs.com/haizai/p/10" /> <property name="maxIdle" value="https://www.cnblogs.com/haizai/p/5" /> </bean> <!-- 3 MyBatis的會話工廠的配置 --> <bean id="sqlSessionFactory" > <property name="configLocation" value="https://www.cnblogs.com/haizai/p/classpath:MyBatisConfig.xml" /> <property name="dataSource" ref="dataSource" /> </bean> <!-- 4 動態代理包掃描的配置 --> <bean > <property name="basePackage" value="https://www.cnblogs.com/haizai/p/cn.baidu.dao" /> </bean> </beans> 5.5.6.第六步: 創建Service層組態檔 創建【ApplicationContext-service.xml】,@Service注解組件的掃描和事務管理 【ApplicationContext-service.xml】 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- service層的組件掃描 --> <context:component-scan base-package="cn.baidu.service" /> <!-- 事物管理配置 --> <bean id="transactionManager" > <!-- 資料源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- 通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 傳播行為 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.baidu.service.*.*(..))" /> </aop:config> </beans> 5.5.7.第七步: 創建SpringMvc.xml 創建【SpringMvc.xml】,配置@Controller注解組件掃描,注解驅動,視圖決議器 組態檔: 【SpringMvc.xml】 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- controller層的組件掃描 --> <context:component-scan base-package="cn.baidu.controller" /> <!-- 配置注解驅動 --> <mvc:annotation-driven /> <!-- 配置視圖決議器 --> <bean > <!-- 前綴 --> <property name="prefix" value="https://www.cnblogs.com/haizai/p/WEB-INF/jsp/" /> <!-- 后綴 --> <property name="suffix" value="https://www.cnblogs.com/haizai/p/.jsp" /> </bean> </beans> 5.5.8.第八步: 配置web.xml 配置spring的容器監聽、springmvc前端控制器以及它可接收的url地址, 組態檔: 【web.xml】 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>ssm</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置spring的容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:ApplicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置springmvc的前端控制器--> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定springmvc核心組態檔的位置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC.xml</param-value> </init-param> <!-- 標記是否在tomcat啟動時就加載當前的servlet --> <load-on-startup>1</load-on-startup> </servlet> <!-- 配置springmvc前端控制器能夠接收的url結尾格式 --> <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app> 5.5.9.小結 本節的重點是要掌握整合的思路,有了思路就可以尋著線索進行整合了,不用死記具體的程序, 5.6.整合后的案例程式 5.6.1.需求 使用SSM從資料庫查詢資料, 實作真正的商品串列的展示. 5.6.2.需求分析 1.沿用SpringMvc入門程式. 2.在此基礎上完成service層的代碼, 定義service介面和實作類, 并用@autowired自動注入DAO介面物件. 3.完善controller層代碼, 用@autowired自動注入service介面物件. 5.6.3.第一步: 創建service層的介面和實作類 1.定義ItemsService.java介面 2.定義ItemsServiceImpl.java實作類,實作這個介面 代碼: 【ItemsService.java】 package cn.baidu.service; import java.util.List; import cn.baidu.pojo.Items; public interface ItemsService { public List<Items> findItemsList() throws Exception; } 【ItemsServiceImpl.java】 package cn.baidu.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import cn.baidu.dao.ItemsMapper; import cn.baidu.pojo.Items; @Service public class ItemsServiceImpl implements ItemsService { @Autowired ItemsMapper itemsMapper; @Override public List<Items> findItemsList() throws Exception { // 通過自動生成的介面方法查詢商品串列 List<Items> list = itemsMapper.selectByExample(null); return list; } } 注意:selectByExample(null)只檢索除了大物件資料型別之外的欄位,但items表中有一個detail欄位的型別是text,為了把它也檢索出來可以使用selectByExampleWithBLOBs(null)這個方法, package cn.baidu.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import cn.baidu.dao.ItemsMapper; import cn.baidu.pojo.Items; public class ItemsServiceImpl implements ItemsService { @Autowired ItemsMapper itemsMapper; @Override public List<Items> findItemsList() throws Exception { /* * 注意: * selectByExample只檢索除了大物件資料型別之外的專案 * selectByExampleWithBLOBs檢索包含大物件資料型別的專案 */ // 通過自動生成的介面方法查詢商品串列 List<Items> list = itemsMapper.selectByExampleWithBLOBs(null); return list; } } 5.6.4.第二步: 完善Controller層代碼 1.把入門程式中的【ItemsController.java】拷貝過來 2.修改里面的【lsit()】方法,呼叫service介面的方法完成查詢, 代碼: 【ItemsController.java】 package cn.baidu.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import cn.baidu.pojo.Items; import cn.baidu.service.ItemsService; @Controller public class ItemsController { @Autowired private ItemsService itemsService; @RequestMapping("/list") public ModelAndView list() throws Exception { List<Items> itemsList = itemsService.findItemsList(); // 1. 設定回傳頁面需要的資料 2. 指定回傳頁面的地址 ModelAndView modelAndView = new ModelAndView(); // 1. 設定回傳頁面需要的資料 modelAndView.addObject("itemList", itemsList); // 2. 指定回傳頁面的地址 modelAndView.setViewName("itemList"); return modelAndView; } } 5.6.5.第三步: 匯入jsp 從【資料\參考案例\jsp】中匯入【itemList.jsp】到工程的jsp目錄下 5.6.6.第三步: 把工程加入tomcat啟動、測驗 訪問地址: http://localhost:8080/springmvc/list.action 資料庫: 5.7.本節重點 到本節為止,一個完整的ssm整合就完成了,我們從最初的springmvc入門程式,到認識三大核心組件,到最后ssm整合形成完整的web系統,這就是一個web系統的學習進化程序, 大家重點掌握: 整合的分層思路以及各層代碼的撰寫 大家主要了解: SSM開發環境搭建,這個環境搭建不是大家掌握的重點,只是作為了解,基本會搭即可,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/46449.html
標籤:架構設計
上一篇:SpringCloud-服務注冊與實作-Eureka創建服務注冊中心(附原始碼下載)
下一篇:dubbo配置負載均衡、集群環境
