Java for Web学习笔记(六一):Controller替代Servlet(3)body映射到参数
2017-06-10 18:16
706 查看
将参数映射得到Object
<form action="form" method="post"> <p>First name: <input type="text" name="fname" /></p> <p>Last name: <input type="text" name="lname" /></p> <p>Email Address: <input type="text" name="email" /></p> <input type="submit" value="Submit" /> </form>
上面是一个简单的form,实际上可以传递的参数更多,十几个,甚至几十个,这时,逐一标记就很麻烦。我们可以将这些请求参数映射到一个对象中。
根据form格式创建类:
public class TestFormData { private String fname; private String lname; private String email; ... getters and setters ... }
在Controller中,可以简单地写为:
@ResponseBody @RequestMapping(value="form", method=RequestMethod.POST) public String testform(TestFormData data){ logger.info("data : " + data.getFname() + "," + data.getLname() + " " + data.getEmail()); return ..... }
一般而言,我们都需要对输入的数据进行检查,如果我们不想将代码放入Controller中,可以对其Valid,具体的将在以后介绍。
@RequestMapping(value="form", method=RequestMethod.POST) public String testform(@Valid UserRegistrationForm form, BindingResult validation)
将消息体映射到Object
上面是一般form提交,即Content-Type:"application/x-www-form-urlencoded",HTTP body中还可以是其他的格式,如目前在RESTful中最为常用的JSON,以及一度流行的XML,还可能是二进制,或者BASE64加密等格式。这些格式要映射到对象中,通常作为request entity或者HTTP entity。通过@RequestBody,Spring使用Spring HTTP 转换器自动将entity转换为方法中的参数。转换器将在以后学习。@RequestMapping(......) public String update(@RequestBody Account account) { ... }
同样,我们也可以标记@Valid检查,即双标记:@Valid @RequestBody。
我们还可以是用org.springframework.http.HttpEntity<?>替代@RequestBody,HttpEntity可以获得Header(HttpHeaders)和Body。然而这种方式不能进行自动检验,一般很少使用。
@RequestMapping(......) public String update(HttpEntity<Account> request) { ... }
将MultiPart消息体映射到Object
引入CommonsMultipartResolver
对form还有一种比较常见的是multipart/form-data,多用于上传文件。对于解析multipart,需要使用CommonsMultipartResolver。我们需要在pom.xml中增加一个依赖jar包:<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency>
同时在ServletContext.xml中加入CommonsMultipartResolver作为bean:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8" /> <property name="maxUploadSize" value="10485760000" /> <property name="maxInMemorySize" value="40960" /> </bean>
这样就能使用@RequestParam解析里面参数部分例如:
-----------------------------2985014364966 Content-Disposition: form-data; name="fname" John -----------------------------2985014364966 Content-Disposition: form-data; name="lname" Smith -----------------------------2985014364966 Content-Disposition: form-data; name="email" abc@example.com -----------------------------2985014364966--
然而File是不能被PropertyEditors或者Converters自动转换的。
对file的参数获取
<form action="form2" method="post" enctype="multipart/form-data"> <p>name: <input type="text" name="name" /></p> <p><input type="file" name="files" /> </p> <p><input type="submit" value="上传" /> </p> </form>
HTTP body如下:
-----------------------------3065288262037 Content-Disposition: form-data; name="name" test -----------------------------3065288262037 Content-Disposition: form-data; name="files"; filename=".WEI-107.last" Content-Type: application/octet-stream content_15min_2017_05_11_16_30 -----------------------------3065288262037--
通过@RequestParam只能解析到name,解析不了files和文件的内容。Spring提供了@RequestPart来表示某个一部分,对这部分通过HTTP message converter来进行转换。对于file部分,可以使用Part或者MultipartFile均可。
//多个文件上传 @RequestMapping(......) public String upload(@RequestParam("name") String name, @RequestPart("files") List<MultipartFile> files){ logger.info("name : " + name); for(MultipartFile file : files){ logger.info("file Size : " + file.getSize()); logger.info("file Orgin Name : " + file.getOriginalFilename()); } ... ... }
同样地,可以对@RequestPart加上@Valid。但这很少使用,因为multipart主要用于文件上传。
直接映射到对象
//【注意】有一个不太明白的地方,在前面,使用Part还是MultipartFile都可以得到正确的解析,但是在映射到对象中,如果使用Part,将会报400错误,描述:The request sent by the client was syntactically incorrect.,只能使用MultipartFile。 public class TestFileData { private String name; // private List<MultipartFile> files; private MultipartFile files; ... getters and setters ... } @RequestMapping(......) public String upload(TestFileData data){...}
相关链接:
我的Professional Java for Web Applications相关文章
相关文章推荐
- Java for Web学习笔记(六十):Controller替代Servlet(2)方法中的参数
- Java for Web学习笔记(六二):Controller替代Servlet(4)方法返回值
- Java for Web学习笔记(六四):Controller替代Servlet(6)Spring Form Tag
- Java for Web学习笔记(五九):Controller替代Servlet(1)请求匹配
- Java for Web学习笔记(六三):Controller替代Servlet(5)Model和View
- Java for Web学习笔记(六):Servlet(4)HttpServletResponse
- Java for Web学习笔记(十):Servlet(8)下发文件
- Java for Web学习笔记(一一一):再谈Entity映射(4)动态表格创建
- java for Web学习笔记之Servlet的使用及注意事项
- Java for Web学习笔记(一一二):再谈Entity映射(5)原生SQL和isolation
- Java for Web学习笔记(八):Servlet(6)doGet()和doPost()是线程还是队列
- Java for Web学习笔记(九):Servlet(7)上传文件
- java 集合学习笔记2-ArrayList LinkedList Vector 泛型 增强for 可变参数
- Java for Web学习笔记(十四):JSP(4)JSP Tag
- Java for Web学习笔记(一百):持久化初探(5)Enum、时间和lob的类型匹配
- 【JAVA WEB】学习笔记——Servlet入门
- Java for Web学习笔记(二五):JSTL(1)使用JSTL
- JavaWeb 学习笔记(二)Servlet生命周期
- Java for Web学习笔记(八六):消息和集群(1)一般性了解
- Java for Web学习笔记(四一):Filter(3)用于Log