Mocha Framework 技術(shù)培訓(xùn)之Spring3 MVC實戰(zhàn)指南_第1頁
Mocha Framework 技術(shù)培訓(xùn)之Spring3 MVC實戰(zhàn)指南_第2頁
Mocha Framework 技術(shù)培訓(xùn)之Spring3 MVC實戰(zhàn)指南_第3頁
Mocha Framework 技術(shù)培訓(xùn)之Spring3 MVC實戰(zhàn)指南_第4頁
Mocha Framework 技術(shù)培訓(xùn)之Spring3 MVC實戰(zhàn)指南_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

MochaFramework技術(shù)培訓(xùn)——之Spring3MVC實戰(zhàn)指南1SpringMVC框架簡介支持REST風(fēng)格的URL添加更多注解,可完全注解驅(qū)動引入HTTP輸入輸出轉(zhuǎn)換器(HttpMessageConverter)和數(shù)據(jù)轉(zhuǎn)換、格式化、驗證框架無縫集成對靜態(tài)資源處理提供特殊支持更加靈活的控制器方法簽名,可完全獨立于ServletAPI1SpringMVC3.0新特性1SpringMVC框架結(jié)構(gòu)DispatcherServletHandlerMappingHandlerAdapterHandlerView?(JSP/XML/PDF,...)23ModelAndView54ViewResolver6Model7811SpringMVC框架結(jié)構(gòu)@Controller

①將UserController變成一個Handler@RequestMapping(“/user”)

②指定控制器映射的URLpublicclassUserController{

@RequestMapping(value=“/register”)

③處理方法對應(yīng)的URL,相對于②處的URLpublicStringregister(){

return“user/register”;

④返回邏輯視圖名

}}1框架實現(xiàn)者DispatcherServletDefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapterUserControllerregister.jsp23ModelAndView"user/register"54InternalResourceViewResolver6Model7811SpringMVC框架簡介2HTTP請求地址映射1HTTP請求映射原理HTTP請求報文SpringMVC框架Handler處理方法WEB容器1SpringMVC進(jìn)行映射的依據(jù)1通過URL限定:URL表達(dá)式@RequestMapping不但支持標(biāo)準(zhǔn)的URL,還支持Ant風(fēng)格(即?、*和**的字符)的和帶{xxx}占位符的URL。以下URL都是合法的:/user/*/createUser

匹配/user/aaa/createUser、/user/bbb/createUser等URL。/user/**/createUser

匹配/user/createUser、/user/aaa/bbb/createUser等URL。/user/createUser??

匹配/user/createUseraa、/user/createUserbb等URL。/user/{userId}

匹配user/123、user/abc等URL。/user/**/{userId}

匹配user/aaa/bbb/123、user/aaa/456等URL。company/{companyId}/user/{userId}/detail

