Java EE輕量級框架應用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第10章 初識Spring MVC_第1頁
Java EE輕量級框架應用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第10章 初識Spring MVC_第2頁
Java EE輕量級框架應用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第10章 初識Spring MVC_第3頁
Java EE輕量級框架應用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第10章 初識Spring MVC_第4頁
Java EE輕量級框架應用實戰(zhàn)-SSM框架(Spring MVC+Spring+MyBatis)(第2版)課件 第10章 初識Spring MVC_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

SpringMVC概述SpringMVC的應用SpringMVC的工作流程與特點SpringMVC的核心類與常用注解第10章

初識SpringMVC2024/1/29學習目標/Target

了解SpringMVC的特點

掌握SpringMVC入門程序的編

熟悉SpringMVC的工作流程

了解SpringMVC核心類的作用掌握SpringMVC常用注解的使用2章節(jié)概述/Summary在JavaWeb中,講解了JSPModel2架構(gòu)模型,JSPModel2架構(gòu)模型采用JSP

+

Servlet

+JavaBean技術(shù)實現(xiàn)了頁面顯示、流程控制和業(yè)務邏輯的分離。但是,JSPModel2架構(gòu)模型將流程控制等通用邏輯以硬編碼的方式實現(xiàn),每次進行新的Web應用程序開發(fā)時,都需要重新編寫Servlet控制器的URL分析代碼,以及流程控制等Web層通用邏輯代碼。為了解決JSPModel2架構(gòu)模型在實踐中存在的問題,一些基于JSPModel2架構(gòu)基礎(chǔ)發(fā)展起來的WebMVC應用框架應運而生。其中SpringMVC框架就是目前最主流的WebMVC應用框架之一,本章將開啟SpringMVC框架的學習之路。

3目錄/CONTENTSSpringMVC概述SpringMVC的核心類與常用注解SpringMVC的工作流程與特點SpringMVC的應用1432SpringMVC概述01第11章初識SpringMVCMVC設計模式5-1視圖(View)-對應組件:JSP或者HTML文件控制器(Controller)-對應組件:Servlet模型(Model)-對應組件:JavaBeanServletJSP數(shù)據(jù)庫JavaBeanViewControllerModel6MVC設計模式5-2JSPModel17MVC設計模式5-3JSPModel2JSP:負責生成動態(tài)網(wǎng)頁Servlet:負責流程控制JavaBean:負責業(yè)務邏輯處理8MVC設計模式5-4MVC處理過程9MVC實際開發(fā)架構(gòu)圖架構(gòu)圖分為兩部分:虛線框外的是WEB程序的瀏覽器部分,用戶通過瀏覽器與系統(tǒng)進行交互,同時瀏覽器也負責解析JSP頁面虛線框內(nèi)的是WEB程序的后臺部分,這部分包括控制器(Controller類)、業(yè)務邏輯(Service類)、數(shù)據(jù)模型(實體類)、數(shù)據(jù)持久層(MyBatis框架)和MySQL數(shù)據(jù)庫管理系統(tǒng)。10MVC設計模式5-5MVC優(yōu)點多視圖共享一個模型,大大提高代碼的可重用性MVC三個模塊相互獨立,松耦合架構(gòu)控制器提高了應用程序的靈活性和可配置性有利于軟件工程化管理MVC缺點原理復雜增加了系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復雜性視圖對模型數(shù)據(jù)的低效率訪問完美的系統(tǒng)架構(gòu)=松耦合+高重用性+高擴展性11什么是SpringMVC?SpringMVC概述

