[Note]Spring MVC、hibernate validator和i18n(三)

来源:互联网 发布:龙虎大师软件怎么样 编辑:程序博客网 时间:2024/05/29 21:28

上一节提到,welcome.jsp页面上有一个链接<a href="account"><fmt:message key="view.title"/></a>,向服务器发出请求“/account”,该请求会被标记有@Controller的控制器AccountController处理,下面是该控制器的源代码:

@RequestMapping(value="/account")表示AccountController只要是对“/account”的请求都会处理,比如“/account”,“/account/4”,“/account/createFrome”,“/account/view”等等。AccountController的方法上的@RequestMapping标记是对请求形式的具体要求。对于通过welcome.jsp页面上的链接发送的“/account”请求,其方法是GET,所以标记为@RequestMapping(method=RequestMethod.GET)的方法会处理该请求。

用@RequestMapping标记的方法的签名可以多种形式,方法的参数可以是request和response对象、Session对象,java.util.Map/org.springframework.ui.Model/org.springframework.ui.ModelMap对象,Command/form对象,@RequestParam和@PathVariable标记的对象,org.springframework.validation.Errors/org.springframework.validation.BindingResult等等。本例中,public String getCreatForm(Model model)传入的Model对象在方法中加入了一个Account实例,该model会被传给相应的view对象,view对象就可以对model中的Account进行操作,例如进行数据绑定。model会为加入的对象产生一个供view引用的key值,默认就是加入对象的类名的小写,本例是"account"。关于方法参数的各种类型代表的含义和使用方法,详见Spring的参考文档。本节和下一节只对本例中出现的情况进行节要说明。
用@RequestMapping标记的方法的返回值类型可以有ModelAndView,Model,Map,View,String等等,AccountController类的各方法返回的类型都是String,表示将request转给相应的View对象,例如public String getCreatForm(Model model)方法的返回值是“account/createForm”,那么request就会传递给名字为account/createForm的View对象,根据在第一节中说明的配置,InternalResourceViewResolver会从/WEB-INF/views/account/文件夹中寻找名字为createForm的jsp页面,找到后对该页面进行解析,并把getCreatForm(Model model)方法中的model与返回给用户的response绑定。

下面是类Account的代码:

可以看出Account只是一个很普通的POJO类,需要注意的是在它的字段上的表示,本节先对@NumberFormat和@DateTimeFormat进行说明,其他的标记下一节介绍。@NumberFormat和@DateTimeFormat都是对字段的格式进行限制,不仅限制了字段在于其绑定的页面上的显示格式,在字段的值的验证阶段也会对值的格式进行检查,如果格式不对,那么就会产生Error code为typeMismatch的Error放入BindingResult中。@NumberFormat和@DateTimeFormat根据style属性的值来确定字段的格式。其中@DateTimeFormat是对日期和时间格式的限制,其style值由S, M, L和-组成,分别表示short, medium, long和省略的时间与日期格式,并且前一个字母用于显示日期,后一个字母限制时间。本例的style="M-"就表示该字段的格式应该只有日期没有时间,且日期显示格式为medium。

下面是createForm页面的内容:

该页面使用了一些Spring的form标签来进行数据绑定。首先<form:form modelAttribute="account" method="post">声明在该form内绑定的对象是account,前文提到,该对象是AccountController的方法getCreatForm(Model model)加入到model中的。在form中,form:label和form:input都被绑定在相应的account对象的属性上,对于cssErrorClass和form:errors将在下节介绍。前文提到,Account类型的各字段被标记@NumberFormat或@DateTimeFormat,那么在相应的form:input中显示的值就会变成规定的格式,并且输入的数据也必须满足格式要求,否则就会产生Error,在下一节将介绍数据验证。

<form:form modelAttribute="account" method="post">并没有指明提交的路径,因此当提交该form时,路径依旧是“/account/createForm”,但是提交的方法变为POST,此时,该request仍会被AccountController处理,调用的方法就是标记为@RequestMapping(method=RequestMethod.POST)的public String create(@Valid Account account, BindingResult result),该方法对传入的account对象进行验证,验证结果会放入BindingResult中,关于验证请见下一节。方法处理完毕后返回"redirect:/account/" + account.getId(),其中redirect表示将response交给RedirectView实例,RedirectView会强制把当前阶段的控制器产生的response传递给下一个控制器,而略过正常情况下应该进行的View的解析。RedirectView传递的路径是“/account/”+account.getId(),还是会被AccountController处理,这时调用的方法是标记了@RequestMapping(value="{id}", method=RequestMethod.GET)的public String getView(@PathVariable Long id, Model model),此时使用的是Spring中的URI Templates影射,即标记为@RequestMapping(value="{XXX}")的方法会对请求路径中的变量并进行影射,通过@PathVariable标记的方法参数来获取变量的值,例如本例,但路径为“/account/5”时,方法public String getView(@PathVariable Long id, Model model)中的id的值就为5。使用URI Templates要保证@PathVariable标记的方法参数名字与{}中的相同,或者在@PathVariable标记中指定要提取的变量的名字。getView(@PathVariable Long id, Model model)方法把指定id的account对象放入model中后,返回“/account/view”,/WEB-INF/views/account/文件夹中的view.jsp就会被找到并解析,通知model也被绑定到response中。下面是view.jsp页面的内容:

与creatForm页面相似,不同的是没有使用form:input来绑定数据,而是使用EL表达式和jstl的标签来从绑定的account对象中提取数据,使用jstl的fmt标签绑定的数据格式会随着Locale变化。

原创粉丝点击