匹配company/123/user/456/detail等的URL。1通過URL限定:綁定{xxx}中的值@RequestMapping("/{userId}")publicModelAndViewshowDetail(@PathVariable("userId")StringuserId){ ModelAndViewmav=newModelAndView(); mav.setViewName("user/showDetail"); mav.addObject("user",userService.getUserById(userId)); returnmav;}URL中的{xxx}占位符可以通過@PathVariable("xxx")綁定到操作方法的入?yún)⒅小?通過請求方法限定:請求方法請求方法,在HTTP中這被叫做動詞(verb),除了兩個大家熟知的(GET和POST)之外,標(biāo)準(zhǔn)方法集合中還包含PUT、DELETE、HEAD和OPTIONS。這些方法的含義連同行為許諾都一起定義在HTTP規(guī)范之中。一般瀏覽器只支持GET和POST方法。序號請求方法說明1GET使用GET方法檢索一個表述(representation)——也就是對資源的描述。多次執(zhí)行同一GET請求,不會對系統(tǒng)造成影響,GET方法具有冪等性[指多個相同請求返回相同的結(jié)果]。GET請求可以充分使用客戶端的緩存。2POSTPOST方法,通常表示“創(chuàng)建一個新資源”,但它既不安全也不具有冪等性(多次操作會產(chǎn)生多個新資源)。3DELETEDELETE,表示刪除一個資源,你也可以一遍又一遍地操作它,直到得出結(jié)果:刪除不存在的東西沒有任何問題4PUT冪等性同樣適用于PUT(基本的含義是“更新資源數(shù)據(jù),如果資源不存在的話,則根據(jù)此URI創(chuàng)建一個新的資源”)1通過請求方法限定:代碼示例示例1:@RequestMapping(value=“/delete”)publicStringtest1(@RequestParam("userId")StringuserId){return"user/test1"; }所有URL為<controllerURI>/delete的請求由test1處理(任何請求方法)示例2:@RequestMapping(value="/delete",method=RequestMethod.POST)publicStringtest1(@RequestParam("userId")StringuserId){return"user/test1"; }所有URL為<controllerURI>/delete且請求方法為POST的請求由test1處理1通過請求方法限定:模擬請求方法通過在web.xml中配置一個org.springframework.web.filter.HiddenHttpMethodFilter通過POST請求的_method參數(shù)指定請求方法,HiddenHttpMethodFilter動態(tài)更改HTTP頭信息。POSTHTTP請求HiddenHttpMethodFilterPUTHTTP請求Spring

MVC1通過請求/請求頭參數(shù)限定:示例

