版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第2講SpringMVCfdteachers@163.comSpringBoot導(dǎo)學(xué)課Spring,SpringMVC,SpringBoot有什么區(qū)別和聯(lián)系SpringmakesiteasytocreateJavaenterpriseapplications.ItprovideseverythingyouneedtoembracetheJavalanguageinanenterpriseenvironmentSpring主要是基于IOC反轉(zhuǎn)Beans管理Bean類SpringMVC是基于Spring的一個MVC框架,擁有web功能SpringBoot是基于Spring4的條件注冊的一套快速開發(fā)整合包SpringCloud:現(xiàn)在是大數(shù)據(jù)、云時代,上云是必然選擇,那么SpringCloud應(yīng)運而生1SpringMVC是基于Spring的一個MVC框架,用以替代初期的SSH框架;(springFramework本身沒有Web功能,SpringMVC使用WebApplicationContext類擴(kuò)展ApplicationContext,使得擁有web功能)SpringMVC屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在SpringWebFlow里面SpringBoot是為了簡化Spring應(yīng)用的創(chuàng)建、運行、調(diào)試、部署等而出現(xiàn)的,使用它可以做到專注于Spring應(yīng)用的開發(fā),而無需過多關(guān)注XML的配置。提供了一堆依賴打包,并已經(jīng)按照使用習(xí)慣解決了依賴問題—>習(xí)慣大于約定。2眾所周知Spring框架需要進(jìn)行大量的配置,SpringBoot引入自動配置的概念,讓項目設(shè)置變得很容易。SpringBoot本身并不提供Spring框架的核心特性以及擴(kuò)展功能,只是用于快速、敏捷地開發(fā)新一代基于Spring框架的應(yīng)用程序。也就是說,它并不是用來替代Spring的解決方案,而是和Spring框架緊密結(jié)合用于提升Spring開發(fā)者體驗的工具3使用Spring進(jìn)行開發(fā)各種配置過于麻煩比如開啟某些Spring特性時,需要用XML或Java進(jìn)行顯式配置。于是,SpringBoot誕生了Spring旨在簡化J2EE企業(yè)應(yīng)用程序開發(fā)。SpringBoot旨在簡化Spring開發(fā)(減少配置文件,開箱即用?。㏒pringBoot只是簡化了配置,如果你需要構(gòu)建MVC架構(gòu)的Web程序,你還是需要使用SpringMVC作為MVC框架,只是說SpringBoot幫你簡化了SpringMVC的很多配置,真正做到開箱即用springboot就是一個大框架里面包含了許許多多的東西,其中spring就是最核心的內(nèi)容之一,當(dāng)然也就包含springmvc4如果承載的是WEB項目,使用SpringMVC作為MVC框架,那么工作流程和你上面描述的是完全一樣的,因為這部分工作是SpringMVC做的而不是SpringBoot熟悉使用Springboot,還有必要學(xué)習(xí)SpringMVC么如果你不是為了面試的話,就沒太必要專門學(xué)了,因為你學(xué)SpringBoot其實就已經(jīng)學(xué)了SpringMVC56springboot和SSM有以下幾個主要區(qū)別springboot提供了一種約定優(yōu)于配置的方式,它可以根據(jù)項目的依賴自動配置合適的組件,無需手動編寫大量的配置文件。SSM則需要開發(fā)者自己配置各個框架之間的集成和協(xié)調(diào),這會增加開發(fā)和維護(hù)的復(fù)雜度springboot支持創(chuàng)建可執(zhí)行的jar包,這意味著可以直接運行一個jar文件來啟動應(yīng)用程序,無需額外的服務(wù)器容器。SSM則需要部署到一個服務(wù)器容器中,如Tomcat或Jetty,這會增加部署和運行的成本springboot擁有一個強(qiáng)大的生態(tài)系統(tǒng),它提供了許多與其他技術(shù)集成的模塊,如數(shù)據(jù)庫、緩存、消息隊列、安全、監(jiān)控等。SSM則需要開發(fā)者自己尋找合適的第三方庫來實現(xiàn)這些功能,這會增加開發(fā)和測試的難度。springboot更適合開發(fā)微服務(wù)架構(gòu)的應(yīng)用程序,它可以快速創(chuàng)建獨立運行、松耦合、易于擴(kuò)展的服務(wù)。SSM則更適合開發(fā)傳統(tǒng)的單體應(yīng)用程序,它可以實現(xiàn)較為復(fù)雜和穩(wěn)定的業(yè)務(wù)邏輯7SSM框架項目會有大量的配置文件,需要手動的去整合SpringMVC、Spring、MyBatis,并且需要注意各種配置和兼容,后期的維護(hù)難度也很大SpringBoot的目的:快速整合和自動配置8SpringBoot開發(fā)相較于SSM開發(fā),具有以下優(yōu)勢1.快速開發(fā):SpringBoot采用約定大于配置的方式,大量減少了開發(fā)的配置量,提供豐富的自動配置,使開發(fā)者更加專注于業(yè)務(wù)邏輯的實現(xiàn)。
2.微服務(wù)支持:SpringBoot是微服務(wù)框架的首選,提供了各種與微服務(wù)相關(guān)的組件和功能,如服務(wù)注冊和發(fā)現(xiàn)、負(fù)載均衡、調(diào)用鏈跟蹤等。
3.靈活配置:SpringBoot采用Yaml格式的配置文件,使得配置更加清晰、具有易讀性、易維護(hù)性;同時,支持動態(tài)更新配置,避免因為修改配置而重啟應(yīng)用程序的缺陷。4.大量Starter:提供了大量的開箱即用的Starter,便于程序員集成各種中間件,只需引入相應(yīng)的Starter,SpringBoot就會根據(jù)classpath下的依賴自動生成相應(yīng)的基礎(chǔ)設(shè)置。9SpringBoot的優(yōu)點
Spring由于其繁瑣的配置,一度被人認(rèn)為“配置地獄”,各種XML、Annotation配置,讓人眼花繚亂,而且如果出錯了也很難找出原因。pringBoot幫助開發(fā)者快速啟動一個Web容器;SpringBoot繼承了原有Spring框架的優(yōu)秀基因;SpringBoot簡化了使用Spring的過程。在使用SSM開發(fā)的時候,多數(shù)會選擇Jsp作為視圖,但是springboot不推薦使用jsp,主推的是thymeleaf和freemarker等模板引擎綜上,SpringBoot適用于構(gòu)建基于微服務(wù)架構(gòu)的應(yīng)用程序,簡化了應(yīng)用的開發(fā)和部署,提高了應(yīng)用的可維護(hù)性和可擴(kuò)展性;而SSM框架適用于構(gòu)建傳統(tǒng)的JavaWeb應(yīng)用程序,遵循MVC模式,將業(yè)務(wù)邏輯和數(shù)據(jù)持久層分離,實現(xiàn)更好的可維護(hù)性和可擴(kuò)展性。10學(xué)習(xí)最佳入門路徑先看官方文檔開始實踐做完一兩個實際項目之后,返回去再讀一遍文檔11Spring和springboot的區(qū)別12131415161718192021springboot就是一個大框架里面包含了許許多多的東西,其中spring就是最核心的內(nèi)容之一,當(dāng)然也就包含springmvc。springmvc只是spring處理web層請求的一個模塊SpringMVC提供了一種輕度耦合的方式來開發(fā)web應(yīng)用。SpringMVC是Spring的一個模塊,是一個web框架SpringBoot本身并不提供Spring框架的核心特性以及擴(kuò)展功能,只是用于快速、敏捷地開發(fā)新一代基于Spring框架的應(yīng)用程序。也就是說,它并不是用來替代Spring的解決方案,而是和Spring框架緊密結(jié)合用于提升Spring開發(fā)者體驗的工具。同時它集成了大量常用的第三方庫配置22SpringBoot只是承載者,輔助你簡化項目搭建過程的。如果承載的是WEB項目,使用SpringMVC作為MVC框架,那么工作流程和你上面描述的是完全一樣的,因為這部分工作是SpringMVC做的而不是SpringBoot。對使用者來說,換用SpringBoot以后,項目初始化方法變了,配置文件變了,另外就是不需要單獨安裝Tomcat這類容器服務(wù)器了,maven打出jar包直接跑起來就是個網(wǎng)站,但你最核心的業(yè)務(wù)邏輯實現(xiàn)與業(yè)務(wù)流程實現(xiàn)沒有任何變化。23thymeleaf有必要學(xué)嗎?24Spring的運行原理25262728SpringBoot知識體系29SpringBoot配置與日志SpringBoot的Web開發(fā)SpringBoot的數(shù)據(jù)訪問SpringBoot的異步消息服務(wù)SpringBoot的安全管理SpringBoot的熱部署與單元測試SpringBoot應(yīng)用監(jiān)控與任務(wù)管理本章目標(biāo)了解SpringMVC的工作原理掌握基于注解的控制器的編寫方式了解數(shù)據(jù)綁定的基本原理掌握SpringMVC應(yīng)用的開發(fā)步驟了解攔截器的基本用法30本章內(nèi)容312.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.1SpringMVC的工作原理32?請思考
SpringMVC框架的核心控制器是?SpringMVC的工作流程1.客戶端請求提交到DispatcherServlet;2.由DispatcherServlet控制器尋找一個或多個HandlerMapping,找到處理請求的Controller;3.DispatcherServlet將請求提交到Controller;4.Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView;5.DispatcherServlet尋找一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖;6.視圖負(fù)責(zé)將結(jié)果顯示到客戶端。33SpringMVC接口SpringMVC所有的請求都經(jīng)過DispatcherServlet接口來統(tǒng)一分發(fā)。DispatcherServlet將請求分發(fā)給Controller之前,需要借助于SpringMVC提供的HandlerMapping定位到具體的Controller。HandlerMapping接口負(fù)責(zé)完成客戶請求到Controller映射。Controller接口將處理用戶請求,這和JavaServlet扮演的角色是一致的。從宏觀角度考慮,DispatcherServlet是整個Web應(yīng)用的控制器;從微觀考慮,Controller是單個Http請求處理過程中的控制器,而ModelAndView是Http請求過程中返回的模型(Model)和視圖(View)。ViewResolver接口(視圖解析器)在Web應(yīng)用中負(fù)責(zé)查找View對象,從而將相應(yīng)結(jié)果渲染給客戶。34本章內(nèi)容352.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.2SpringMVC的工作環(huán)境2.2.1SpringMVC所需要的JAR包2.2.2使用Eclipse開發(fā)SpringMVC的Web應(yīng)用362.2.1SpringMVC所需要的JAR包對于SpringMVC框架的初學(xué)者,開發(fā)SpringMVC應(yīng)用時,只需將Spring的4個基礎(chǔ)包、commons-logging-1.2.jar、注解時需要的JAR包spring-aop-5.1.4.RELEASE.jar和SpringMVC相關(guān)的JAR包(spring-web-5.3.2.jar和spring-webmvc-5.3.2.jar)復(fù)制到Web應(yīng)用的WEB-INF/lib目錄下即可。372.2SpringMVC的工作環(huán)境2.2.1SpringMVC所需要的JAR包2.2.2使用Eclipse開發(fā)SpringMVC的Web應(yīng)用382.2.2使用Eclipse開發(fā)SpringMVC的Web應(yīng)用【例2-1】SpringMVC入門程序的實現(xiàn)過程。1.創(chuàng)建Web應(yīng)用ch2_1并導(dǎo)入JAR包創(chuàng)建Web應(yīng)用ch2_1,導(dǎo)入如2.2.1節(jié)所示的JAR包。2.在web.xml文件中部署SpringMVC核心控制器DispatcherServlet在開發(fā)SpringMVC應(yīng)用時,需要在WEB-INF目錄下,創(chuàng)建web.xml文件,并在該文件中部署DispatcherServlet。39部署SpringMVC核心控制器DispatcherServlet40<!--配置springmvcDispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>3.創(chuàng)建Web應(yīng)用首頁在ch2_1應(yīng)用的WebContent目錄下,有個應(yīng)用首頁index.jsp。41<body>
沒注冊的用戶,請<ahref="index/register">注冊</a>!<br>
已注冊的用戶,去<ahref="index/login">登錄</a>!</body>4.創(chuàng)建Controller類在ch2_1應(yīng)用的src目錄下,創(chuàng)建包controller,并在該包中創(chuàng)建基于注解的名為“IndexController”的控制器類,該類中有兩個處理請求方法,分別處理首頁index.jsp中“注冊(index/register)”和“登錄(index/login)”超鏈接請求。42@Controller@RequestMapping("/index")publicclassIndexController{ @RequestMapping("/login") publicStringlogin(){ return"login"; } @RequestMapping("/register") publicStringregister(){ return"register"; }}?請思考
與前端請求URL是什么關(guān)系?5.創(chuàng)建SpringMVC的配置文件在SpringMVC中,使用掃描機(jī)制找到應(yīng)用中所有基于注解的控制器類。所以,為了讓控制器類被SpringMVC框架掃描到,需要在配置文件中聲明spring-context,并使用<context:component-scan/>元素指定控制器類的基本包(請確保所有控制器類都在基本包及其子包下)。另外,需要在配置文件中定義SpringMVC的視圖解析器(ViewResolver)。43<!--使用掃描機(jī)制,掃描控制器類-->
<context:component-scanbase-package="controller"/> <!--配置視圖解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!--前綴--><propertyname="prefix"value="/WEB-INF/jsp/"/><!--后綴--><propertyname="suffix"value=".jsp"/></bean>6.應(yīng)用的其他頁面IndexController控制器的register方法處理成功后,跳轉(zhuǎn)到“/WEB-INF/jsp/register.jsp”視圖;IndexController控制器的login方法處理成功后,跳轉(zhuǎn)到“/WEB-INF/jsp/login.jsp”視圖。因此,應(yīng)用的“/WEB-INF/jsp”目錄下應(yīng)有“register.jsp”和“l(fā)ogin.jsp”頁面。44?請思考
與視圖解析器是什么關(guān)系?7.發(fā)布并運行SpringMVC應(yīng)用在Eclipse中第1次運行SpringMVC應(yīng)用時,需要將應(yīng)用發(fā)布到Tomcat。例如,運行ch2_1應(yīng)用時,可以右擊應(yīng)用名稱ch2_1,選擇RunAs/RunonServer即完成發(fā)布并運行。45本章內(nèi)容462.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute472.3.1Controller注解類型在SpringMVC中,使用org.springframework.stereotype.Controller注解類型聲明某類的實例是一個控制器。例如,2.2.2節(jié)中的IndexController控制器類。別忘了在SpringMVC的配置文件中使用<context:component-scan/>元素(見【例2-1】)指定控制器類的基本包,進(jìn)而掃描所有注解的控制器類。482.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute492.3.2RequestMapping注解類型在基于注解的控制器類中,可以為每個請求編寫對應(yīng)的處理方法。如何將請求與處理方法一一對應(yīng)呢?需要使用org.springframework.web.bind.annotation.RequestMapping注解類型將請求與處理方法一一對應(yīng)。50方法級別注解51@ControllerpublicclassIndexController{
@RequestMapping(value="/index/login") publicStringlogin(){ /**login代表邏輯視圖名稱,需要根據(jù)SpringMVC配置中 *internalResourceViewResolver的前綴和后綴找到對應(yīng)的物理視圖 */ return"login"; }
@RequestMapping(value="/index/register") publicStringregister(){ return"register"; }}
注解的value屬性將請求URI映射到方法,value屬性是RequestMapping注解的默認(rèn)屬性,如果就一個value屬性,則可省略該屬性。可以使用如下URL訪問login方法(請求處理方法):http://localhost:xxx/yyyy/index/login類級別注解52@Controller@RequestMapping("/index")publicclassIndexController{
@RequestMapping("/login") publicStringlogin(){ return"login"; }
@RequestMapping("/register") publicStringregister(){ return"register"; }}為了方便程序維護(hù),建議開發(fā)者采用類級別注解,將相關(guān)處理放在同一個控制器類中,例如,對商品的增、刪、改、查處理方法都可以放在一個名為GoodsOperate的控制類中。2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute53請求處理方法中常出現(xiàn)的參數(shù)類型54@Controller@RequestMapping("/index")publicclassIndexController{ @RequestMapping("/login") publicStringlogin(HttpSessionsession,HttpServletRequestrequest){ session.setAttribute("skey","session范圍的值"); request.setAttribute("rkey","request范圍的值"); return"login"; }}除了ServletAPI參數(shù)類型外,還有輸入輸出流、表單實體類、注解類型、與Spring框架相關(guān)的類型等等。但特別重要的類型是org.springframework.ui.Model類型,該類型是一個包含Map的Spring框架類型。每次調(diào)用請求處理方法時,SpringMVC都將創(chuàng)建org.springframework.ui.Model對象。請求處理方法常見的返回類型最常見的返回類型,就是代表邏輯視圖名稱的String類型。除了String類型外,還有Model、View以及其它任意的Java類型。552.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute56通過實體bean接收請求參數(shù)通過一個實體bean來接收請求參數(shù),適用于get和post請求方式。需要注意的是,bean的屬性名稱必須與請求參數(shù)名稱相同。57<inputtype="text"name="uname"/><inputtype="password"name="upass"/><inputtype="password"name="reupass"/>packagepojo;publicclassUserForm{ privateStringuname;//與form表單的請求參數(shù)名稱相同 privateStringupass; privateStringreupass; //省略getter和setter方法}@RequestMapping("/login")publicStringlogin(UserForm
user,HttpSessionsession,Modelmodel){}通過處理方法的形參接收請求參數(shù)通過處理方法的形參接收請求參數(shù),也就是直接把表單參數(shù)寫在控制器類相應(yīng)方法的形參中,即形參名稱與請求參數(shù)名稱完全相同。該接收參數(shù)方式適用于get和post請求方式。58 @RequestMapping("/register") /** *通過形參接收請求參數(shù),形參名稱與請求參數(shù)名稱完全相同 */ publicStringregister(Stringuname,Stringupass,Modelmodel){ if("zhangsan".equals(uname) &&"123456".equals(upass)){ return"login";//注冊成功,跳轉(zhuǎn)到login.jsp }else{ //在register.jsp頁面上可以使用EL表達(dá)式取出model的uname值 model.addAttribute("uname",uname); return"register";//返回register.jsp } }通過@RequestParam接收請求參數(shù)通過@RequestParam接收請求參數(shù),適用于get和post請求方式。59publicStringregister(@RequestParamStringuname,@RequestParamStringupass,Modelmodel){ if("zhangsan".equals(uname) &&"123456".equals(upass)){ return"login";//注冊成功,跳轉(zhuǎn)到login.jsp }else{ //在register.jsp頁面上可以使用EL表達(dá)式取出model的uname值 model.addAttribute("uname",uname); return"register";//返回register.jsp } }?請思考
通過@RequestParam接收請求參數(shù)與“通過處理方法的形參接收請求參數(shù)”的區(qū)別是?通過@ModelAttribute接收請求參數(shù)@ModelAttribute注解放在處理方法的形參上時,用于將多個請求參數(shù)封裝到一個實體對象中,從而簡化數(shù)據(jù)綁定流程,而且自動暴露為模型數(shù)據(jù)用于視圖頁面展示時使用。而“通過實體bean接收請求參數(shù)”只是將多個請求參數(shù)封裝到一個實體對象,并不能暴露為模型數(shù)據(jù)(需要使用model.addAttribute語句才能暴露為模型數(shù)據(jù),數(shù)據(jù)綁定與模型數(shù)據(jù)展示,可參考第2.4節(jié)的內(nèi)容)。602.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute612.3.5重定向與轉(zhuǎn)發(fā)在SpringMVC框架中,控制器類中處理方法的return語句默認(rèn)就是轉(zhuǎn)發(fā)實現(xiàn),只不過實現(xiàn)的是轉(zhuǎn)發(fā)到視圖。在SpringMVC框架中,不管重定向或轉(zhuǎn)發(fā),都需要符合視圖解析器的配置,如果直接重定向到一個不需要DispatcherServlet的資源,如:return"redirect:/html/my.html";62//轉(zhuǎn)發(fā)到一個請求方法(同一個控制器類里,可省略/index/)return"forward:/index/isLogin";//重定向到一個請求方法return"redirect:/index/isRegister";//轉(zhuǎn)發(fā)到一個視圖return"register";<mvc:annotation-driven/><mvc:resourceslocation="/html/"mapping="/html/**"></mvc:resources>2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute632.3.6應(yīng)用@Autowired進(jìn)行依賴注入SpringMVC框架本身就是一個非常優(yōu)秀的MVC框架,它具有一個依賴注入的優(yōu)點??梢酝ㄟ^org.springframework.beans.factory.annotation.Autowired注解類型將依賴注入到一個屬性(成員變量)或方法,如:在SpringMVC中,為了能被作為依賴注入,服務(wù)層的類必須使用org.springframework.stereotype.Service注解類型注明為@Service(一個服務(wù))。另外,還需要在配置文件中使用<context:component-scanbase-package="基本包"/>元素來掃描依賴基本包。64@AutowiredpublicUserServiceuserService;2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute65綁定請求參數(shù)到實體對象(表單的命令對象)66@RequestMapping("/register")publicStringregister(@ModelAttribute("user")UserFormuser){ if("zhangsan".equals(user.getUname()) &&"123456".equals(user.getUpass())){ return"login"; }else{ return"register"; }
}上述代碼中“@ModelAttribute("user")UserFormuser”語句的功能有兩個,一是將請求參數(shù)的輸入封裝到user對象中;一是創(chuàng)建UserForm實例,以“user”為鍵值存儲在Model對象中,與“model.addAttribute("user",user)”語句功能一樣。如果沒有指定鍵值,即“@ModelAttributeUserFormuser”,那么創(chuàng)建UserForm實例時,以“userForm”為鍵值存儲在Model對象中,與“model.addAttribute("userForm",user)”語句功能一樣。注解一個非請求處理方法在控制器類中,被@ModelAttribute注解的一個非請求處理方法,將在每次調(diào)用該控制器類的請求處理方法前被調(diào)用。這種特性可以用來控制登錄權(quán)限,當(dāng)然控制登錄權(quán)限的方法很多,例如攔截器、過濾器等。67publicclassBaseController{
@ModelAttributepublicvoidisLogin(HttpSessionsession)throwsException{if(session.getAttribute("user")==null){thrownewException("沒有權(quán)限");}}}@Controller@RequestMapping("/admin")publicclassModelAttributeControllerextends
BaseController{ @RequestMapping("/add") publicStringadd(){} @RequestMapping("/update") publicStringupdate(){} @RequestMapping("/delete") publicStringdelete(){}}SpringBoot采用全注解驅(qū)動1.組件注冊:@Configuration、@SpringBootConfiguration@Bean、@Controller、@Service、@Repository、@Component、@Import、@ComponentScan2.條件注解@ConditionalOnXxx3.屬性綁定注解@ConfigurationProperties、@EnableConfigurationProperties683.屬性綁定@ConfigurationProperties@EnableConfigurationProperties將容器中任意組件(Bean)的屬性值和配置文件的配置項的值進(jìn)行綁定1.給容器中注冊組件(@Componet、@Bean)2.使用@ConfigurationProperties聲明組件和配置文件的哪些配置項進(jìn)行綁定694@Data自動生成Getter/Setter@NoArgsConstructor自動生成無參構(gòu)造器@AllArgsConstructor自動生成全參構(gòu)造器70本章內(nèi)容712.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.4.1表單標(biāo)簽庫2.4.2數(shù)據(jù)綁定72本章內(nèi)容732.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.5JSON數(shù)據(jù)交2.5.1JSON數(shù)據(jù)結(jié)構(gòu)2.5.2JSON數(shù)據(jù)轉(zhuǎn)換74對象結(jié)構(gòu)對象結(jié)構(gòu)以“{”開始,以“}”結(jié)束。中間部分由0個或多個以英文“,”分隔的key/value對構(gòu)成,key和value之間以英文“:”分隔。其中,key必須為String類型,value可以是String、Number、Object、Array等數(shù)據(jù)類型。75{ key1:value1, key2:value2, …}數(shù)組結(jié)構(gòu)數(shù)組結(jié)構(gòu)以“[”開始,以“]”結(jié)束。中間部分由0個或多個以英文“,”分隔的值的列表組成。76[ value1, value2, …]{ "sno":"201802228888", "sname":"陳恒", "hobby":["籃球","足球"], "college":{ "cname":"清華大學(xué)", "city":"北京" }}?請思考:組合情況。2.5JSON數(shù)據(jù)交2.5.1JSON數(shù)據(jù)結(jié)構(gòu)2.5.2JSON數(shù)據(jù)轉(zhuǎn)換772.5.2JSON數(shù)據(jù)轉(zhuǎn)換為實現(xiàn)瀏覽器與控制器類之間的JSON數(shù)據(jù)交互,SpringMVC提供了MappingJackson2HttpMessageConverter實現(xiàn)類默認(rèn)處理JSON格式請求響應(yīng)。該實現(xiàn)類利用Jackson開源包讀寫JSON數(shù)據(jù),將Java對象轉(zhuǎn)換為JSON對象和XML文檔,同時也可以將JSON對象和XML文檔轉(zhuǎn)換為Java對象。jackson-annotations.jar:JSON轉(zhuǎn)換注解包。jackson-core.jar:JSON轉(zhuǎn)換核心包。jackson-databind.jar:JSON轉(zhuǎn)換的數(shù)據(jù)綁定包。78JSON格式轉(zhuǎn)換注解在使用注解開發(fā)時,需要用到兩個重要的JSON格式轉(zhuǎn)換注解,分別是@RequestBody和@ResponseBody。@RequestBody:用于將請求體中的數(shù)據(jù)綁定到方法的形參中,該注解應(yīng)用在方法的形參上。@ResponseBody:用于直接返回JSON對象,該注解應(yīng)用在方法上。通過一個實例來演示JSON數(shù)據(jù)交互過程。在該實例中,針對返回實體對象、ArrayList集合、Map<String,Object>集合以及List<Map<String,Object>>集合分別處理。791.創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)的JAR包創(chuàng)建Web應(yīng)用ch2_4,除了導(dǎo)入如2.2.1節(jié)所示的JAR包外,還需將JSON相關(guān)的3個JAR包(jackson-annotations-2.12.0.jar、jackson-databind-2.12.0.jar和jackson-core-2.12.0.jar)復(fù)制到WEB-INF/lib目錄中。802.創(chuàng)建Web和SpringMVC配置文件應(yīng)用ch2_4的Web配置文件web.xml與【例2-3】一樣,為節(jié)省篇幅,不再贅述。在應(yīng)用ch2_4的src目錄下,創(chuàng)建名為config的包,并在該包中創(chuàng)建SpringMVC配置文件springmvc.xml。81<context:component-scanbase-package="controller"/><mvc:annotation-driven/><mvc:resourceslocation="/js/"mapping="/js/**"></mvc:resources>3.創(chuàng)建JSP頁面,并引入jQuery首先從jQuery官方網(wǎng)站/download/下載jQuery插件:jquery-3.5.1.min.js,將其復(fù)制到Web項目開發(fā)目錄的WebContent/js目錄下。然后在JSP頁面中,通過<scripttype="text/javascript"src="js/jquery-3.5.1.min.js"></script>代碼將jquery-3.5.1.min.js引入當(dāng)前頁面中。在應(yīng)用ch2_4的WebContent目錄下創(chuàng)建JSP文件index.jsp,在該頁面中使用Ajax向控制器異步提交數(shù)據(jù)。824.創(chuàng)建實體類在應(yīng)用ch2_4的src目錄下,創(chuàng)建名為pojo的包,在該包中創(chuàng)建Person實體類。83packagepojo;publicclassPerson{ privateStringpname; privateStringpassword; privateIntegerpage; //省略set和get方法}5.創(chuàng)建控制器類在應(yīng)用ch2_4的src目錄下,創(chuàng)建名為controller的包,并在該包中創(chuàng)建TestController控制器類,在處理方法中使用@ResponseBody和@RequestBody注解進(jìn)行JSON數(shù)據(jù)交互。84@RequestMapping("/testJson")@ResponseBodypublicList<Map<String,Object>>testJson(@RequestBodyPersonuser){}6.測試應(yīng)用右擊應(yīng)用ch2_4,選擇RunAs/RunonServer發(fā)布并運行應(yīng)用。85本章內(nèi)容862.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程872.6.1攔截器的定義在SpringMVC框架中,定義一個攔截器可以通過兩種方式:一種是通過實現(xiàn)HandlerInterceptor接口或繼承HandlerInterceptor接口的實現(xiàn)類來定義;另一種是通過實現(xiàn)WebRequestInterceptor接口或繼承WebRequestInterceptor接口的實現(xiàn)類來定義。8889publicclassTestInterceptorimplementsHandlerInterceptor{ @Override publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler) throwsException{ } @Override publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler, ModelAndViewmodelAndView)throwsException{ } @Override publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex) throwsException{ }}實現(xiàn)HandlerInterceptor接口HandlerInterceptor接口中的方法preHandle()方法:該方法在控制器的處理請求方法前執(zhí)行,其返回值表示是否中斷后續(xù)操作。返回true表示繼續(xù)向下執(zhí)行,返回false表示中斷后續(xù)操作。postHandle()方法:該方法在控制器的處理請求方法調(diào)用之后,解析視圖之前執(zhí)行??梢酝ㄟ^此方法對請求域中的模型和視圖做進(jìn)一步的修改。afterCompletion()方法:該方法在控制器的處理請求方法執(zhí)行完成后執(zhí)行,即視圖渲染結(jié)束后執(zhí)行??梢酝ㄟ^此方法實現(xiàn)一些資源清理、記錄日志信息等工作。902.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程9192 <!--配置攔截器--> <mvc:interceptors> <!--配置一個全局?jǐn)r截器,攔截所有請求-->
<beanclass="interceptor.TestInterceptor"/> <mvc:interceptor> <!--配置攔截器作用的路徑--> <mvc:mappingpath="/**"/> <!--配置不需要攔截作用的路徑--> <mvc:exclude-mappingpath=""/> <!--定義在<mvc:interceptor>元素中,表示匹配指定路徑的請求才進(jìn)行攔截-->
<beanclass="interceptor.Interceptor1"/> </mvc:interceptor> <mvc:interceptor> <!--配置攔截器作用的路徑--> <mvc:mappingpath="/gotoTest"/>
<beanclass="interceptor.Interceptor2"/> </mvc:interceptor> </mvc:interceptors>2.6配置攔截器2.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程932.6.3攔截器的執(zhí)行流程在配置文件中,如果只定義了一個攔截器,程序首先將執(zhí)行攔截器類中的preHandle()方法,如果該方法返回true,程序?qū)⒗^續(xù)執(zhí)行控制器中處理請求的方法,否則中斷執(zhí)行。如果preHandle()方法返回true,并且控制器中處理請求的方法執(zhí)行后返回視圖前,將執(zhí)行postHandle()方法。返回視圖后,才執(zhí)行afterCompletion()方法。在需要Web應(yīng)用中,通常有多個攔截器同時工作,這時它們的preHandle()方法將按照配置文件中攔截器的配置順序執(zhí)行,而它們的postHandle()方法和afterCompletion()方法則按照配置順序的反序執(zhí)行。94【例2-5】多個攔截器的執(zhí)行過程1.創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)的JAR包創(chuàng)建Web應(yīng)用ch2_5,將如2.2.1節(jié)所示的JAR包復(fù)制到WEB-INF/lib目錄中。2.創(chuàng)建Web配置文件web.xml在WEB-INF目錄下,創(chuàng)建web.xml文件,該文件中的配置信息與【例2-1】相同,為節(jié)省篇幅,不再贅述。953.創(chuàng)建控制器類在src目錄下,創(chuàng)建名為controller的包,并在該包中創(chuàng)建控制器類InterceptorController。96@ControllerpublicclassInterceptorController{ @RequestMapping("/gotoTest") publicStringgotoTest(){ System.out.println("正在測試攔截器,執(zhí)行控制器的處理請求方法中"); return"test"; }}4.創(chuàng)建攔截器類在src目錄下,創(chuàng)建一個名為interceptor的包,并在該包中創(chuàng)建攔截器類TestInterceptor、Interceptor1和Interceptor2。TestInterceptor的代碼與2.6.1節(jié)的示例代碼相同,為節(jié)省篇幅,不再贅述。975.創(chuàng)建配置文件springmvc.xml在src目錄下,創(chuàng)建名為config的包,并在該包中創(chuàng)建配置文件springmvc.xml。在配置文件配置一個全局?jǐn)r截器和兩個局部攔截器。98?請思考:全局?jǐn)r截器與局部攔截器的區(qū)別是什么?6.創(chuàng)建視圖JSP文件99在WEB-INF目錄下,創(chuàng)建一個jsp文件夾,并在該文件夾中創(chuàng)建一個JSP文件test.jsp。<body>
視圖 <%System.out.println("視圖渲染結(jié)束。");%></body>7.測試攔截器首先,將應(yīng)用ch2_5發(fā)布到Tomcat服務(wù)器,并啟動Tomcat服務(wù)器。然后,通過地址http://localhost:8080/ch2_5/gotoTest測試攔截器。100?請思考:攔截器的執(zhí)行順序。本章內(nèi)容1012.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.7文件上傳文件上傳是一個SpringMVC應(yīng)用中經(jīng)常使用的功能,SpringMVC通過配置一個MultipartResolver來上傳文件。在SpringMVC的控制器中,可以通過MultipartFile來接收單個文件上傳,通過List<MultipartFile>來接收多個文件上傳。由于SpringMVC框架的文件上傳是基于commons-fileupload組件的文件上傳。因此,需要將commons-fileupload組件相關(guān)的jar(commons-fileupload.jar和commons-io.jar)拷貝到SpringMVC應(yīng)用的WEB-INF/lib目錄下?!纠?-6】上傳多個文件。1021
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微波爐采購合同(3篇)
- 幼兒園老師開家長會發(fā)言稿
- 中隊長述職報告范文
- 晉升轉(zhuǎn)正述職報告
- 銷售工作心得體會(35篇)
- 匆匆的讀書心得感想(33篇)
- 五年級下冊英語第4單元單詞表
- 青海省西寧市(2024年-2025年小學(xué)五年級語文)人教版階段練習(xí)(下學(xué)期)試卷及答案
- 上海市縣(2024年-2025年小學(xué)五年級語文)人教版小升初真題(下學(xué)期)試卷及答案
- 五年級數(shù)學(xué)(小數(shù)乘除法)計算題專項練習(xí)及答案匯編
- 中俄文運輸合同
- 醫(yī)療機(jī)構(gòu)環(huán)境表面清潔與消毒管理規(guī)范試題及答案
- 管理類檔案基本歸檔范圍及保管期限表
- 大班蒙氏數(shù)學(xué):多邊形
- 家長會空白簽到表
- 干燥溫度對中藥丸劑溶散時限的影響探討
- 六年級英語Unit1-How--can--I--get-there教材分析
- 車輛技術(shù)管理機(jī)構(gòu)設(shè)置及各崗位管理職責(zé)
- 針織學(xué)(雙語)課件Chapter2
- Q∕CR 549.2-2016 鐵路工程土工合成材料 第2部分:土工格柵
- EJA技術(shù)交流會資料
評論
0/150
提交評論