Java for Web学习笔记(六一):Controller替代Servlet(3)body映射到参数

来源:互联网 发布:买了一辆豪车后 知乎 编辑:程序博客网 时间:2024/06/04 17:50

将参数映射得到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解析里面参数部分例如:

-----------------------------2985014364966Content-Disposition: form-data; name="fname"John-----------------------------2985014364966Content-Disposition: form-data; name="lname"Smith-----------------------------2985014364966Content-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如下:

-----------------------------3065288262037Content-Disposition: form-data; name="name" test-----------------------------3065288262037Content-Disposition: form-data; name="files"; filename=".WEI-107.last"Content-Type: application/octet-streamcontent_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相关文章


阅读全文
0 0