通過請求參數(shù)限定:@RequestMapping(value="/delete",params="userId")publicStringtest1(@RequestParam("userId")StringuserId){... }通過請求頭參數(shù)限定:@RequestMapping(value="/delete",headers="content-type=text/*")publicStringtest1(@RequestParam("userId")StringuserId){... }1通過請求/請求頭參數(shù)限定:更多params和headers分別通過請求參數(shù)及報文頭屬性進(jìn)行映射,它們支持簡單的表達(dá)式,下面以params表達(dá)式為例說明,headers可以參照params進(jìn)行理解之。"param1":表示請求必須包含名為param1的請求參數(shù)。"!param1":表示請求不能包含名為param1的請求參數(shù)。"param1!=value1":表示請求包含名為param1的請求參數(shù),但其值不能為value1。{“param1=value1”,“param2”}:請求必須包含名為param1和param2的兩個請求參數(shù),且param1參數(shù)的值必須為value1。1SpringMVC框架簡介2HTTP請求地址映射3HTTP請求數(shù)據(jù)的綁定1通過注解綁定:示意圖@RequestParam綁定請求參數(shù)@CookieValue綁定Cookie值@RequestHeader綁定請求頭參數(shù)@PathVariable綁定URL變量1通過注解綁定:示例@RequestMapping(value="/handle1")publicStringhandle1(@RequestParam("userName")StringuserName,

@RequestParam("password")Stringpassword,

@RequestParam("realName")StringrealName){

...}@RequestMapping(value="/handle2")publicStringhandle2(@CookieValue("JSESSIONID")StringsessionId,

@RequestHeader("Accept-Language")StringaccpetLanguage){...}1通過注解綁定:小心拋出異常@RequestParam有以下三個參數(shù):value:參數(shù)名。required:是否必需,默認(rèn)為true,表示請求中必須包含對應(yīng)的參數(shù)名,如果不存在將拋出異常。defaultValue:默認(rèn)參數(shù)名,設(shè)置該參數(shù)時,自動將required設(shè)為false。極少情況需要使用該參數(shù),也不推薦使用該參數(shù)。@RequestMapping(value="/handle1")publicStringhandle1(@RequestParam(“userName")StringuserName){...}上面的處理方法,如果HTTP請求不包含“userName”參數(shù)時,將產(chǎn)生異常!因此,如果不能保證存在”userName”的參數(shù),必須使用:@RequestParam(value="userName",required=false)1使用命令/表單對象綁定所謂命令/表單對象并不需要實現(xiàn)任何接口,僅是一個擁有若干屬性的POJO。SpringMVC按:“HTTP請求參數(shù)名=命令/表單對象的屬性名”的規(guī)則,自動綁定請求數(shù)據(jù),支持“級聯(lián)屬性名”,自動進(jìn)行基本類型數(shù)據(jù)轉(zhuǎn)換。@RequestMapping(value="/handle")publicStringhandle(Useruser){ …}userName=xxx&password=yyyclassUser{privateStringuserName;privateStringpassword;}1使用ServletAPI對象作為入?yún)⒃赟pringMVC中,控制器類可以不依賴任何ServletAPI對象,但是SpringMVC并不阻止我們使用ServletAPI的類作為處理方法的入?yún)?。值得注意的是,如果處理方法自行使用HttpServletResponse返回響應(yīng),則處理方法的返回值設(shè)置成void即可。@RequestMapping(value="/handle")publicvoidhandle(HttpServletRequestrequest,HttpServletResponseresponse,

HttpSessionsession,@RequestParam("userName")StringuserName){

response.addCookie(newCookie("userName",userName)); session.setAttribute("sessionId",1234);}1使用Spring的ServletAPI代理類SpringMVC在org.springframework.web.context.request包中定義了若干個可代理Servlet原生API類的接口,如WebRequest和NativeWebRequest,它們也允許作為處理類的入?yún)?,通過這些代理類可訪問請求對象的任何信息。@RequestMapping(value="/handle")publicStringhandle(WebRequestrequest){ StringuserName=request.getParameter("userName"); return"success";}1使用IO對象作為入?yún)pringMVC允許控制器的處理方法使用java.io.InputStream/java.io.Reader及java.io.OutputStream/java.io.Writer作為方法的入?yún)ⅰRequestMapping(value="/handle")publicvoidhandle(OutputStreamos)throwsIOException{Resourceres=newClassPathResource("/image.jpg"); //讀取類路徑下的圖片文件

FileCopyUtils.copy(res.getInputStream(),os); //將圖片寫到輸出流中}SpringMVC將獲取ServletRequest的InputStream/Reader或ServletResponse的OutputStream/Writer,然后按類型匹配的方式,傳遞給控制器的處理方法入?yún)ⅰ?其他類型的參數(shù)控制器處理方法的入?yún)⒊С忠陨项愋偷膮?shù)以外,還支持java.util.Locale、java.security.Principal,可以通過Servlet的HttpServletRequest的getLocale()及getUserPrincipal()得到相應(yīng)的值。如果處理方法的入?yún)㈩愋蜑長ocale或Principal,SpringMVC自動從請求對象中獲取相應(yīng)的對象并傳遞給處理方法的入?yún)?。@RequestMapping(value="/handle")publicvoidhandle(Localelocale)throwsIOException{...}1HttpMessageConverter<T>HttpServletRequestHttpServletRequest@RequestBody/HttpEntity<T>@ResponseBody/ResponseEntity<T>HttpMessageConverter<T>HTTP請求報文HTTP請求報文1HttpMessageConverter<T>實現(xiàn)類實現(xiàn)類:StringHttpMessageConverterFormHttpMessageConverterXmlAwareFormHttpMessageConverterResourceHttpMessageConverterBufferedImageHttpMessageConverterByteArrayHttpMessageConverterSourceHttpMessageConverterMarshallingHttpMessageConverterJaxb2RootElementHttpMessageConverterMappingJacksonHttpMessageConverterRssChannelHttpMessageConverterAtomFeedHttpMessageConverter注冊到...HttpMessageConverter<T>接口方法

Tread(HttpInputMessagehttpInputMessage)voidwrite(Tt,HttpOutputMessagehttpOutputMessage)AnnotationMethodHandlerAdapter1使用@RequestBody/@ResponseBody將HttpServletRequest的getInputStream()內(nèi)容綁定到入?yún)?,將處理方法返回值寫入到HttpServletResponse的getOutputStream()中。@RequestMapping(value="/handle")@ResponseBodypublicbyte[]handle(@RequestBodyStringrequestBody){System.out.println(requestBody);Resourceres=newClassPathResource("/image.jpg");byte[]fileData=FileCopyUtils.copyToByteArray(res.getInputStream());

returnfileData;}優(yōu)點:處理方法簽名靈活不受限缺點:只能訪問報文體,不能訪問報文頭1使用HttpEntity<T>/ResponseEntity<T>@RequestMapping(value="/handle")publicStringhandle(HttpEntity<String>httpEntity){longcontentLen=httpEntity.getHeaders().getContentLength();System.out.println(httpEntity.getBody());return"success";}優(yōu)點:不但可以訪問報文體,也能訪問報文頭缺點:處理方法簽名受限@RequestMapping(params="method=login")publicResponseEntity<String>doFirst(){

HttpHeadersheaders=newHttpHeaders();

MediaTypemt=newMediaType("text","html",Charset.forName(“UTF-8"));headers.setContentType(mt);ResponseEntity<String>re=null;Stringreturn=newString("test");re=newResponseEntity<String>(return,headers,HttpStatus.OK);returnre;}1輸出XML和JSON處理XML轉(zhuǎn)換處理JSON轉(zhuǎn)換1使用HttpEntity<T>/ResponseEntity<T>@RequestMapping(value="/handle51")publicResponseEntity<User>handle51(HttpEntity<User>requestEntity){Useruser=requestEntity.getBody();user.setUserId("1000"); returnnewResponseEntity<User>(user,HttpStatus.OK);}對于服務(wù)端的處理方法而言,除使用@RequestBody/@ResponseBody或HttpEntity<T>/ResponseEntity<T>進(jìn)行方法簽名外,不需要進(jìn)行任何額外的處理,借由SpringMVC中裝配的HttpMessageConverter,它即擁有了處理XML及JSON的能力了。1SpringMVC框架簡介2HTTP請求地址映射3HTTP請求數(shù)據(jù)的綁定4數(shù)據(jù)轉(zhuǎn)換、格式化、校驗1數(shù)據(jù)綁定機理34512數(shù)據(jù)類型轉(zhuǎn)換/格式化數(shù)據(jù)校驗DataBinderConversionServiceValidatorBindingResultServletRequest處理方法入?yún)ο蠹幚矸椒ǖ暮灻?數(shù)據(jù)類型轉(zhuǎn)換低版本的Spring只支持標(biāo)準(zhǔn)的PropertyEditor類型體系,不過PropertyEditor存在以下缺陷:只能用于字符串和Java對象的轉(zhuǎn)換,不適用于任意兩個Java類型之間的轉(zhuǎn)換;對源對象及目標(biāo)對象所在的上下文信息(如注解、所在宿主類的結(jié)構(gòu)等)不敏感,在類型轉(zhuǎn)換時不能利用這些上下文信息實施高級轉(zhuǎn)換邏輯。有鑒于此,Spring3.0在核心模型中添加了一個通用的類型轉(zhuǎn)換模塊,ConversionService是Spring類型轉(zhuǎn)換體系的核心接口。Spring3.0同時支持PropertyEditor和ConversionService進(jìn)行類型轉(zhuǎn)換,在Bean配置、SpringMVC處理方法入?yún)⒔壎ㄖ惺褂妙愋娃D(zhuǎn)換體系進(jìn)行工作。1強大的ConversionService,讓很多夢想成真由于ConversionService在進(jìn)行類型轉(zhuǎn)換時,可以使用到Bean所在宿主類的上下文信息(包括類結(jié)構(gòu),注解信息),所以可以實施更加高級的類型轉(zhuǎn)換,如注解驅(qū)動的格式化等功能。以上User類,通過一個@DateTimeFormat注解,為類型轉(zhuǎn)換提供了一些“額外”的信息,即代表日期的“源字符器”格式是“yyyy-MM-dd”publicclassUser{

@DateTimeFormat(pattern="yyyy-MM-dd")privateDatebirthday;}1基于ConversionService體系,定義自定義的類型轉(zhuǎn)換器定義自定義轉(zhuǎn)換器:注冊自定義轉(zhuǎn)換器:Converter<String,User>StringToUserConverterorg.springframework.core.convert.converter.Converter<mvc:annotation-drivenconversion-service="conversionService"/><beanid="conversionService"class="org.springframework.context.support.ConversionServiceFactoryBean"><propertyname="converters"><list>

<beanclass="com.java.domain.StringToUserConverter"/></list></property></bean>1數(shù)據(jù)校驗框架Spring3.0擁有自己獨立的數(shù)據(jù)校驗框架,同時支持JSR303標(biāo)準(zhǔn)的校驗框架。Spring的DataBinder在進(jìn)行數(shù)據(jù)綁定時,可同時調(diào)用校驗框架完成數(shù)據(jù)校驗工作。在SpringMVC中,則可直接通過注解驅(qū)動的方式進(jìn)行數(shù)據(jù)校驗。Spring的org.springframework.validation是校驗框架所在的包。JSR303是Java為Bean數(shù)據(jù)合法性校驗所提供的標(biāo)準(zhǔn)框架,它已經(jīng)包含在JavaEE6.0中。JSR303通過在Bean屬性上標(biāo)注類似于@NotNull、@Max等標(biāo)準(zhǔn)的注解指定校驗規(guī)則,并通過標(biāo)準(zhǔn)的驗證接口對Bean進(jìn)行驗證??梢酝ㄟ^http:///en/jsr/detail?id=303了解JSR303的詳細(xì)內(nèi)容。1JSR303注

解功能說明@Null

被注釋的元素必須為

null@NotNull

被注釋的元素必須不為

null@AssertTrue

被注釋的元素必須為

true@AssertFalse

被注釋的元素必須為

false@Min(value)

被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值@Max(value)

被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值@DecimalMin(value)

被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值@DecimalMax(value)

被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值@Size(max,min)

被注釋的元素的大小必須在指定的范圍內(nèi)@Digits(integer,fraction)

被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)@Past

被注釋的元素必須是一個過去的日期@Future

被注釋的元素必須是一個將來的日期1數(shù)據(jù)校驗框架<mvc:annotation-driven/>會默認(rèn)裝配好一個LocalValidatorFactoryBean,通過在處理方法的入?yún)⑸蠘?biāo)注@Valid注解即可讓SpringMVC在完成數(shù)據(jù)綁定后執(zhí)行數(shù)據(jù)校驗的工作。publicclassUser{@Pattern(regexp="w{4,30}")privateStringuserName;

@Length(min=2,max=100)privateStringrealName;

@Past@DateTimeFormat(pattern="yyyy-MM-dd")privateDatebirthday;

@DecimalMin(value="1000.00")@DecimalMax(value="100000.00")@NumberFormat(pattern="#,###.##")privatelongsalary;}注意:Spring本身沒有提供JSR303的實現(xiàn),所以必須將JSR303的實現(xiàn)者(如HibernateValidator)的jar文件放到類路徑下,Spring將自動加載并裝配好JSR303的實現(xiàn)者。

