




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第二章SpringMVC授課教師:陳恒大連外國語大學本章目標了解SpringMVC的工作原理掌握基于注解的控制器的編寫方式了解數(shù)據(jù)綁定的基本原理掌握SpringMVC應用的開發(fā)步驟了解攔截器的基本用法1本章內(nèi)容22.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.1SpringMVC的工作原理3?請思考
SpringMVC框架的核心控制器是?SpringMVC的工作流程1.客戶端請求提交到DispatcherServlet;2.由DispatcherServlet控制器尋找一個或多個HandlerMapping,找到處理請求的Controller;3.DispatcherServlet將請求提交到Controller;4.Controller調(diào)用業(yè)務邏輯處理后,返回ModelAndView;5.DispatcherServlet尋找一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖;6.視圖負責將結(jié)果顯示到客戶端。4SpringMVC接口SpringMVC所有的請求都經(jīng)過DispatcherServlet接口來統(tǒng)一分發(fā)。DispatcherServlet將請求分發(fā)給Controller之前,需要借助于SpringMVC提供的HandlerMapping定位到具體的Controller。HandlerMapping接口負責完成客戶請求到Controller映射。Controller接口將處理用戶請求,這和JavaServlet扮演的角色是一致的。從宏觀角度考慮,DispatcherServlet是整個Web應用的控制器;從微觀考慮,Controller是單個Http請求處理過程中的控制器,而ModelAndView是Http請求過程中返回的模型(Model)和視圖(View)。ViewResolver接口(視圖解析器)在Web應用中負責查找View對象,從而將相應結(jié)果渲染給客戶。5本章內(nèi)容62.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標簽庫與數(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應用72.2.1SpringMVC所需要的JAR包對于SpringMVC框架的初學者,開發(fā)SpringMVC應用時,只需將Spring的4個基礎包、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)復制到Web應用的WEB-INF/lib目錄下即可。82.2SpringMVC的工作環(huán)境2.2.1SpringMVC所需要的JAR包2.2.2使用Eclipse開發(fā)SpringMVC的Web應用92.2.2使用Eclipse開發(fā)SpringMVC的Web應用【例2-1】SpringMVC入門程序的實現(xiàn)過程。1.創(chuàng)建Web應用ch2_1并導入JAR包創(chuàng)建Web應用ch2_1,導入如2.2.1節(jié)所示的JAR包。2.在web.xml文件中部署SpringMVC核心控制器DispatcherServlet在開發(fā)SpringMVC應用時,需要在WEB-INF目錄下,創(chuàng)建web.xml文件,并在該文件中部署DispatcherServlet。10部署SpringMVC核心控制器DispatcherServlet11<!--配置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應用首頁在ch2_1應用的WebContent目錄下,有個應用首頁index.jsp。12<body>
沒注冊的用戶,請<ahref="index/register">注冊</a>!<br>
已注冊的用戶,去<ahref="index/login">登錄</a>!</body>4.創(chuàng)建Controller類在ch2_1應用的src目錄下,創(chuàng)建包controller,并在該包中創(chuàng)建基于注解的名為“IndexController”的控制器類,該類中有兩個處理請求方法,分別處理首頁index.jsp中“注冊(index/register)”和“登錄(index/login)”超鏈接請求。13@Controller@RequestMapping("/index")publicclassIndexController{ @RequestMapping("/login") publicStringlogin(){ return"login"; } @RequestMapping("/register") publicStringregister(){ return"register"; }}?請思考
與前端請求URL是什么關(guān)系?5.創(chuàng)建SpringMVC的配置文件在SpringMVC中,使用掃描機制找到應用中所有基于注解的控制器類。所以,為了讓控制器類被SpringMVC框架掃描到,需要在配置文件中聲明spring-context,并使用<context:component-scan/>元素指定控制器類的基本包(請確保所有控制器類都在基本包及其子包下)。另外,需要在配置文件中定義SpringMVC的視圖解析器(ViewResolver)。14<!--使用掃描機制,掃描控制器類-->
<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.應用的其他頁面IndexController控制器的register方法處理成功后,跳轉(zhuǎn)到“/WEB-INF/jsp/register.jsp”視圖;IndexController控制器的login方法處理成功后,跳轉(zhuǎn)到“/WEB-INF/jsp/login.jsp”視圖。因此,應用的“/WEB-INF/jsp”目錄下應有“register.jsp”和“l(fā)ogin.jsp”頁面。15?請思考
與視圖解析器是什么關(guān)系?7.發(fā)布并運行SpringMVC應用在Eclipse中第1次運行SpringMVC應用時,需要將應用發(fā)布到Tomcat。例如,運行ch2_1應用時,可以右擊應用名稱ch2_1,選擇RunAs/RunonServer即完成發(fā)布并運行。16本章內(nèi)容172.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標簽庫與數(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應用@Autowired進行依賴注入2.3.7@ModelAttribute182.3.1Controller注解類型在SpringMVC中,使用org.springframework.stereotype.Controller注解類型聲明某類的實例是一個控制器。例如,2.2.2節(jié)中的IndexController控制器類。別忘了在SpringMVC的配置文件中使用<context:component-scan/>元素(見【例2-1】)指定控制器類的基本包,進而掃描所有注解的控制器類。192.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應用@Autowired進行依賴注入2.3.7@ModelAttribute202.3.2RequestMapping注解類型在基于注解的控制器類中,可以為每個請求編寫對應的處理方法。如何將請求與處理方法一一對應呢?需要使用org.springframework.web.bind.annotation.RequestMapping注解類型將請求與處理方法一一對應。21方法級別注解22@ControllerpublicclassIndexController{
@RequestMapping(value="/index/login") publicStringlogin(){ /**login代表邏輯視圖名稱,需要根據(jù)SpringMVC配置中 *internalResourceViewResolver的前綴和后綴找到對應的物理視圖 */ return"login"; }
@RequestMapping(value="/index/register") publicStringregister(){ return"register"; }}
注解的value屬性將請求URI映射到方法,value屬性是RequestMapping注解的默認屬性,如果就一個value屬性,則可省略該屬性??梢允褂萌缦耈RL訪問login方法(請求處理方法):http://localhost:xxx/yyyy/index/login類級別注解23@Controller@RequestMapping("/index")publicclassIndexController{
@RequestMapping("/login") publicStringlogin(){ return"login"; }
@RequestMapping("/register") publicStringregister(){ return"register"; }}為了方便程序維護,建議開發(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應用@Autowired進行依賴注入2.3.7@ModelAttribute24請求處理方法中常出現(xiàn)的參數(shù)類型25@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類型。262.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應用@Autowired進行依賴注入2.3.7@ModelAttribute27通過實體bean接收請求參數(shù)通過一個實體bean來接收請求參數(shù),適用于get和post請求方式。需要注意的是,bean的屬性名稱必須與請求參數(shù)名稱相同。28<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ù)寫在控制器類相應方法的形參中,即形參名稱與請求參數(shù)名稱完全相同。該接收參數(shù)方式適用于get和post請求方式。29 @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表達式取出model的uname值 model.addAttribute("uname",uname); return"register";//返回register.jsp } }通過@RequestParam接收請求參數(shù)通過@RequestParam接收請求參數(shù),適用于get和post請求方式。30publicStringregister(@RequestParamStringuname,@RequestParamStringupass,Modelmodel){ if("zhangsan".equals(uname) &&"123456".equals(upass)){ return"login";//注冊成功,跳轉(zhuǎn)到login.jsp }else{ //在register.jsp頁面上可以使用EL表達式取出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)容)。312.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫請求處理方法2.3.4Controller接收請求參數(shù)的常見方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應用@Autowired進行依賴注入2.3.7@ModelAttribute322.3.5重定向與轉(zhuǎn)發(fā)在SpringMVC框架中,控制器類中處理方法的return語句默認就是轉(zhuǎn)發(fā)實現(xiàn),只不過實現(xiàn)的是轉(zhuǎn)發(fā)到視圖。在SpringMVC框架中,不管重定向或轉(zhuǎn)發(fā),都需要符合視圖解析器的配置,如果直接重定向到一個不需要DispatcherServlet的資源,如:return"redirect:/html/my.html";33//轉(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應用@Autowired進行依賴注入2.3.7@ModelAttribute342.3.6應用@Autowired進行依賴注入SpringMVC框架本身就是一個非常優(yōu)秀的MVC框架,它具有一個依賴注入的優(yōu)點??梢酝ㄟ^org.springframework.beans.factory.annotation.Autowired注解類型將依賴注入到一個屬性(成員變量)或方法,如:在SpringMVC中,為了能被作為依賴注入,服務層的類必須使用org.springframework.stereotype.Service注解類型注明為@Service(一個服務)。另外,還需要在配置文件中使用<context:component-scanbase-package="基本包"/>元素來掃描依賴基本包。35@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應用@Autowired進行依賴注入2.3.7@ModelAttribute36綁定請求參數(shù)到實體對象(表單的命令對象)37@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)限,當然控制登錄權(quán)限的方法很多,例如攔截器、過濾器等。38publicclassBaseController{
@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(){}}本章內(nèi)容392.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.4表單標簽庫與數(shù)據(jù)綁定2.4.1表單標簽庫2.4.2數(shù)據(jù)綁定402.4.1表單標簽庫表單標簽庫中包含了可以用在JSP頁面中渲染HTML元素的標簽。JSP頁面使用Spring表單標簽庫時,必須在JSP頁面開頭處聲明taglib指令,指令代碼如下:表單標簽庫中有form、input、password、hidden、textarea、checkbox、checkboxes、radiobutton、radiobuttons、select、option、options、errors等標簽。41<%@taglibprefix="form"uri="/tags/form"%>表單標簽42<form:formmodelAttribute="xxx"method="post"action="xxx">
……</form:form>@RequestMapping(value="/input")publicStringinputUser(Modelmodel){ …… model.addAttribute("user",newUser()); return"userAdd";}<form:formmodelAttribute="user"method="post"action="user/save">
……</form:form>!注意:在inputUser方法中,如果沒有Model屬性user,userAdd.jsp頁面就會拋出異常,因為表單標簽無法找到在其modelAttribute屬性中指定的formbackingobject。input標簽43<form:formmodelAttribute="user"method="post"action="user/save"> <form:input
path="userName"/></form:form>上述代碼,將輸入值綁定到user對象的userName屬性。password標簽、hidden標簽、textarea標簽password標簽、hidden標簽、textarea標簽與input標簽用法一致,不再贅述。44checkbox標簽多個path相同的checkbox標簽,它們是一個選項組,允許多選。選項值綁定到一個數(shù)組屬性。上述示例代碼中復選框的值綁定到一個字符串數(shù)組屬性friends(String[]friends)。45<form:checkboxpath="friends"value="張三"/>張三<form:checkboxpath="friends"value="李四"/>李四<form:checkboxpath="friends"value="王五"/>王五<form:checkboxpath="friends"value="趙六"/>趙六checkboxes標簽checkboxes標簽渲染多個復選框,是一個選項組,等價于多個path相同的checkbox標簽。它有3個非常重要的屬性:items、itemLabel和itemValue。items:用于生成input元素的Collection、Map或Array。itemLabel:items屬性中指定的集合對象的屬性,為每個input元素提供label。itemValue:items屬性中指定的集合對象的屬性,為每個input元素提供value。<form:checkboxesitems="xxx"path="xxx"/><form:checkboxesitems="${hobbys}"path="hobby"/>46radiobutton標簽<form:radiobuttonpath="xxx"value="xxx"/>多個path相同的radiobutton標簽,它們是一個選項組,只允許單選。47radiobuttons標簽radiobuttons標簽渲染多個radio,是一個選項組,等價于多個path相同的radiobutton標簽。radiobuttons標簽,語法格式如下:<form:radiobuttonspath="xxx"items="xxx"/>該標簽的itemLabel和itemValue屬性與checkboxes標簽的itemLabel和itemValue屬性完全一樣,但只允許單選。48select標簽select標簽的選項可能來自其屬性items指定的集合,或者來自一個嵌套的option標簽或options標簽。49<form:selectpath="xxx"items="xxx"/><form:selectpath="xxx"items="xxx"> <optionvalue="xxx">xxx</option></form:select><form:selectpath="xxx"><form:optionsitems="xxx"/></form:select>2.4表單標簽庫與數(shù)據(jù)綁定2.4.1表單標簽庫2.4.2數(shù)據(jù)綁定502.4.2數(shù)據(jù)綁定為了讓讀者進一步學習數(shù)據(jù)綁定和表單標簽,本節(jié)給出了一個應用實例ch2_3。ch2_3應用中實現(xiàn)了User類屬性和JSP頁面中表單參數(shù)的綁定,同時在JSP頁面中分別展示了input、textarea、checkbox、checkboxs、select等標簽。511.創(chuàng)建應用并導入相關(guān)的JAR包在ch2_3應用中需要使用JSTL標簽,因此,不僅需要將SpringMVC相關(guān)jar包拷貝到應用的WEN-INF/lib目錄下,還需要從Tomcat的webapps\examples\WEB-INF\lib目錄下,將JSTL相關(guān)jar包(taglibs-standard-impl-1.2.5.jar和taglibs-standard-spec-1.2.5.jar)拷貝到應用的WEN-INF/lib目錄下。522.創(chuàng)建Web和SpringMVC配置文件在WEB-INF目錄中創(chuàng)建web.xml,為了避免中文亂碼問題,需要在web.xml中配置編碼過濾器,同時JSP頁面編碼設置為UTF-8,form表單的提交方式為post。在src目錄中,創(chuàng)建名為config的包,并在該包中創(chuàng)建SpringMVC的配置文件springmvc.xml。533.創(chuàng)建View層View層包含兩個JSP頁面,一個是信息輸入頁面userAdd.jsp,一個是信息顯示頁面userList.jsp。在ch2_3應用的WEB-INF/jsp/目錄下,創(chuàng)建此兩個JSP頁面。在userAdd.jsp頁面中將Map類型的hobbys綁定到了checkboxes上,將String[]類型的carrers和houseRegisters綁定到select上,實現(xiàn)通過option標簽對select添加選項,同時表單的method方法需指定為post來避免中文亂碼問題。544.創(chuàng)建領(lǐng)域模型應用中實現(xiàn)User類屬性和JSP頁面表單參數(shù)的綁定,User類包含和表單參數(shù)名對應的屬性,以及屬性的set和get方法。在ch2_3應用的src目錄下,創(chuàng)建包pojo,并在該包中創(chuàng)建User類。55packagepojo;publicclassUser{ privateStringuserName; privateString[]hobby;//興趣愛好 privateString[]friends;//朋友 privateStringcarrer; privateStringhouseRegister; privateStringremark; //省略setter和getter方法}5.創(chuàng)建Service層在Service層使用靜態(tài)集合變量users模擬數(shù)據(jù)庫存儲用戶信息,包括添加用戶和查詢用戶兩個功能方法。在ch2_3應用的src目錄下,創(chuàng)建包service,并在該包中創(chuàng)建UserService接口和UserServiceImpl實現(xiàn)類。566.創(chuàng)建Controller層在Controller類UserController中定義請求處理方法,其中包括處理user/input請求的inputUser方法,以及user/save請求的addUser方法。在UserController類中,通過@Autowired注解注入UserService對象,實現(xiàn)對user對象的添加和查詢等操作;通過model的addAttribute方法將User類對象、HashMap類型的hobbys對象、String[]類型的carrers對象以及String[]類型的houseRegisters對象傳遞給View(userAdd.jsp)。在ch2_3應用的src目錄下,創(chuàng)建包controller,并在該包中創(chuàng)建UserController控制器類。577.測試應用通過地址http://localhost:8080/ch2_3/user/input測試應用,添加用戶信息頁面效果如圖2.2所示。58?請思考:數(shù)據(jù)綁定的意義是?本章內(nèi)容592.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標簽庫與數(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)換60對象結(jié)構(gòu)對象結(jié)構(gòu)以“{”開始,以“}”結(jié)束。中間部分由0個或多個以英文“,”分隔的key/value對構(gòu)成,key和value之間以英文“:”分隔。其中,key必須為String類型,value可以是String、Number、Object、Array等數(shù)據(jù)類型。61{ key1:value1, key2:value2, …}數(shù)組結(jié)構(gòu)數(shù)組結(jié)構(gòu)以“[”開始,以“]”結(jié)束。中間部分由0個或多個以英文“,”分隔的值的列表組成。62[ value1, value2, …]{ "sno":"201802228888", "sname":"陳恒", "hobby":["籃球","足球"], "college":{ "cname":"清華大學", "city":"北京" }}?請思考:組合情況。2.5JSON數(shù)據(jù)交2.5.1JSON數(shù)據(jù)結(jié)構(gòu)2.5.2JSON數(shù)據(jù)轉(zhuǎn)換632.5.2JSON數(shù)據(jù)轉(zhuǎn)換為實現(xiàn)瀏覽器與控制器類之間的JSON數(shù)據(jù)交互,SpringMVC提供了MappingJackson2HttpMessageConverter實現(xiàn)類默認處理JSON格式請求響應。該實現(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ù)綁定包。64JSON格式轉(zhuǎn)換注解在使用注解開發(fā)時,需要用到兩個重要的JSON格式轉(zhuǎn)換注解,分別是@RequestBody和@ResponseBody。@RequestBody:用于將請求體中的數(shù)據(jù)綁定到方法的形參中,該注解應用在方法的形參上。@ResponseBody:用于直接返回JSON對象,該注解應用在方法上。通過一個實例來演示JSON數(shù)據(jù)交互過程。在該實例中,針對返回實體對象、ArrayList集合、Map<String,Object>集合以及List<Map<String,Object>>集合分別處理。651.創(chuàng)建Web應用并導入相關(guān)的JAR包創(chuàng)建Web應用ch2_4,除了導入如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)復制到WEB-INF/lib目錄中。662.創(chuàng)建Web和SpringMVC配置文件應用ch2_4的Web配置文件web.xml與【例2-3】一樣,為節(jié)省篇幅,不再贅述。在應用ch2_4的src目錄下,創(chuàng)建名為config的包,并在該包中創(chuàng)建SpringMVC配置文件springmvc.xml。67<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,將其復制到Web項目開發(fā)目錄的WebContent/js目錄下。然后在JSP頁面中,通過<scripttype="text/javascript"src="js/jquery-3.5.1.min.js"></script>代碼將jquery-3.5.1.min.js引入當前頁面中。在應用ch2_4的WebContent目錄下創(chuàng)建JSP文件index.jsp,在該頁面中使用Ajax向控制器異步提交數(shù)據(jù)。684.創(chuàng)建實體類在應用ch2_4的src目錄下,創(chuàng)建名為pojo的包,在該包中創(chuàng)建Person實體類。69packagepojo;publicclassPerson{ privateStringpname; privateStringpassword; privateIntegerpage; //省略set和get方法}5.創(chuàng)建控制器類在應用ch2_4的src目錄下,創(chuàng)建名為controller的包,并在該包中創(chuàng)建TestController控制器類,在處理方法中使用@ResponseBody和@RequestBody注解進行JSON數(shù)據(jù)交互。70@RequestMapping("/testJson")@ResponseBodypublicList<Map<String,Object>>testJson(@RequestBodyPersonuser){}6.測試應用右擊應用ch2_4,選擇RunAs/RunonServer發(fā)布并運行應用。71本章內(nèi)容722.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程732.6.1攔截器的定義在SpringMVC框架中,定義一個攔截器可以通過兩種方式:一種是通過實現(xiàn)HandlerInterceptor接口或繼承HandlerInterceptor接口的實現(xiàn)類來定義;另一種是通過實現(xiàn)WebRequestInterceptor接口或繼承WebRequestInterceptor接口的實現(xiàn)類來定義。7475publicclassTestInterceptorimplementsHandlerInterceptor{ @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í)行。可以通過此方法對請求域中的模型和視圖做進一步的修改。afterCompletion()方法:該方法在控制器的處理請求方法執(zhí)行完成后執(zhí)行,即視圖渲染結(jié)束后執(zhí)行??梢酝ㄟ^此方法實現(xiàn)一些資源清理、記錄日志信息等工作。762.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程7778 <!--配置攔截器--> <mvc:interceptors> <!--配置一個全局攔截器,攔截所有請求-->
<beanclass="interceptor.TestInterceptor"/> <mvc:interceptor> <!--配置攔截器作用的路徑--> <mvc:mappingpath="/**"/> <!--配置不需要攔截作用的路徑--> <mvc:exclude-mappingpath=""/> <!--定義在<mvc:interceptor>元素中,表示匹配指定路徑的請求才進行攔截-->
<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í)行流程792.6.3攔截器的執(zhí)行流程在配置文件中,如果只定義了一個攔截器,程序首先將執(zhí)行攔截器類中的preHandle()方法,如果該方法返回true,程序?qū)⒗^續(xù)執(zhí)行控制器中處理請求的方法,否則中斷執(zhí)行。如果preHandle()方法返回true,并且控制器中處理請求的方法執(zhí)行后返回視圖前,將執(zhí)行postHandle()方法。返回視圖后,才執(zhí)行afterCompletion()方法。在需要Web應用中,通常有多個攔截器同時工作,這時它們的preHandle()方法將按照配置文件中攔截器的配置順序執(zhí)行,而它們的postHandle()方法和afterCompletion()方法則按照配置順序的反序執(zhí)行。80【例2-5】多個攔截器的執(zhí)行過程1.創(chuàng)建Web應用并導入相關(guān)的JAR包創(chuàng)建Web應用ch2_5,將如2.2.1節(jié)所示的JAR包復制到WEB-INF/lib目錄中。2.創(chuàng)建Web配置文件web.xml在WEB-INF目錄下,創(chuàng)建web.xml文件,該文件中的配置信息與【例2-1】相同,為節(jié)省篇幅,不再贅述。813.創(chuàng)建控制器類在src目錄下,創(chuàng)建名為controller的包,并在該包中創(chuàng)建控制器類InterceptorController。82@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é)省篇幅,不再贅述。835.創(chuàng)建配置文件springmvc.xml在src目錄下,創(chuàng)建名為config的包,并在該包中創(chuàng)建配置文件springmvc.xml。在配置文件配置一個全局攔截器和兩個局部攔截器。84?請思考:全局攔截器與局部攔截器的區(qū)別是什么?6.創(chuàng)建視圖JSP文件85在WEB-INF目錄下,創(chuàng)建一個jsp文件夾,并在該文件夾中創(chuàng)建一個JSP文件test.jsp。<body>
視圖 <%System.out.println("視圖渲染結(jié)束。");%></body>7.測試攔截器首先,將應用ch2_5發(fā)布到Tomcat服務器,并啟動Tomcat服務器。然后,通過地址http://localhost:8080/ch2_5/gotoTest測試攔截器。86?請思考:攔截器的執(zhí)行順序。本章內(nèi)容872.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標簽庫與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.7文件上傳文件上傳是一個SpringMVC應用中經(jīng)常使用的功能,SpringMVC通過配置一個MultipartResolver來上傳文件。在SpringMVC的控制器中,可以通過MultipartFile來接收單個文件上傳,通過List<MultipartFile>來接收多個文件上傳。由于SpringMVC框架的文件上傳是基于commons-fileupload組件的文件上傳。因此,需要將commons-fileupload組件相關(guān)的jar(commons-fileupload.jar和commons-io.jar)拷貝到SpringMVC應用的WEB-INF/lib目錄下。【例2-6】上傳多個文件。
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙銷售茶葉合同范本
- 農(nóng)業(yè)維護協(xié)議合同范本
- 辦公耗材批發(fā)合同范本
- 醫(yī)院保潔耗材合同范本
- 合同范本由誰出
- 售賣蛋糕合同范本
- 受托付款合同范例
- 員工社保合同范本
- 合同范本個可以獲取
- 廚師勞務派遣服務合同范本
- 2025年榆林市公共交通總公司招聘(57人)筆試參考題庫附帶答案詳解
- 醫(yī)院培訓課件:《多發(fā)性骨髓瘤》
- 【新】部編人教版小學4四年級《道德與法治》下冊全冊教案
- 2025年湖南省長沙市單招職業(yè)傾向性測試題庫及參考答案
- 《產(chǎn)業(yè)轉(zhuǎn)移》課件:機遇與挑戰(zhàn)
- 十八項核心制度培訓課件
- 2024年遠程教育行業(yè)市場運營現(xiàn)狀及行業(yè)發(fā)展趨勢報告
- 2025年2月上海市高三聯(lián)考高考調(diào)研英語試題(答案詳解)
- 三好學生競選12
- 2024-2025學年六年級上學期數(shù)學第三單元3.1-搭積木比賽(教案)
- DeepSeek從入門到精通
評論
0/150
提交評論