﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-流传的储藏罐-文章分类-Spring框架学习</title><link>http://www.blogjava.net/liuxiaosan/category/48256.html</link><description>操蛋的人生处处充满美妙</description><language>zh-cn</language><lastBuildDate>Tue, 13 Sep 2011 10:39:33 GMT</lastBuildDate><pubDate>Tue, 13 Sep 2011 10:39:33 GMT</pubDate><ttl>60</ttl><item><title>基于注解的SpringMVC</title><link>http://www.blogjava.net/liuxiaosan/articles/357092.html</link><dc:creator>liucs</dc:creator><author>liucs</author><pubDate>Mon, 05 Sep 2011 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/liuxiaosan/articles/357092.html</guid><wfw:comment>http://www.blogjava.net/liuxiaosan/comments/357092.html</wfw:comment><comments>http://www.blogjava.net/liuxiaosan/articles/357092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuxiaosan/comments/commentRss/357092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuxiaosan/services/trackbacks/357092.html</trackback:ping><description><![CDATA[<h2>一、概述</h2>SpringMVC在2.5版本后新增了注解功能，2.5版本以前的基本通过继承Controller体系来开发业务控制器，2.5版本后Controller体系中<br /><div>BaseCommandController及其子类AbstractCommandController、AbstractFormController、AbstractWizardFormController、<div><div><div><div>SimpleFormController、CancellableFormController等都已经被标示为@Deprecated，建议不再使用。</div></div></div></div><br />相比传统的继承Controller体系中某些类的方式，SpringMVC的注解具有以下优点：<br />1、Controller不再需要继承某个特定类，只是简单的POJO。<br />2、请求映射的配置非常方便灵活。<br />3、参数绑定机制非常方便丰富。<br />4、可以根据不同的http方法或者参数，细粒度处理不同的http请求<br /><br /><h2>二、示例</h2>下面通过对SpringMVC注解的详细介绍来看一下上述优点。<br /><br />首先需要在应用的dispatcher-servlet.xml 启动注解机制<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">context:annotation</span><span style="color: #000000; ">-</span><span style="color: #000000; ">config&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">&nbsp;设置注解驱动&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">mvc:annotation</span><span style="color: #000000; ">-</span><span style="color: #000000; ">driven&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">&nbsp;设置扫描的包&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">context:component</span><span style="color: #000000; ">-</span><span style="color: #000000; ">scan&nbsp;base</span><span style="color: #000000; ">-</span><span style="color: #0000FF; ">package</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">com.demo.web.controller</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">bean&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">bean&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;<br /></span></div><br />注：虽然我们的Controller不需要再继承任何类，但出于规范，我们仍然命名为***Controller.java，并统一放在<span style="color: #000000;">com.demo.web.controller包中。<br /></span><h4><span style="color: #000000;">1、@Controller注解</span></h4><h3><span style="color: #000000;"></span></h3><span style="color: #000000;">简单示例<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.demo.controller;<br /><br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.stereotype.Controller;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.web.bind.annotation.RequestMapping;<br /><br />@Controller<br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;IndexController&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;index()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">index</span><span style="color: #000000; ">"</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><div><span style="color: #000000;"></span><span style="color: #000000;">在一个POJO上面使用 @Controller 就可以标注该POJO是一个Controller，就这么简单。 @Controller注解定义在org.springframework.steretype包中。<br />使用方式： @Controller 或者 @Controller("indexController)。 org.springframework.steretype包中还包含 @Componenet @Service @Respository<br />三个注解。@Component是通用标注，@Controller标注web控制器，@Service标注Servicec层的服务，@Respository标注DAO层的数据访问。<br /><br /></span><h4><span style="color: #000000;">2、使用@RequestMapping注解处理请求映射</span></h4><h4><span style="color: #000000;"></span></h4>&nbsp;&nbsp;&nbsp; SpringMVC中注解基本都包含在 org.springframework.web.bind.annotation 包中。先看一下<span style="color: #000000;">@RequestMapping</span> 注解的源码。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@Target(&nbsp;{&nbsp;ElementType.METHOD,&nbsp;ElementType.TYPE&nbsp;})<br />@Retention(RetentionPolicy.RUNTIME)<br />@Documented<br />@Mapping<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;RequestMapping&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定映射的URL.可以在类层次和方法层次使用。方式如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping("/add_")或&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/add")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;支持Ant风格的URL映射,如&nbsp;@RequestMapping("/myPath/*.htm")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在类层次指定了映射后,可以在方法层次再指定相对路径<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;value()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定HttpRequest的方法,&nbsp;如：GET,&nbsp;POST,&nbsp;HEAD,&nbsp;OPTIONS,&nbsp;PUT,&nbsp;DELETE,&nbsp;TRACE.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用举例：&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/add_activity",&nbsp;method&nbsp;=&nbsp;RequestMethod.GET)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;RequestMethod[]&nbsp;method()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定HttpRequest中包含的参数,使用方式如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",params="myParam")&nbsp;请求包含myParam参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",params="myParam=myValue")请求包含myParam参数，并且该参数值为myValue<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",params="!myParam")&nbsp;请求不包含myParam参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;params()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;指定HttpRequest中包含的头部信息,使用方式如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",&nbsp;headers="content-type")请求包含该头部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",&nbsp;headers="content-type=text/*")请求包含特定值的头部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/something",&nbsp;headers="!content-type")请求不包含该头部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;headers()&nbsp;</span><span style="color: #0000FF; ">default</span><span style="color: #000000; ">&nbsp;{};<br /><br />}<br /></span></div>注：如果在类层次指定了映射，则方法层次上都将继承类层次的映射<br /><br /><h4>3、获取HttpRequest中得参数</h4><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;"><div>@RequestMapping("active")<br />public @ResponseBody boolean active(Long accountId) {<br />&nbsp;&nbsp;&nbsp; return accountService.activeAccount(accountId);<br />}<br /><br /><div><span style="color: #000000; ">@RequestMapping("active")<br />public @ResponseBody boolean active(Account account) {<br />&nbsp;&nbsp;&nbsp; return accountService.activeAccount(accountId);<br />}</span></div></div>@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">inactive</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@ResponseBody&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;inactive(@RequestParam(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accountId</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;Long&nbsp;accountId,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@RequestHeader(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">User-Agent</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;String&nbsp;userAgent,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@CookieValue(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">loginId</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;String&nbsp;loginId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;accountService.inactiveAccount(accountId);<br />}<br /><br />@RequestMapping(value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">list/{pageNo}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;RequestMethod.GET)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String list(@PathVariable&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;pageNo)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/account/list</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />}<br /><br /><div>@RequestMapping(value = "add", method = RequestMethod.GET)<br />public String add(@RequestBody String body) {<br />&nbsp;&nbsp;&nbsp;&nbsp; return "/account/add";<br />}</div><br /></span></div><span style="color: #000000;"><br /><div><span style="color: #000000; ">active方法的入参 accountId，如果请求中有名为 accountId的参数，则会进行默认绑定，不仅基本类型，javabean的属性也可以默认进行绑定；<br />如果需要明确绑定，使用@RequestParam。 一般建议进行明确指定。<br /><br /></span></div>3.1 @RequestParam 绑定httpRequest中参数，@RequestParam("accountId") 完整形式为&nbsp; @RequestParam(value="accountId",required=true，defaultValue=null)<br />3.2 @RequestHeader 绑定httpRequest头部信息，@RequestHeader("User-Agent") 完整形式为 @RequestHeader(value="User-Agebt",required=true, defaultValue=null)<br />3.3 @CookieValue 绑定一个Cookie值，@CookieValue("loginId") 完整形式为 @CookieValue(value="loginId",required=true,defaultValue=null)<br />3.4 @RequestBody 将httpRequest的body绑定到方法参数上<br />3.5 @ModelAttribute 有两种使用方式: 1)在方法级别，指定方法的返回值绑定到model中； 2）方法参数级别，指定model中的值绑定到方法的入参上 示例如下：<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;@ModelAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">countryList</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;getCountries()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />@RequestMapping(value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">search</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;method&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;RequestMethod.POST)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;searchAccount(@ModelAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">accountId</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;Long&nbsp;accountId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/search</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><span style="color: #000000;"></span><h4><span style="color: #000000;">4、使用@ResponseBody 生成response</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 适用于webservice的数据交换，或ajax异步请求，text、json或者xml格式的数据交换。<br />&nbsp;&nbsp;&nbsp; 例如访问： http://localhost:8080/accounts/info.htm<br />&nbsp; </span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@RequestMapping(value&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">info</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;@ResponseBody&nbsp;Account&nbsp;getAccount()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Account&nbsp;a&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Account();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.setId(</span><span style="color: #000000; ">123L</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">zhangsan</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000;">&nbsp;a;<br />&nbsp;}</span></div><span style="color: #000000;"><br />返回数据如下： <div>{"name":"zhangsan","id":123}</div>从上面例子可以看出，使用@ResponseBody后，返回的javabean默认被序列化成json格式的数据并被写入到response body中。<br /><br />@Request 和 @ReponseBody 使用了HttpMessageConverter机制。下面是HttpMessageConverter的继承体系。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/liuxiaosan/HttpMessageConverter.png" alt="" border="0" height="314" width="666" /><br />常用的有如下几个：<br /><div>StringHttpMessageConverter ---字符串<br /><div>MappingJacksonHttpMessageConverter ----json<br /><div>ByteArrayHttpMessageConverter ----字节数组<br /><div>MarshallingHttpMessageConverter -----xml</div></div></div></div></span><h4><span style="color: #000000;">5、使用模板技术生成response</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 适用于一般页面请求。可以使用velocity freemarker等模板技术，在dispatcher-servlet.xml中需要设置viewResolver。<br />&nbsp;&nbsp;&nbsp; </span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;index(ModelMap&nbsp;modelMap)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modelMap.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">liucs</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />}<br /><br />@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;index2(Model&nbsp;model)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.addAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">liucs</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">index</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />}<br /><br /><div>@RequestMapping("/index")<br />public ModelAndView index3() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ModelAndView mav = new ModelAndView("index");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mav.addObject("name", "liucs");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mav;<br />}</div><br /></span></div><span style="color: #000000;">如上面代码index1和index2所示，不使用@ResponseBody注解。 返回一个String类型，这个String是viewname, 如果是重定向，return "redirect:/index.htm".<br />入参可以包含ModelMap或者Model，其实这两者是一个东西，作用一样。也可以采用index3式的传统写法，返回一个ModelAndView对象。<br /></span><h4><span style="color: #000000;">6、数据验证</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;">@InitBinder标注<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@InitBinder<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;myInitBinder(WebDataBinder&nbsp;binder){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binder.setDisallowedFields(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;String[]{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">id</span><span style="color: #000000; ">"</span><span style="color: #000000;">});<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>通过在方法中声明一个BindingResult参数来启动绑定和验证<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@RequestMapping(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">update</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;update(@ModelAttribute(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">account</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)&nbsp;Account&nbsp;account,BindingResult&nbsp;bindResult)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(bindResult.hasErrors()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&#8230;&#8230;</span><span style="color: #008000; "><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>需要注意以下限制：<br />1、BindingResult参数必须跟在一个JavaBean参数后面<br />2、错误会被自动的绑定到model中，便于渲染模板时使用<br />3、不支持@RequestBody等类型的参数形式<br /><h4><span style="color: #000000;">7、异常处理</span></h4><h4><span style="color: #000000;"></span></h4><span style="color: #000000;"></span>@ExceptionHandler<br /><h4><span style="color: #000000;"></span></h4><span style="color: #000000;"><br /></span></div></div><img src ="http://www.blogjava.net/liuxiaosan/aggbug/357092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuxiaosan/" target="_blank">liucs</a> 2011-09-05 16:42 <a href="http://www.blogjava.net/liuxiaosan/articles/357092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>