1如何使用注解驅(qū)動的校驗在已經(jīng)標(biāo)注了JSR303注解的表單/命令對象前標(biāo)注一個@Valid,SpringMVC框架在將請求數(shù)據(jù)綁定到該入?yún)ο蠛螅蜁{(diào)用校驗框架根據(jù)注解聲明的校驗規(guī)則實施校驗。@Controller@RequestMapping("/user")publicclassUserController{@RequestMapping(value="/handle91")publicStringhandle91(@ValidUseruser,

BindingResultbindingResult){ if(bindingResult.hasErrors()){

return"/user/register3";}else{return"/user/showUser";}}}1使用校驗功能時,處理方法要如何簽名?SpringMVC是通過對處理方法簽名的規(guī)約來保存校驗結(jié)果的:前一個表單/命令對象的校驗結(jié)果保存在其后的入?yún)⒅?,這個保存校驗結(jié)果的入?yún)⒈仨毷荁indingResult或Errors類型,這兩個類都位于org.springframework.validation包中。1校驗錯誤信息存放在什么地方?SpringMVC將HttpServletRequest對象數(shù)據(jù)綁定到處理方法的入?yún)ο笾校ū韱?命令對象);將綁定錯誤信息、檢驗錯誤信息都保存到隱含模型中;本次請求的對應(yīng)隱含模型數(shù)據(jù)存放到HttpServletRequest的屬性列表中,暴露給視圖對象。4561頁面如何顯示錯誤信息?<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@taglibprefix="c"uri="/jsp/jstl/core"%><%@taglibprefix="form"uri="/tags/form"%><html><head><title>注冊用戶</title><style>.errorClass{color:red}</style></head><body><form:formmodelAttribute="user"action="user/handle91.html">

<form:errorspath="*"/><table> <tr> <td>用戶名:</td> <td>

<form:errorspath="userName"cssClass="errorClass"/> <form:inputpath="userName"/> </td> </tr>… </table></form:form></body></html>1如何對錯誤信息國際化(1)一個屬性發(fā)生校驗錯誤時,SpringMVC會產(chǎn)生一系列對應(yīng)的錯誤碼鍵:publicclassUser{@Pattern(regexp=“w{4,30}”)

假設(shè)發(fā)生錯誤privateStringuserName;}如果userName的@Pattern校驗規(guī)則未通過,則會在“隱含模型”中產(chǎn)生如下的錯誤鍵,這些錯誤鍵可以作為“國際化消息”的屬性鍵。Pattern.user.userNamePattern.userNamePattern.StringPattern1如何對錯誤信息國際化(2)我們在conf/i18n/下添加基名為messages的國際化資源,一個是默認(rèn)的messages.properties,另一個是對應(yīng)中國大陸的messages_zh_CN.properties。來看一下messages_zh_CN.properties資源文件的內(nèi)容:<beanid="messageSource"class="org.springframework.context.support.ResourceBundleMessageSource"p:basename="conf/i18n/messages"/>1SpringMVC框架簡介2HTTP請求地址映射3HTTP請求數(shù)據(jù)的綁定4數(shù)據(jù)轉(zhuǎn)換、格式化、校驗5數(shù)據(jù)模型控制數(shù)據(jù)模型訪問結(jié)構(gòu)數(shù)據(jù)模型key1=value1,key2=value2,...接收請求處理請求請求響應(yīng)@ModelAttribute("user")@SessionAttributesModelAndView,Map及Model視圖對象暴露給...1訪問數(shù)據(jù)模型:ModelAndView通過ModelAndView:@RequestMapping(method=RequestMethod.POST)publicModelAndViewcreateUser(Useruser){ userService.createUser(user); ModelAndViewmav=newModelAndView(); mav.setViewName("user/createSuccess");

mav.addObject("user",user); returnmav;}1訪問數(shù)據(jù)模型:@ModelAttribute1、使用方式一@RequestMapping(value="/handle61")publicStringhandle61(@ModelAttribute("user")Useruser){ user.setUserId("1000"); return"/user/createSuccess";}

