您的位置:首页 > 编程语言 > Java开发

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相关文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: