框架springmvc8 SpringMVC表單標(biāo)簽處理靜態(tài)資源_第1頁(yè)
框架springmvc8 SpringMVC表單標(biāo)簽處理靜態(tài)資源_第2頁(yè)
框架springmvc8 SpringMVC表單標(biāo)簽處理靜態(tài)資源_第3頁(yè)
框架springmvc8 SpringMVC表單標(biāo)簽處理靜態(tài)資源_第4頁(yè)
框架springmvc8 SpringMVC表單標(biāo)簽處理靜態(tài)資源_第5頁(yè)
已閱讀5頁(yè),還剩123頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

SpringMVC框架的內(nèi)SpringMVCSpringMVC概述SpringMVC 使用 映射請(qǐng)映射請(qǐng)求參數(shù)&請(qǐng)求頭RESTfulSpringMVC表 &處理靜態(tài)資數(shù)據(jù)轉(zhuǎn)換&數(shù)據(jù)格式化&數(shù)據(jù)校驗(yàn) 使 15.SpringMVC運(yùn)行流程16.在Spring的環(huán)境下使用SpringMVC17.SpringMVC對(duì)比Struts2第一章SpringMVCSpringMVC①SpringMVCWebMVC②Spring3.0后全面Struts2,成為最優(yōu)秀的MVC框架③SpringMVCMVCPOJO成為處理請(qǐng)求的控制器,而無(wú)須實(shí)現(xiàn)④REST風(fēng)格的URL⑤采用了松散耦合可插拔組件結(jié)構(gòu),比其他MVC①M(fèi)VCWeb層應(yīng)用框架②SpringSpringRestfulWebURL Marker等等APIModel里(Map數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),API支持靈活的本地化、等解SpringwebjarWebstruts2一樣,基于請(qǐng)求-HandlerMap:請(qǐng)求映射到處理器,找處理,如果映射成功返回一個(gè)HandlerExecutiongChain對(duì)象(Handler處理器(頁(yè)面控制器)對(duì)象、多個(gè)HandlerInterceptor器對(duì)象)ViewResolver:視圖解析器,找處理返回的頁(yè)面。把邏輯視圖解析為具體View,進(jìn)行這種策略模式,很容易更換其他視圖技術(shù);InternalResourceViewResolverJSP Web工程,加入jar包 在web.xml中配置<!--配置<!--配置控制器:--><!--配置DispatcherServlet<servlet- /*RESTURLREST</servlet- 實(shí)際上也可以不通過(guò)contextConfigLocation來(lái)配置SpringMVC的配置文件,而使用默認(rèn)的.默認(rèn)的配置文件為:/WEB-INF/<servlet-name>-servlet.xml 加入SpringMVC的配置文件:<ponent-scanbase-<beanid="internalResourceViewResolver"<propertyname="prefix"value="/WEB-<propertyname="suffix" 需要?jiǎng)?chuàng)建一個(gè)頁(yè)面 oworld">o packagepackageimportimport @Controllerpublic oWorldControllerStruts2中action映射配置的action1.使用 注解來(lái)映射請(qǐng)求的2.返回值會(huì)通過(guò)視圖解析器解析為實(shí)際的物理視圖,對(duì)于InternalResourceViewResolver通過(guò)prefixreturnValsuffix**/WEB- publicString }} <h4>Sucess<h4>Sucess ①oWorld請(qǐng)求流程圖解②一般請(qǐng)求的映射路徑名稱和處理請(qǐng)求的方法名稱最好一致(實(shí)質(zhì)上方法名稱任意 publicString //publicStringabc123(){ return"success";}③他把“/WEB-INF/views/”配置成了"/WEB-<beanid="internalResourceViewResolver"<beanid="internalResourceViewResolver"<propertyname="prefix"value="/WEB-<propertyname="suffix"④publicpublicenumRequestMethodGET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,}⑤@RequestMap可以應(yīng)用在什么地@Target({ElementType.@Target({ElementType.METHOD,ElementType.TYPE}) public@interface ⑥D(zhuǎn)ebug,由DispatcherServlet控制器查詢一個(gè)或多個(gè)HandlerMap,找到處理請(qǐng)求DispatcherServletController(ControllerDispatcherServletViewResolerModelAndView第二章@RequestMap映@RequestMap映射請(qǐng)求注SpringMVC使用@RequestMap注解為控制器指定可以處理哪些URL請(qǐng)?jiān)诳刂破鞯念惗x及方法定義處標(biāo)記在類上:提供初步的請(qǐng)求映射信息。相對(duì)于WEB標(biāo)記在方法上URL若類上未標(biāo)注@RequestMap則方法處標(biāo)記的URL相對(duì)于WEB應(yīng)用的根目作用:DispatcherServlet截獲請(qǐng)求后就通過(guò)控制器上@RequestMap提供的映射@RequestMap源碼參packageorg.springframework.web.bind.annotation;@Target({ElementType.METHOD,ElementType.TYPE})@Retention(Retention.RUNTIME)@public@interfaceRequestMap{String[]value()default{};RequestMethod[]method()default{};String[]params()default{};String[]headers()default{};String[]consumes()default{};String[]produces()default{};}定義頁(yè)面、控制器方<a oworld">test@RequestMap //Bean對(duì)象,為一個(gè)控制器組@RequestMap("/springmvc")publicclassoWorldController{Struts2action映射配置的,action名*1使用@RequestMap注解來(lái)映射請(qǐng)求的*2返回值會(huì)通過(guò)視圖解析器解析為實(shí)際的物理視圖,對(duì)于InternalResourceViewResolver視圖解析器,通過(guò)prefix+returnVal+后綴這樣的方式得到實(shí)際的物理視圖,然會(huì)做轉(zhuǎn)發(fā)操@RequestMap(value="/ publicStringoworld(){return"success"}} 標(biāo)準(zhǔn)的HTTP請(qǐng)求報(bào)頭@RequestMap除了可以使用請(qǐng)求URL映射請(qǐng)求外,還可以使用請(qǐng)求方法、請(qǐng)求參數(shù)③params和headersparam1:表示請(qǐng)求必須包含名為param1的請(qǐng)求參數(shù)!param1:表示請(qǐng)求不能包含名為param1的請(qǐng)求參數(shù)param1value1:表示請(qǐng)求包含名為param1的請(qǐng)求參數(shù),但其值不能為{"param1=value1"param2"}:請(qǐng)求必須包含名為param1和param2的兩個(gè)請(qǐng)求參數(shù),且param1參數(shù)的值必須為 @RequestMap("/springmvc")publicclassSpringMVCController{publicStringtestMethord(){return"success";}} get<a POST<form<formaction="springmvc/testMethord"<inputtype="submit" RequestMap_請(qǐng)求參數(shù)&請(qǐng)求頭【了解//了解:可以使用params和headersparams和headers支持簡(jiǎn)單的表達(dá)式. params={"username","age!=10"},headers={"Accept-Language=en-US,zh;q=0.8"publicStringtestParamsAndHeaders(){return"success";} <a Chromdebug<a四月11,20164:48:08下午org.springframework.web.servlet.PageNotFound警告:Nomatchinghandlermethodfoundforservletrequest:path'/springmvc/testParamsAndHeaders',methodparameters四月11,20164:51:01下午org.springframework.web.servlet.PageNotFound警告:Nomatchinghandlermethodfoundforservletrequest:path'/springmvc/testParamsAndHeaders',method'GET',parametersmap['username'->array<String>['atgugu'],'age'->array<String>['10']]<a四月11,20165:05:24下午org.springframework.web.servlet.PageNotFound警告:Nomatchinghandlermethodfoundforservletrequest:path'/springmvc/testParamsAndHeaders',method'GET',parametersmap['age'->array<String>['11']]RequestMap支持Ant路徑風(fēng)Ant風(fēng)格資源地址支持3種匹配符*:**:**匹配多層路徑@RequestMap還支持Ant風(fēng)格的匹配/user/aaa/createUser、/user/bbb/createUser等匹配/user/createUser、/user/aaa/bbb/createUser等匹配/user/createUseraa、/user/createUserbb等 //Ant風(fēng)格資源地址支持3種匹配符 publicStringtestAntPath(){return} Ant風(fēng)格資源地址支持3種匹配符--><a<a<a 映射URL綁定的占位符帶占位符的URL是Spring3.0新增的功能,該功能在SpringMVC向REST目標(biāo)挺進(jìn)發(fā)通過(guò)@PathVariable可以將URL中占位符參數(shù)綁定到控制器處理方法的入?yún)⒅蠻RL中的{xxx}占位符可以通過(guò)@PathVariable("xxx 注解可以將請(qǐng)求publicStringtestPathVariable(@PathVariable("id")Integerid){return} <!--測(cè)試@PathVariable<a第三章HiddenHttpMethodFilterRepesentatioalTransferREST博士在2000年他的博 中提出來(lái)的一種軟件架構(gòu)風(fēng)格WebREST模式的WebSOAPXML-RPCwebREST 提供接近REST風(fēng)格的Web服務(wù)進(jìn)行查找;雅虎提供的Web服務(wù)也是REST風(fēng)格的。①理解本真的REST架構(gòu)風(fēng)格 ②深入淺出REST: REST①REST:即RepresentationalStateTransfer(資源)表現(xiàn)層狀態(tài)轉(zhuǎn)化。是目前最流行的越多的采用(Resources它可以是一段文本、一張、一首歌曲、一種服務(wù),總之就是一個(gè)具體的存在。可以用一個(gè)URI(統(tǒng)一資源定位符)指向它,每種資源對(duì)應(yīng)一個(gè)特定的URI。獲取這個(gè)資源,它的URI就可以,因此URI即為每一個(gè)資源的獨(dú)一無(wú)二的識(shí)表現(xiàn)層(Representation):把資源具體呈現(xiàn)出來(lái)的形式,叫做它的表現(xiàn)層(Representation格式、JSON格式表現(xiàn),甚至可以采用二進(jìn)制格式。TransferHTTPTransfe

具體說(shuō),就是HTTP協(xié)議里面,四個(gè)表示操作方式的動(dòng)詞:GET、POST、PUT它們分別對(duì)應(yīng)四種基本操作:GET用來(lái)獲取資源,POST用來(lái)新建資源,PUT用來(lái)更新資源,DELETE用來(lái)刪除資源。②URL/order/1HTTPGET:得到id1的/order/1HTTPDELETE:刪除id1的/order/1HTTPPUTid1的 HTTPPOST:新增③formGETPOSTDELETEPUTmethodSpring3.0httpGET、POST、PUT與DELETE請(qǐng)求。①HiddenHttpMethodFilter<!--支持<!--支持REST風(fēng)格的過(guò)濾器:可以將POST請(qǐng)求轉(zhuǎn)換為PUT或DELETE請(qǐng)求--> ②1.測(cè)試REST風(fēng)格 GET,POST,PUT,DELETE操CRUDorderorder/1order/1*刪除:/order/12PUTDELETEPOST③.需要在發(fā)送POST請(qǐng)求時(shí)攜帶一個(gè)name="_method"的隱含域,值為PUT或3SpringMVCid使用@PathVariable publicStringtestRESTGet(@PathVariable(value="id")Integerid){System.out.println("testRESTGetid="+id);return"success";} publicStringtestRESTPost(){return"success";} publicStringtestRESTPut(@PathVariable("id")Integerid){System.out.println("testRESTPutid="+id);return"success";}publicStringtestRESTDelete(@PathVariable("id")Integerid){System.out.println("testRESTDeleteid="+id);return"success";}③<!--實(shí)驗(yàn)1測(cè)試REST風(fēng)格GET請(qǐng)求--><!--實(shí)驗(yàn)2測(cè)試REST風(fēng)格POST請(qǐng)求--><inputtype="submit"<!--實(shí)驗(yàn)3測(cè)試REST風(fēng)格PUT請(qǐng)求--><formaction="springmvc/testRESTPut/1"<inputtype="hidden"name="_method"<inputtype="submit"<!--實(shí)驗(yàn)4測(cè)試REST風(fēng)格DELETE請(qǐng)求--><formaction="springmvc/testRESTDelete/1"<inputtype="hidden"name="_method"<inputtype="submit"為什么請(qǐng)求隱含參數(shù)名稱必須叫做第四章HTTPSpringMVC對(duì)控制器處理方法簽名的限制是很寬松的,幾乎可以按喜歡的任何方式對(duì)必要時(shí)可以對(duì)方法及方法入?yún)?biāo)注相應(yīng)的注解(@PathVariable、@RequestParam@RequestHeader等SpringMVC框架會(huì)將HTTP在處理方法入?yún)⑻幨褂聾RequestParamrequired:是否必須。默認(rèn)為true,表示請(qǐng)求參數(shù)中必須包含對(duì)應(yīng)的參數(shù),若不存在,defaultValue:①@RequestParam注解用于映射請(qǐng)求參數(shù)value用于映射請(qǐng)求參數(shù)名稱requireddefaultValuepublicStringtestRequestParam(@RequestParam(value="age",required=false,defaultValue="0")intage){System.out.println("testRequestParam-username="+username+",age="+age);return}②<!--測(cè)試請(qǐng)求參數(shù)@RequestParam注解使用-->>@RequestHeader使用@RequestHeader綁定請(qǐng)求報(bào)頭的屬性值請(qǐng)求頭包含了若干個(gè)屬性,服務(wù)器可據(jù)此獲知客戶端的信息,通過(guò)//了解:映射請(qǐng)求頭信息用法同@RequestParampublicStringtestRequestHeader(@RequestHeader(value="Accept-Language")Stringal){System.out.println("testRequestHeader-Accept-Language:"+al);return}<!--測(cè)試請(qǐng)求頭@RequestHeader注解使用--><a Value使用@Value綁定請(qǐng)求中的 Value可讓處理方法入?yún)⒔壎硞€(gè) //了解:@Value:映射一個(gè)值.屬性同@RequestParam@RequestMap("/testValue")publicStringtestValue(@ Value("JSESSIONID")StringsessionId){System.out.println("testValue:sessionId:"+sessionId);return} <!--測(cè)試請(qǐng)求@Value注解使用--<ahref="springmvc/testValue">testPOJO使用POJO對(duì)象綁定請(qǐng)求參數(shù)值SpringMVC會(huì)按請(qǐng)求參數(shù)名和POJO屬性名進(jìn)行自動(dòng)匹配,自動(dòng)為該對(duì)象填充屬性值。支持級(jí)聯(lián)屬性。如:dept.deptId、dept.address.等 SpringMVC會(huì)按請(qǐng)求參數(shù)名和POJO屬性名進(jìn)行自動(dòng)匹配,自動(dòng)為該對(duì)象填充屬性如:dept.deptId、dept.address.@RequestMap("/testPOJO")publicStringtestPojo(Useruser){System.out.println("testPojo:"+user);return"success";}<!--測(cè)試POJO對(duì)象傳參,支持級(jí)聯(lián)屬性--><formaction="testPOJO"username:<inputtype="text"name="username"/><br> :<inputtype="text"name=""/><br>age:<inputtype="text"name="age"/><br>city:<inputtype="text"province:<inputtype="text"<inputtype="submit" }}privateAddress;privateprivateintpublicclassUserprivateIntegerid;privateStringprivateStringpackage}privateStringprivateStringpublicclassAddresspackage (HiddenHttpMethodFilter ServletAPIMVC的Handler方法可以接受哪些ServletAPI類型的參數(shù)源碼參考:AnnotationMethodHandlerAdapter NativeWebRequestwebRequest)throwsException{ if(ServletRequest.class.isAssignableFrom(parameterType)||MultipartRequest.class.isAssignableFrom(parameterType)){ObjectnativeRequest=webRequest.getNativeRequest(parameterType);if(nativeRequest==null){thrownew"Currentrequestisnotoftype["+parameterType.getName()+"]:"+}return}elseif(ServletResponse.class.isAssignableFrom(parameterType)){this.responseArgumentUsed=true;ObjectnativeResponse=webRequest.getNativeResponse(parameterType);if(nativeResponse==null){thrownew"Currentresponseisnotoftype["+parameterType.getName()+"]:"+}return}elseif(HttpSession.class.isAssignableFrom(parameterType)){returnrequest.getSession();}elseif(Principal.class.isAssignableFrom(parameterType)){returnrequest.getUserPrincipal();}elseif(Locale.class.equals(parameterType)){returnReqontextUtils.getLocale(request);}elseif(InputStream.class.isAssignableFrom(parameterType)){returnrequest.getInputStream();}elseif(Reader.class.isAssignableFrom(parameterType)){returnrequest.getReader();}elseif(OutputStream.class.isAssignableFrom(parameterType)){this.responseArgumentUsed=true;eturn}elseif(Writer.class.isAssignableFrom(parameterType)){this.responseArgumentUsed=true;return}returnsuper.resolveStandardArgument(parameterType,}可以使用Serlvet原生的API*Locale@throwspublicvoidtestServletAPI(HttpServletRequestrequest,HttpServletResponseresponse,Writerout)throwsIOException{System.out.println("testServletAPI,"+request+","+response);out.write("ospringmvc");//return}<!--測(cè)試ServletAPI作為處理請(qǐng)求參數(shù)--><a第四章SpringMVCModelAndView:處理方法返回值類型為ModelAndView時(shí),方法體即可通過(guò)該對(duì)象Map及Model:入?yún)閛rg.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map時(shí),處理方法返回時(shí),Map中的數(shù)@SessionAttributes:將模型中的某個(gè)屬性暫存到HttpSession中,以便多個(gè)請(qǐng)求之間@ModelAttribute①控制器處理方法的返回值如果為ModelAndView,則其既包含視圖信息,也包含模型數(shù)②MoelAndViewaddObject(StringattributeName,ObjectattributeValue)ModelAndViewaddAllObject(Map<String,?>modelMap)③voidsetView(ViewvoidsetViewName(String ModelAndView@RequestMap("/testModelAndView")publicModelAndViewtestModelAndView(){StringviewName="success";ModelAndViewmv=newModelAndView(viewName);mv.addObject("time",newDate().toString())requestreturnmv;} <!--測(cè)試ModelAndView作為處理返回結(jié)果--><a time:${requestScope.time SpringMVC在了一個(gè)org.springframework.ui.Model接口模型數(shù)據(jù)SpringMVC在調(diào)用方法前會(huì)創(chuàng)建一個(gè)隱含的模型對(duì)象作為模型數(shù)據(jù)的容器如果方法的入?yún)镸ap或Model類型,SpringMVC會(huì)將隱含模型的傳遞給這 //Map(Model,ModelMappublicStringtestMap(Map<String,Objectmap【重點(diǎn)】map.put("names",Arrays.asList("Tom","Jerry","Kite"));return} <!--測(cè)試Map作為處理返回結(jié)果--><a names:${requestSs 注意問(wèn)題:MapkeyString,ValueObject //Map(Model,ModelMappublicStringtestMap2(Map<String,Object>map,Modelmodel,ModelMapmodelMap){map.put("names",Arrays.asList("Tom","Jerry","Kite"));model.addAttribute("model","org.springframework.ui.Model");modelMap.put("modelMap","org.springframework.ui.ModelMap");System.out.println(map==model);System.out.println(map==modelMap);System.out.println(model==modelMap);return} 推薦 publicclassBindingAwareModelMapextendsExtendedModelMappublicObjectput(Stringkey,Objectvalue){removeBindingResultIfNecessary(key,value);returnsuper.put(key,value);}publicvoidputAll(Map<?extendsString,?>map)for(Map.Entry<?extendsString,?>entry:map.entrySet()){removeBindingResultIfNecessary(entry.getKey(),entry.getValue());}}privatevoidremoveBindingResultIfNecessary(Objectkey,Objectvalue){if(keyinstanceofString){StringattributeName=(String)StringbindingResultKey=BindingResult.MODEL_KEY_PREFIX+attributeName;BindingResultbindingResult=(BindingResult)get(bindingResultKey);if(bindingResult!=null&&bindingResult.getTarget()!=value){}}}}}SessionAttributes若希望在多個(gè)請(qǐng)求之間共用某個(gè)模型屬性數(shù)據(jù),則可以在控制器類上標(biāo)注一個(gè)@SessionAttributesSpringMVC將在模型中對(duì)應(yīng)的屬性暫存到HttpSession中。@SessionAttributes除了可以通過(guò)屬性名 @SessionAttributes(types=User.class)會(huì)將隱含模型中所有類型為User.class的屬性 @SessionAttributes(value={“user1”, @SessionAttributes(types={User.class, @SessionAttributes(value={“user1”,“user2”},@SessionAttributespackageimportjava.lang.annotation.ed;importjava.lang.annotation.ElementType;importjava.lang.annotation.Inherited;importjava.lang.annotation.Retention;importjava.lang.annotation.Retention;importjava.lang.annotation.Target;@Target({ElementType.TYPE@Retention(Retention.RUNTIME)@public@interfaceSessionAttributes{String[]value()default{}; Class<?typesdefault }publicclassSpringMVCController{value指定key還可以通過(guò)模型屬性的對(duì)象類型指定哪些模型屬性需要放到會(huì)話中(實(shí)際上是通過(guò)typespublicStringtestSessionAttributes(Map<String,Object>map){Useruser=newUser("Tom","123"," map.put("user",user);map.put("school",request域,如果設(shè)置了@SessionAttributesessionreturn}}<!--測(cè)試@SessionAttribute將數(shù)據(jù)存放到session域中--><arequestuser:${requestScope.user}<br><br>sessionuser:${sessionScope.user}<br><br>requestschool:${requestScope.school}<br><br>sessionschool:${sessionScope.school}@ModelAttribute在方法定義上使用@ModelAttribute注解:SpringMVC逐個(gè)調(diào)用在方法級(jí)上標(biāo)注了@ModelAttribute的方法。在方法的入?yún)⑶笆褂聾ModelAttribute注解:可以從隱含對(duì)象中獲取隱含的模型數(shù)據(jù) <!--測(cè)試@ModelAttribute類似Struts2原始數(shù)據(jù)為 value<formaction="springmvc/testModelAttribute"<inputtype="hidden"name="id"username:<inputtype="text"name="username"value="Tom"/><br>:<inputtype="text"name=""value=" age:<inputtype="text"name="age"value="12"/><br><inputtype="submit" 增加@ModelAttribute//1//1.由@ModelAttribute標(biāo)記的方法,會(huì)在每個(gè)目標(biāo)方法執(zhí)行之前被SpringMVC調(diào)用! publicStringtestModelAttribute(Useruser){return} userUseruser=newUser(1,"Tom","123456"," System.out.println("從數(shù)據(jù)庫(kù)中查詢的對(duì)象:user="+user);map.put("user",user);}} //org.springframework.web.HttpSessionRequiredException:Sessionattribute'user'required-notfoundinsession@Target({ElementType.PARAMETER,ElementType.METHOD})@Retention(Retention.RUNTIME)@public@interfaceModelAttributeThenameofthemodelattributetobind<p>Thedefaultmodelattributenameisinferredfromtheattributetype(i.e.themethodparametertypeormethodreturnbasedonthenon-qualifiedclasse.g."orderAddress"forclassor"orderAddressList"forStringvalue()default} 執(zhí)行@ModelAttribute注解所修飾的方法,將從數(shù)據(jù)庫(kù)中獲取的對(duì)象存放到Map集合中,key為user SpringMVCMap集合中獲取user SpringMVCuser 注意:@ModelAttributeMapkey 調(diào)用@ModelAttribute注解修飾的方法.實(shí)際上把@ModelAttribute方法中中的數(shù)據(jù)放在了implicitModel中. 解析請(qǐng)求處理器的目標(biāo)參數(shù),實(shí)際上該目標(biāo)參數(shù)來(lái)自于WebDataBinder對(duì)象的創(chuàng)建WebDataBinder對(duì)象:【1】確 objectName屬性:若傳入 attrName屬性值 "",*注意:attrName.*注意:attrName.若目標(biāo)方法的POJO屬性使用了@ModelAttribute來(lái)修飾,則attrNameattrName值即為@ModelAttribute的value【2】確定target屬性:>在implicitModel中查找attrName對(duì)應(yīng)的屬性值.若存在,使用了,則嘗試從Session中獲取使用了,則嘗試從Session中獲取attrName所對(duì)應(yīng)的屬性值.*若不存在:則驗(yàn)證當(dāng)前Handler是否使用了@SessionAttributes進(jìn)行修飾,若若若session>若Handler沒(méi)有使用@SessionAttributes進(jìn)行修飾,或@SessionAttributes中沒(méi)有使用value值指定的key和attrName相匹配,則通過(guò)反射創(chuàng)建了POJO對(duì)象進(jìn)而傳到request域?qū)ο笾?*SpringMVC會(huì)把WebDataBinder的attrName和target進(jìn)而傳到request域?qū)ο笾?*SpringMVC會(huì)把WebDataBinder的attrName和target給到4).把WebDataBinder的targetSpringMVCPOJO 確定一個(gè)若目標(biāo)方法的POJO類型的參數(shù)木有使用@ModelAttribute作為修飾,則為POJO類名第一個(gè)字母的小寫若使用了@ModelAttribute來(lái)修飾,則key為@ModelAttribute注解的 在implicitModel中查找key對(duì)應(yīng)的對(duì)象,若存在,則作為入?yún)魅肴粼贎ModelAttribute標(biāo)記的方法中在Map中保存過(guò),且key和①確定的key一致,則會(huì)獲取到. 若implicitModel中不存在key對(duì)應(yīng)的對(duì)象,則檢查當(dāng)前的Handler是否使用@SessionAttributes注解修飾,④若使用了該注解,且@SessionAttributes注解的value屬性值中包含了key,則會(huì)從HttpSession中來(lái)獲取key所對(duì)應(yīng)的value值,若存在則直接傳入到目標(biāo)方法的入?yún)⒅?若不存在則將拋出異常.⑤若Handler沒(méi)有標(biāo)識(shí)@SessionAttributes注解或@SessionAttributes注解的value值中不包含key,則會(huì)通過(guò)反射來(lái)創(chuàng)建POJO類型的參數(shù),傳入為目標(biāo)方法⑥SpringMVC會(huì)把key和POJO類型的對(duì)象保存到implicitModel中,進(jìn)而會(huì)保存到request中.@ModelAttributePOJO//publicStringtestModelAttribute(UserpublicStringtestModelAttribute(@ModelAttribute("abc")UserSystem.out.println("修改return}*@ModelAttribute注解也可以來(lái)修飾目標(biāo)方法POJO類型的入?yún)?其valueSpringMVC會(huì)使用value屬性值在implicitModelSpringMVC會(huì)以value為keyPOJO類型的對(duì)象為value,存入到request中.publicvoidgetUser(@RequestParam(value="id",required=false)Integerid,Map<String,Object>map){userUseruser=newUser(1,"Tom","123456"," System.out.println("從數(shù)據(jù)庫(kù)中查詢的對(duì)象:user="+user);//map.put("user",user);//map.put("abc",user);}}useruseruser:${requestScope.userabcuser:${requestScope.abc@sessionAttributes注解的異 由@SessionAttributes的異 性,則拋出HttpSessionRequiredException異常第七章SpringMVC 不論控制器返回一個(gè)String,ModelAndView,View都會(huì)轉(zhuǎn)換為ModelAndView對(duì)象,由 ModelAndViewString,View或ModeMap等類型的處理方法,SpringMVC也會(huì)在內(nèi)部將它們裝配成一個(gè)ModelAndView對(duì)象,它包含了邏輯名和模型對(duì)象的視圖借助(View圖可以是JSP,也可能是Excel、JChart等各種表現(xiàn)形式的視圖點(diǎn)聚焦在生產(chǎn)模型數(shù)據(jù)的工作上,從而實(shí)現(xiàn)MVC的充分解耦視圖為了實(shí)現(xiàn)視圖模型和具體實(shí)現(xiàn)技術(shù)的解耦,Spring在包中定義了一個(gè)高度抽象的ViewSpringMVC為邏輯視圖名的解析提供了不同的策略,可以在SpringWEB上下文中配所有的視圖解析器都必須實(shí)現(xiàn)ViewResolver接口:每個(gè)視圖解析器都實(shí)現(xiàn)了Ordered接口并開放出一個(gè)order屬性,可以通過(guò)屬性指定解析器的優(yōu)先順序 越小優(yōu)先級(jí)越高SpringMVC會(huì)按視圖解析器順序的優(yōu)先順序?qū)壿嬕晥D名進(jìn)行解析,直到解析成功并返回視圖對(duì)象,否則將拋出ServletException異常JSP是最常見的視圖技術(shù),可以使用InternalResourceViewResolve作為視圖解析若項(xiàng)目中使用了JSTL,則SpringMVC會(huì)自動(dòng)把視圖由InternalResourceView轉(zhuǎn)為JstlView(JSTLjar若使用JSTL的fmt則需要在SpringMVC的配置文件中配 資源文若希望直接響應(yīng)通過(guò)SpringMVC渲染的頁(yè)面可以使用mvc:view-controller實(shí)①增加jstljar包(斷點(diǎn)調(diào)試,這時(shí)的View對(duì)象就是②設(shè)置資源文 <propertyname="basename"packageimportimportorg.springframework.web.bind.annotation.RequestMap@RequestMap("springmvc")publicclassSpringMVCController{publicStringtestViewAndViewResolver(){return"success";}}④成功頁(yè)面(/WEB-INF/views/success.jsp)使用fmt<%@pagelanguage="java"contentType="text/html;charset=UTF-<%@taglibprefix="fmt" /jsp/jstl/fmt"<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""<metahttp-equiv="Content-Type"content="text/html;charset=UTF-<title>Inserttitle<h4>Sucess<fmt:message<fmt:messagecontroller若希望直接響應(yīng)通過(guò)SpringMVC渲染的頁(yè)面可以使用mvc:view-controller實(shí)<mvc:view-controllerpath="/success"view---自定義視圖(SpringMVC,那么,一定需要實(shí)現(xiàn)框架的接口若希望使用Excel展示數(shù)據(jù)列表,僅需要擴(kuò)展SpringMVC提供 JExcelView即可實(shí)現(xiàn)buildExcel()方法,在方法中使用模型數(shù)據(jù)對(duì)象構(gòu)建Excel文檔就可以ExcelView基于POIAPI, JExcelView是基于JExcelAPI的視圖對(duì)象需要配置IOC容器中的一個(gè)Bean,使用BeanNameViewResolver作為視若希望直接在瀏覽器中直接Excel文檔則可以設(shè)置響應(yīng)頭Content-的值為atta <a publicStringtestView(){return"oView";//與視圖Bean對(duì)象的id一} packageimportjava.util.Date;importimportjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframew importorg.springframework.web.servlet.View;publicclassoViewimplementsViewpublicStringgetContentType(){return"text/html";}publicvoidrender(Map<String,?>model,HttpServletRequestHttpServletResponseresponse)throwsException{response.getWriter().println("oView-time="+newDate());}} 視圖解析bean的名稱查找視圖--><bean<propertyname="order"InternalResourceViewResolverprivateintorderpublicclassBeanNameViewResolverextendsWebApplicationObjectSupportimplementsViewResolver,Ordered{privateintorder=Integer.MAX_VALUE; //default:sameasnon-OrderedpublicvoidsetOrder(intorder){this.order=}publicintgetOrder(){returnorder;}publicViewresolveViewName(StringviewName,Localelocale)throwsBean{ApplicationContextcontext=getApplicationContext();if(!context.containsBean(viewName)){SpringIOC//AllowforViewResolverchaining.returnnull;}returncontext.getBean(viewName,}} 如果返回的字符串中帶forward:或redirect:前綴時(shí),SpringMVC會(huì)對(duì)他們進(jìn)行特殊處理:將forward:和redirect:當(dāng)成指示符,其后的字符串作為URL來(lái)處理redirect:success.jsp:會(huì)完成一個(gè)到success.jsp的重定向的操作forward:success.jsp:會(huì)完成一個(gè)到success.jsp的轉(zhuǎn)發(fā)操作 <a publicStringtestRedirect(){return//return} return第八章顯示效果:完成添加,重定向到list頁(yè)面。修改操作:lastName顯示效果:回顯表單顯示效果:完成修改,重定向到list頁(yè)面。Service jar 創(chuàng)建配置文件增加context,mvc,beans<?xmlversion="1.0"encoding="UTF-<beansxmlns="xsi:schemaLocation="<!--配置掃描的包:com.atguigu.springmvc.crud ponent-scanbase-<beanid="internalResourceViewResolver"<propertyname="prefix"value="/WEB-<propertyname="suffix" 配置控制器</init- 將POST請(qǐng)求轉(zhuǎn)換為PUT或DELETE請(qǐng)求</filter-map DAOprivatestaticMap<Integer,Department>departments=publicclassDepartmentDaoimportimportimportimportjava.util.HashMap;importjava.util.Map;packageprivatestaticMap<Integer,Employee>employees=publicclassEmployeeDaoimportimportimportimportimportimportjava.util.HashMap;importjava.util.Map;packageprivateDepartmentDaoemployees=newHashMap<Integer,employees.put(1001,newEmployee(1001,"E-AA"," ",1,newDepartment(101,"D-AA")));employees.put(1002,newEmployee(1002,"E-BB"," ",1,newDepartment(102,"D-BB")));employees.put(1003,newEmployee(1003,"E-CC"," ",0,newDepartment(103,"D-CC")));employees.put(1004,newEmployee(1004,"E-DD"," ",0,newDepartment(104,"D-DD")));employees.put(1005,newEmployee(1005,"E-EE"," ",1,newDepartment(105,"D-EE")));}privatestaticIntegerinitId=1006;publicvoidsave(Employeeemployee){if(employee.getId()==null){

departments=newLinkedHashMap<Integer,departments.put(101,newDepartment(101,"D-AA"));departments.put(102,newDepartment(102,"D-BB"));departments.put(103,newDepartment(103,"D-CC"));departments.put(104,newDepartment(104,"D-DD"));departments.put(105,newDepartment(105,"D-EE"));}publicCollection<Department>getDepartments(){returndepartments.values();}publicDepartmentgetDepartment(Integerid){returndepartments.get(id);}}}employees.put(employee.getId(),}publicCollection<Employee>getAll(){returnemployees.values();}publicEmployeeget(Integerid){returnemployees.get(id);}publicvoiddelete(Integerid){}} <ahref="${pageContext.request.contextPath}/emps">Get packagecom.atguigu.springmvc.crud.handlers;importjava.util.Map;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMap;importcom.atguigu.springmvc.crud.dao.EmployeeDao;publicclassEmployeeHandlerprivateEmployeeDaoemployeeDaopublicStringempList(Map<String,Object>map.put("empList", //默認(rèn)存放到requestreturn}} SpringMVC中沒(méi)遍歷的需要使用jstl進(jìn)行集合遍歷增加jstl庫(kù)jar<%@pagelanguage="java"contentType="text/html;charset=UTF-8"<%@taglibprefix="c" /jsp/jstl/core"<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTMLTransitional//EN""<metahttp-equiv="Content-Type"content="text/html;charset=UTF-<title>Inserttitle<c:iftest="${emptyrequestScope.empList<c:iftest="${!emptyrequestScope.empList<tableborder="1"cellpadding="10"<td><c:forEachitems="${requestScope.empList}"<td>${emp.id<td>${emp.lastName<td>${emp.gender==0?"Female":"Male"<td>${emp.<td>${emp.department.departmentName<td><a<td><a list.jsp<ahref="${pageContext.request.contextPath}/empInput">Add publicStringempInput(Map<String,Object>map){map.put("deptList",//解決錯(cuò)誤:java.lang.IllegalStateException:NeitherBindingResultnorintargetobjectforbeanname'command'availableasrequestattributeEmployeeemployee=new//map.put("command",employee);map.put("employee",employee);return"add";} <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%><%@taglibprefix="form" "<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTMLTransitional//EN""<metahttp-equiv="Content-Type"content="text/html;charset=UTF-<title>InserttitleSpringMVCform①②modelAttribute若沒(méi)有指定該屬性,則默認(rèn)從request域中查找command的表單的--<form:formaction="empAdd"method="POST"modelAttribute="employee">LastName:<form:inputpath="lastName"/><br><br>:<form:inputpath=""/><br><br>Map<String,String>map=newHashMap<String,String>();map.put("1","Male");request.setAttribute("genders",map); DeptName:<form:selectitems="${deptList}"<inputtype="submit" HTTPStatus500typeExceptiondescriptionTheserverencounteredaninternalerror()thatpreventeditfromfulfillingthis INF/views/add.jspatline18 單回 -- <form:formaction="empAdd"method="POST"> LastName:<form:inputpath="lastName"/> :<form:inputpath=""/> Map<String,String>map=newHashMap<String,String>(); rootjava.lang.IllegalStateException:NeitherBindingResultnor intargetobjectforbeanname'command'availableasrequestattributeSpring通過(guò)SpringMVC的表單可以實(shí)現(xiàn)將模型數(shù)據(jù)中的屬性和HTML表單元素相綁定,form一般情況下,通過(guò)GET請(qǐng)求獲取表單頁(yè)面,而通過(guò)POST請(qǐng)求提交表單頁(yè)面,因此獲取表單頁(yè)面和提交表單頁(yè)面的URL是相同的。只要滿足該最佳條件的契約,<form:form>就無(wú)需通過(guò)action屬性指定表單提交的URLmodelAttribute屬性指定綁定的模型屬性,若沒(méi)有指定該屬性,則默認(rèn)從request域?qū)ο笾衏ommand的表單bean,如果該屬性值也不存在,則SpringMVC提供了多個(gè)表單組件,如<form:input/>、<form:select/>等,用以綁path:表單字段,對(duì)應(yīng)html元素的name屬性,支持級(jí)聯(lián)屬性htmlEscape:是否對(duì)表單值的HTML特殊字符進(jìn)行轉(zhuǎn)換,默認(rèn)值為cssClass:表單組件對(duì)應(yīng)的CSS樣式類名cssErrorClass:表單組件的數(shù)據(jù)存在錯(cuò)誤時(shí),采取的CSS樣式form:input、form:password、form:hidden、form:textarea:對(duì)應(yīng)HTML表單的text、password、hidden、textareaform:radiobutton:?jiǎn)芜x框組件,當(dāng)表單bean對(duì)應(yīng)的屬性值和value值相等時(shí),form:radiobuttons:?jiǎn)芜x框組,用于構(gòu)造多個(gè)單選items:可以是一個(gè)List、String[]或itemValue:指定radio的value值。可以是集合中bean的一個(gè)屬性值itemLabel:指定radio的label值delimiter:多個(gè)單選框可以通過(guò)delimiter指定分隔符form:checkboxs:用于構(gòu)造多個(gè)復(fù)選框。使用方式同form:radiobuttonsform:select:用于構(gòu)造下拉框組件。使用方式同form:radiobuttonsform:option:下拉框選項(xiàng)組件。使用方式同form:radiobuttons<form:errorspath=“*”/>:顯示表單所有的錯(cuò)誤<form:errorspath=“user*”/>:顯示所有以u(píng)ser為前綴的屬性對(duì)應(yīng)的錯(cuò)誤<form:errorspath=“username” <%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%><%@taglibprefix="form"uri=""<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"""><metahttp-equiv="Content-Type"content="text/html;charset=UTF-<title>InserttitleSpringMVCform①快速開發(fā)②表單回顯modelAttribute若沒(méi)有指定該屬性,則默認(rèn)從request域中查找command的表單的--<form:formaction="empAdd"method="POST"modelAttribute="employee">LastName:<form:inputpath="lastName"/><br><br>:<form:inputpath=""/><br><br>Map<String,String>map=newHashMap<String,String>();map.put("1","Male");request.setAttribute("genders",map); DeptName:<form:selectitems="${deptList}"<inputtype="submit" publicclassEmployeeHandlerpublicStringempAdd(Employeeemployee){return"redirect:/empList";}} <td><ahref="${pageContext.request.contextPath}/empDelete/${emp.id @RequestMap(value="/empDelete/{id}",method=RequestMethod.DELETE)publicStringempDelete(@PathVariable("id")Integerid){return"redirect:/empList";}發(fā)起請(qǐng)求,無(wú)法執(zhí)行,因?yàn)閐elete請(qǐng)求必須通過(guò)post請(qǐng)求轉(zhuǎn)換為delete請(qǐng)求,借助:HiddenHttpMethodFilter過(guò)濾器 jQuery jQuery警告:NomapfoundforHTTPrequestwithURI[/SpringMVC_03_RESTFul_CRUD/scripts/jquery-1.9.1.min.js]inDispatcherServletwithname'springDispatcherServlet'解決辦法,SpringMVC處理靜態(tài)資源③解決辦法,SpringMVC處理靜態(tài)資源 優(yōu)雅的REST風(fēng)格的資源URL不希望帶.html或.do等后綴若將DispatcherServlet請(qǐng)求映射配置為/,則SpringMVC將捕獲WEB容器的所有請(qǐng)求,包括靜態(tài)資源的請(qǐng)求,SpringMVC會(huì)將他 解決:在SpringMVC的配置文件中配置<mvc:default-servlet- 需要配置<mvc:annotation-driven 它會(huì)對(duì)進(jìn)入DispatcherServlet就將該請(qǐng)求交由WEB應(yīng)用服務(wù)器默認(rèn)的Servlet處理,如果不是靜態(tài)資源的請(qǐng)求,才由DispatcherServlet繼續(xù)處理一般WEB應(yīng)用服務(wù)器默認(rèn)的Servlet的名稱都是default若所使用的WEB服務(wù)器的默認(rèn)Servlet名稱不是default,則需要通過(guò)default-servlet-name屬性顯式該屬性default-servlet-name默認(rèn)值是"default",可以省略--jQueryDELETE href="${pageContext.request.contextPath}/empDelete/${emp.id<formaction=""<inputtype="hidden"name="_method"<scripttype="text/javascript"src="scripts/jquery-<scriptvarhref=returnfalse; href="${pageContext.request.contextPath}/empEdit/${emp.id //修改員工-表單回顯publicStringempEdit(@PathVariable("id")Integerid,Map<String,Object>map){map.pu

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論