SpringMVC將HTTP請求數(shù)據(jù)綁定到user入?yún)⒅?,然后再將user對象添加到數(shù)據(jù)模型中。2、使用方式二@ModelAttribute("user")publicUsergetUser(){ Useruser=newUser(); user.setUserId("1001"); returnuser;}@RequestMapping(value="/handle62")publicStringhandle62(@ModelAttribute("user")Useruser){ user.setUserName("tom"); return"/user/showUser";}訪問UserController中任何一個請求處理方法前,SpringMVC先執(zhí)行該方法,并將返回值以user為鍵添加到模型中在此,模型數(shù)據(jù)會賦給User的入?yún)?,然后再根?jù)HTTP請求消息進(jìn)一步填充覆蓋user對象1訪問數(shù)據(jù)模型:Map及Modelorg.springframework.ui.Model和java.util.Map:

SpringMVC將HTTP請求數(shù)據(jù)綁定到user入?yún)⒅校缓笤賹ser對象添加到數(shù)據(jù)模型中。SpringMVC一旦發(fā)現(xiàn)處理方法有Map或Model類型的入?yún)ⅲ蜁⒄埱髢?nèi)在的隱含模型對象的引用傳給這些入?yún)?。@RequestMapping(value="/handle63")publicStringhandle63(ModelMapmodelMap){modelMap.addAttribute("testAttr","value1");Useruser=(User)modelMap.get("user");user.setUserName("tom"); return"/user/showUser";}1訪問數(shù)據(jù)模型:@SessionAttributes如果希望在多個請求之間共用某個模型屬性數(shù)據(jù),則可以在控制器類標(biāo)注一個@SessionAttributes,SpringMVC會將模型中對應(yīng)的屬性暫存到HttpSession中:@Controller@RequestMapping("/user")@SessionAttributes(“user”)①publicclassUserController{

@RequestMapping(value="/handle71") publicStringhandle71(@ModelAttribute(“user”)Useruser){② user.setUserName("John"); return"redirect:/user/handle72.html"; }

@RequestMapping(value="/handle72") publicStringhandle72(ModelMapmodelMap,SessionStatussessionStatus){

Useruser=(User)modelMap.get(“user”);③ if(user!=null){ user.setUserName("Jetty");

sessionStatus.setComplete();④

} return"/user/showUser"; } }將②處的模型屬性自動保存到HttpSession中讀取模型中的數(shù)據(jù)讓SpringMVC清除本處理器對應(yīng)的會話屬性1一場由@SessionAttributes引發(fā)的血案...