SpringMVC是Spring提供的一個實現(xiàn)了WebMVC設計模式的輕量級Web框架。它與Struts2框架一樣,都屬于MVC框架,但其使用和性能等方面比Struts2更加優(yōu)異。12SpringMVC概述是Spring框架的一部分,可以方便的利用Spring所提供的其他功能。提供了一個前端控制器DispatcherServlet,使開發(fā)人員無需額外開發(fā)控制器對象。靈活性強,易于與其他框架集成??勺詣咏壎ㄓ脩糨斎耄⒛苷_的轉(zhuǎn)換數(shù)據(jù)類型。內(nèi)置了常見的校驗器,可以校驗用戶輸入。如果校驗不能通過,那么就會重定向到輸入表單。支持國際化??梢愿鶕?jù)用戶區(qū)域顯示多國語言。SpringMVC具有以下特點:支持多種視圖技術(shù)。它支持JSP、Velocity和FreeMarker等視圖技術(shù)。使用基于XML的配置文件,在編輯后,不需要重新編譯應用程序。13SpringMVC的應用02第11章初識SpringMVC入門案例SpringMVC框架搭建步驟創(chuàng)建工程配置前端控制器創(chuàng)建FirstController.java創(chuàng)建SpringMVC框架的配置文件,配置控制器映射信息創(chuàng)建視圖(View)頁面啟動項目,測試應用演示示例1:入門案例實現(xiàn)步驟15第一個SpringMVC應用在web.xml中,配置SpringMVC的前端控制器DispatcherServlet。<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns:xsi="/2001/XMLSchema-instance"...<servlet> <servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern></servlet-mapping></web-app>SpringMVC前端控制器配置加載SpringMVC配置文件位置1表示容器在啟動時立即加載該Servlet/表示攔截所有URL的請求16

第一個SpringMVC應用在src目錄下,創(chuàng)建一個com.test.controller包,并在包中創(chuàng)建控制器類FirstController,該類需要實現(xiàn)Controller接口,編輯后如下所示。publicclassFirstControllerimplementsController{publicModelAndViewhandleRequest(HttpServletRequestrequest,HttpServletResponseresponse){System.out.println("hello,SpringMVC!");//在控制臺輸出日志信息

//創(chuàng)建ModelAndView對象

ModelAndViewmav=newModelAndView();//向模型對象中添加數(shù)據(jù)mav.addObject("msg","這是我的第一個SpringMVC程序");//設置邏輯視圖名

mav.setViewName("/WEB-INF/jsp/index.jsp");//返回ModelAndView對象returnmav;}}創(chuàng)建ModelAndView對象設置邏輯視圖名實現(xiàn)Controller接口添加返回信息17第一個SpringMVC應用在src目錄下,創(chuàng)建配置文件springmvc-config.xml,并在文件中配置控制器信息。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-3.2.xsd"> <!--配置處理器Handle,映射“/firstController”請求-->

<beanname="/firstController"class="cn.dsscm.controller.FirstController"/> <!--處理器映射器,將處理器Handle的name作為url進行查找--> <beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--處理器適配器,配置對處理器中handleRequest()方法的調(diào)用--> <beanclass="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--視圖解析器--> <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> </bean></beans>配置處理器配置處理器映射器配置處理器適配器配置視圖解析器在老版本Spring中,必須配置處理器映射器、處理器適配器和視圖解析器;但在Spring4.0后簡化了配置,這些就可以省略,交由Spring內(nèi)部自動管理。提示18第一個SpringMVC應用在WEB-INF目錄下,創(chuàng)建一個jsp文件夾,并在文件夾中創(chuàng)建一個頁面文件index.jsp,在該頁面中使用EL表達式獲取msg中的信息,如下所示。<html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>入門程序</title></head><body>${msg}</body></html>用EL表達式獲取后臺處理器封裝的信息19上機練習1:

使用SpringMVC實現(xiàn)頁面輸出1

需求說明:搭建SpringMVC環(huán)境實現(xiàn)前端頁面內(nèi)輸出“學框架就學SpringMVC!”HandlerMappingBeanNameUrlHandlerMappingViewResolverInternalResourceViewResolver導入jar文件配置DispatcherServlet(web.xml)springmvc-servlet.xml創(chuàng)建Controller:繼承AbstractController,重寫handleRequestInternal()創(chuàng)建View部署運行完成時間:20分鐘練習提示20共性問題集中講解常見問題及解決辦法代碼規(guī)范問題調(diào)試技巧共性問題集中講解21優(yōu)化項目——優(yōu)化路徑解析2-1修改FirstController.java設置邏輯視圖名,簡化訪問路徑“index”,不寫前面固定路徑和后綴文件名。publicclassFirstControllerimplementsController{publicModelAndViewhandleRequest(HttpServletRequestrequest,HttpServletResponseresponse){System.out.println("hello,SpringMVC!");//在控制臺輸出日志信息

//創(chuàng)建ModelAndView對象

ModelAndViewmav=newModelAndView();//向模型對象中添加數(shù)據(jù)mav.addObject("msg","這是我的第一個SpringMVC程序");//設置邏輯視圖名

mav.setViewName("/WEB-INF/jsp/index.jsp");//返回ModelAndView對象returnmav;}}index22優(yōu)化項目——優(yōu)化路徑解析2-2springmvc-servlet.xml配置文件中,使用SpringMVC最簡單配置方式來進行配置<beanname="/index.html"class="cn.dsscm.controller.IndexController"/><!--完成視圖的對應--><!--對轉(zhuǎn)向頁面的路徑解析。prefix:前綴,suffix:后綴--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">

<propertyname="prefix"value="/WEB-INF/jsp/"/> <propertyname="suffix"value=".jsp"/></bean>23優(yōu)化項目——注解驅(qū)動控制器3-1通過BeanNameUrlHandlerMapping的方式完成請求與Controller之間的映射關(guān)系若有多個請求時,需要配置多個映射關(guān)系,并建立多個Controller來進行請求處理,實現(xiàn)繁瑣,如何解決?springmvc-servlet.xml……<beanname="/index.html"class="cn.dsscm.controller.IndexController"/><beanname="/user.html"class="cn.dsscm.controller.UserController"/>……提問24優(yōu)化項目——注解驅(qū)動控制器3-2基于注解的處理器@Controller:標注一個普通的JavaBean成為可以處理請求的控制器@RequestMapping:通過請求URL進行映射一鍵式配置,通過注解的方式進行SpringMVC開發(fā)DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter<context:component-scan/><mvc:annotation-driven/><context:component-scanbase-package="cn.dsscm.controller"/><mvc:annotation-driven/>25優(yōu)化項目——注解驅(qū)動控制器3-3使標注了SpringMVC注解(如(@Controller等)的Bean生效。為控制器類標注@Controller使用@RequestMapping對方法進行標注importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;@ControllerpublicclassIndexController{ //RequestMapping表示用哪個url來對應(此處:"/index")

@RequestMapping("/index") publicStringindex(){ //System.out.println("hello,SpringMVC!"); ("hello,SpringMVC!"); return"index"; }}演示示例2:Hello,SpringMVC-<mvcannotation-driven/>26上機練習2:

使用SpringMVC實現(xiàn)頁面輸出2

需求說明:在上機練習1的基礎(chǔ)上,更改SpringMVC的處理器映射的配置為支持注解式處理器,實現(xiàn)頁面輸出:學框架就學SpringMVC!”HandlerMapping<mvc:annotation-driven/>ViewResolverInternalResourceViewResolver加入Log4j進行后臺日志輸出更改springmvc-servlet.xml<mvc:annotation-driven/><context:component-scanbase-package="cn.dsscm.controller"/>創(chuàng)建Controller@Controller@RequestMapping部署運行完成時間:15分鐘練習提示27共性問題集中講解常見問題及解決辦法代碼規(guī)范問題調(diào)試技巧共性問題集中講解28SpringMVC

的工作流程與特點03第11章初識SpringMVCSpringMVC的工作流程SpringMVC是如何工作的呢?

通過上一小節(jié)入門案例的學習,相信讀者對SpringMVC的使用已經(jīng)有了一個初步的了解。在實際開發(fā)中,我們的實際工作主要集中在控制器和視圖頁面上,但SpringMVC內(nèi)部完成了很多工作,這些程序在項目中具體是怎么執(zhí)行的呢?接下來,將通過一張圖來展示SpringMVC程序的執(zhí)行情況。30SpringMVC請求處理流程31SpringMVC體系結(jié)構(gòu)32SpringMVC的工作流程DispatcherServlet前端控制器HandlerMapping處理器映射器HandlerAdapter處理器適配器ViewReslover視圖解析器Handler處理器View視圖(如JSP)Web服務器①②③⑦④⑤⑥⑨⑧⑩?用戶通過瀏覽器向服務器發(fā)送請求,請求會被SpringMVC的前端控制器DispatcherServlet所攔截;1DispatcherServlet攔截到請求后,會調(diào)用HandlerMapping處理器映射器;2處理器映射器根據(jù)請求URL找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet;3DispatcherServlet會通過返回信息選擇合適的HandlerAdapter(處理器適配器);4HandlerAdapter會調(diào)用并執(zhí)行Handler(處理器),這里的處理器指的就是程序中編寫的Controller類,也被稱之為后端控制器;5Controller執(zhí)行完成后,會返回一個ModelAndView對象,該對象中會包含視圖名或包含模型和視圖名;6HandlerAdapter將ModelAndView對象返回給DispatcherServlet;7DispatcherServlet會根據(jù)ModelAndView對象選擇一個合適的ViewReslover(視圖解析器);8ViewReslover解析后,會向DispatcherServlet中返回具體的View(視圖);9視圖渲染結(jié)果會返回給客戶端瀏覽器顯示。11DispatcherServlet對View進行渲染(即將模型數(shù)據(jù)填充至視圖中);1033SpringMVC框架特點清晰地角色劃分靈活的配置功能提供了大量的控制器接口和實現(xiàn)類真正做到與View層的實現(xiàn)無關(guān)(JSP、Velocity、Xslt等)國際化支持面向接口編程Spring提供了Web應用開發(fā)的一整套流程,不僅僅是MVC,他們之間可以很方便的結(jié)合一起34SpringMVC的

核心類與常用注解04第11章初識SpringMVCSpringMVC的核心類DispatcherServlet(前端控制器)SpringMVC最核心的類web.xml中配置Handler(處理器):對應MVC中C(Controller層)類型:Object作用:實際處理請求標注了@RequestMapping的所有方法都可以看作是一個HandlerModelAndView邏輯視圖名模型對象36SpringMVC的核心類核心組件HandlerMapping(處理器映射)BeanNameUrlHandlerMapping(默認)將請求URL映射到同名的控制器Bean上DefaultAnnotationHandlerMapping將請求映射到標注@RequestMapping注解的控制器和處理方法上RequestMappingHandlerMappingHandlerAdapter(適配器)AnnotationMethodHandlerAdapterRequestMappingHandlerAdapterViewResolver(視圖解析器)InternalResourceView37視圖解析器2-1視圖解析器-ViewResolver將邏輯視圖名與JSP等視圖技術(shù)進行匹配演示:查看源碼-

ViewResolver38視圖解析器2-2InternalResourceViewResolverprefixsuffix/WEB-INF/jsp/邏輯視圖名.jsp前綴后綴<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="prefix"value="/WEB-INF/jsp/"/> <propertyname="suffix"value=".jsp"/></bean>

在上述代碼中,定義了一個視圖解析器,并設置了視圖的前綴和后綴屬性。這樣設置后,方法中所定義的view路徑將可以簡化。例如,入門案例中的邏輯視圖名只需設置為“first”,而不再需要設置為“/WEB-INF/jsp/first.jsp”,在訪問時視圖解析器會自動的增加前綴和后綴。39@Controller注解類型

org.springframework.stereotype.Controller注解類型用于指示Spring類的實例是一個控制器,其注解形式為@Controller。該注解在使用時不需要再實現(xiàn)Controller接口,只需要將@Controller注解加入到控制器類上,然后通過Spring的掃描機制找到標注了該注解的控制器即可。@Controller注解在控制器類中的使用示例如下:importorg.springframework.stereotype.Controller;......@ControllerpublicclassFirstController{ ...}40@Controller注解類型為了保證Spring能夠找到控制器類,還需要在SpringMVC的配置文件中添加相應的掃描配置信息,一個完整的配置文件示例如下:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"

xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.2.xsd

/schema/context/schema/context/spring-context-3.2.xsd"> <context:component-scanbase-package="cn.dsscm.controller"/></beans>引入context信息指定需要掃描的包使用注解方式時,程序的運行需要依賴Spring的AOP包,因此需要向lib目錄中添加spring-aop-X.X.X.RELEASE.jar,否則程序運行時會報錯!提示41@RequestMapping注解Spring通過@Controller注解找到相應的控制器類后,還需要知道控制器內(nèi)部對每一個請求是如何處理的,這就需要使用org.springframework.web.bind.annotation.RequestMapping注解類型。RequestMapping注解類型用于映射一個請求或一個方法,其注解形式為@RequestMapping,可以使用該注解標注在一個方法或一個類上。importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;...@Controller@RequestMapping(value="/hello")publicclassFirstController{

@RequestMapping(value="/firstController") publicStringhandleRequest(HttpServletRequestrequest, ... }}42RequestMapping注解的屬性@RequestMapping注解除了可以指定value屬性外,還可以指定其他一些屬性,如下表所示。屬性名類型描述nameString可選屬性,用于為映射地址指定別名valueString[]可選屬性,同時也是默認屬性,用于映射一個請求和一種方法,可以標注在一個方法或一個類上methodRequestMethod[]可選屬性,用于指定該方法用于處理哪種類型的請求方式,其請求方式包括GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE和TRACE,例如method=RequestMethod.GET表示只支持GET請求,如果需要支持多個請求方式則需要通過{}寫成數(shù)組的形式,并且多個請求方式之間是有英文逗號分隔paramsString[]可選屬性,用于指定Request中必須包含某些參數(shù)的值,才可以通過其標注的方法處理headersString[]可選屬性,用于指定Request中必須包含某些指定的header的值,才可以通過其標注的方法處理consumesString[]可選屬性,用于指定處理請求的提交內(nèi)容類型(Conten-type),比如application/json、text/html等producesString[]可選屬性,用于指定返回的內(nèi)容類型,返回的內(nèi)容類型必須是request請求頭(Accept)中所包含的類型表中所有屬性都是可選的,但其默認屬性是value。當value是其唯一屬性時,可以省略屬性名。例如,下面兩種標注的含義相同:

@RequestMapping(value="/firstController")@RequestMapping("/firstController")提示43組合注解@GetMapping:匹配GET方式的請求。@PostMapping:匹配POST方式的請求。@PutMapping:匹配PUT方式的請求。@DeleteMapping:匹配DELETE方式的請求。@PatchMapping:匹配PATCH方式的請求。@RequestMapping(value="/user/{id}",method=RequestMethod.GET)publicStringselectUserById(Stringid){ ...}@GetMapping(value="/user/{id}")44在控制器類中,每一個請求處理方法都可以有多個不同類型的參數(shù),以及一個多種類型的返回結(jié)果。在請求處理方法中,可以出現(xiàn)的參數(shù)類型如下:javax.servlet.ServletRequest/javax.servlet.http.HttpServletRequestjavax.servlet.ServletResponse/javax.servlet.http.HttpServletResponsejavax.servlet.http.HttpSessionorg.springframework.web.context.request.WebRequest或org.springframework.web.context.request.NativeWebRequestjava.util.Localejava.util.TimeZone(Java6+)/java.time.ZoneId(onJava8)java.io.InputStream/java.io.Readerjava.io.OutputStream/java.io.Writerorg.springframework.http.HttpMethodjava.security.Principal@PathVariable、@MatrixVariable、@RequestParam、@RequestHeader、@RequestBody、@RequestPart、@SessionAttribute、@RequestAttribute注解HttpEntity<?>java.util.Map/org.springframework.ui.Model/org.springframework.ui.ModelMaporg.springframework.web.servlet.mvc.support.RedirectAttributesorg.springframework.validation.Errors/org.springframework.validation.BindingResultorg.springframework.web.bind.support.SessionStatusorg.springframework.web.util.UriComponentsBuilder該類型不是一個ServletAPI類型,而是一個包含了Map對象的SpringMVC類型。如果方法中添加了Model參數(shù),則每次調(diào)用該請求處理方法時,SpringMVC都會創(chuàng)建Model對象,并將其作為參數(shù)傳遞給方法請求處理方法的參數(shù)和返回類型45請求處理方法的參數(shù)和返回類型SpringMVC所支持的常見方法返回類型如下:ModelAndViewModelMapViewStringvoidHttpEntity<?>或ResponseEntity<?>Callable<?>DeferredResult<?>請求處理方法的返回類型在異步請求時使用,它只返回數(shù)據(jù),而不會跳轉(zhuǎn)視圖可以跳轉(zhuǎn)視圖,但不能攜帶數(shù)據(jù)可以添加Model數(shù)據(jù),并指定視圖由于ModelAndView類型未能實現(xiàn)數(shù)據(jù)與視圖之間的解耦,所以在企業(yè)開發(fā)時,方法的返回類型通常都會使用String。提示46返回類型@RequestMapping(value="/update")publicStringupdate(HttpServletRequestrequest,HttpServletResponseresponse,Model

model){ //向模型對象中添加數(shù)據(jù)

model.addAttribute("msg","這是我的第一個SpringMVC程序");

//返問視圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論