org.springframework.web.HttpSessionRequiredException:Sessionattribute'user'required-notfoundinsession...對入?yún)?biāo)注@ModelAttribute(“xxx”)的處理方法,SpringMVC按如下流程處理(handle71(@ModelAttribute(“user”)Useruser)):

如果隱含模型擁有名為xxx的屬性,將其賦給該入?yún)?,再用請求消息填充該入?yún)ο笾苯臃祷?,否則到2步

。

如果xxx是會話屬性,即在處理類定義處標(biāo)注了@SessionAttributes("xxx"),則嘗試從會話中獲取該屬性,并將其賦給該入?yún)?,然后再用請求消息填充該入?yún)ο?。如果在會話中找不到對?yīng)的屬性,則拋出HttpSessionRequiredException異常。否則到3。

如果隱含模型不存在xxx屬性,且xxx也不是會話屬性,則創(chuàng)建入?yún)⒌膶ο髮嵗?,再用請求消息填充該入?yún)ⅰ?如何避免@SessionAttributes引發(fā)的血案@Controller@RequestMapping("/user")@SessionAttributes(“user”)publicclassUserController{@ModelAttribute("user") publicUsergetUser(){ Useruser=newUser(); returnuser; }

@RequestMapping(value="/handle71") publicStringhandle71(@ModelAttribute(“user”)Useruser){ ...}

@RequestMapping(value="/handle72") publicStringhandle72(ModelMapmodelMap,SessionStatussessionStatus){... } }小Cakes該方法會往隱含模型中添加一個名為user的模型屬性1SpringMVC框架簡介2HTTP請求地址映射3HTTP請求數(shù)據(jù)的綁定4數(shù)據(jù)轉(zhuǎn)換、格式化、校驗5數(shù)據(jù)模型控制6視圖及解析器1SpringMVC是如何解析視圖的請求處理方法返回值類型ViewResolver視圖對象JSP/JSTL/PDF...StringModelAndViewModelAndViewViewModelMap1視圖解析器類型完成單一解析邏輯的視圖解析器:InternalResourceViewResolverFreeMarkerViewResolverBeanNameViewResolverXmlViewResolver...基于協(xié)商的視圖解析器:ContentNegotiatingViewResolver

該解析器是Spring3.0新增的,它不負(fù)責(zé)具體的視圖解析,而是作為一個中間人的角色根據(jù)請求所要求的MIME類型,從上下文中選擇一個適合的視圖解析器,再將視圖解析工作委托其負(fù)責(zé)。1基于協(xié)商的視圖解析器<beanclass="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"

p:order="0"p:defaultContentType="text/html"p:ignoreAcceptHeader="true"p:favorPathExtension="false"p:favorParameter="true"p:parameterName="content"> <propertyname="mediaTypes">

<map>

<entrykey="html"value="text/html"/>

<entrykey="xml"value="application/xml"/>

<entrykey="json"value="application/json"/>

</map> </property> <propertyname="defaultViews">

<list> <beanclass="org.springframework.web.servlet.view.json.MappingJacksonJsonView" p:renderedAttributes="userList"/> <beanclass="org.springframework.web.servlet.view.xml.MarshallingView" p:modelKey="userList"p:marshaller-ref="xmlMarshaller"/>

</list> </property></bean><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"

p:order="100"p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/views/"p:suffix=".jsp"/>1SpringMVC框架簡介2HTTP請求地址映射3HTTP請求數(shù)據(jù)的綁定4數(shù)據(jù)轉(zhuǎn)換、格式化、校驗5數(shù)據(jù)模型控制6視圖及解析器7其他1本地化:基礎(chǔ)原理

一般情況下,Web應(yīng)用根據(jù)客戶端瀏覽器的設(shè)置判斷客戶端的本地化類型,用戶可以通過IE菜單:工具→Internet選項...→語言...在打開的“語言首選項”對話框中選擇本地化類型。

瀏覽器中設(shè)置的本地化類型會包含在HTML請求報文頭中發(fā)送給Web服務(wù)器,確切地說是通過報文頭的Accept-Language參數(shù)將“語言首選項”對話框中選擇的語言發(fā)送到服務(wù)器,成為服務(wù)器判別客戶端本地化類型的依據(jù)。1本地化:SpringMVC的本地化解析器AcceptHeaderLocaleResolver:根據(jù)HTTP報文頭的Accept-Language參數(shù)確定本地化類型,如果沒有顯式定義本地化解析器,SpringMVC默認(rèn)采用AcceptHeader-LocaleResolver。CookieLocaleResolver:根據(jù)指定Cookie值確定本地化類型。SessionLocaleResolver:根據(jù)Session中特定的屬性值確定本地化類型。LocaleChangeInterceptor:從請求參數(shù)中獲取本次請求對應(yīng)的本地化類型。1LocaleChangeInterceptor:通過URL參數(shù)指定很多國際型的網(wǎng)站都允許通過一個請求參數(shù)控制網(wǎng)站的本地化,如?locale=zh_CN返回對應(yīng)中國大陸的本地化網(wǎng)頁,而?locale=en返回本地化為英語的網(wǎng)頁。這樣,網(wǎng)站使用者可以通過URL的控制返回不同本地化的頁面,非常靈活。<beanid="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"

p:cookieName="clientLanguage"

p:cookieMaxAge="100000"

p:cookiePath="/"

p:defaultLocale="zh_CN"/><mvc:interceptors><beanclass="org.springframework.web.servlet.i1

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論