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相关文章
- Java for Web学习笔记(六一):Controller替代Servlet(3)body映射到参数
- Java for Web学习笔记(六十):Controller替代Servlet(2)方法中的参数
- Java for Web学习笔记(五九):Controller替代Servlet(1)请求匹配
- Java for Web学习笔记(六二):Controller替代Servlet(4)方法返回值
- Java for Web学习笔记(六三):Controller替代Servlet(5)Model和View
- Java for Web学习笔记(六四):Controller替代Servlet(6)Spring Form Tag
- Java for Web学习笔记(六五):Controller替代Servlet(7)上传和下载(自定义View)
- Java for Web学习笔记(七):Servlet(5)初始化参数
- Java for Web学习笔记(八三):RESTful(3)Controller
- Java for Web学习笔记(五):Servlet(3)HttpServletRequest
- java web学习笔记(servlet生命周期)
- Java Web学习笔记(四)servlet
- Java Web 学习笔记(二)servlet
- Java Web学习笔记(一)Servlet
- Java for Web学习笔记(三):Servlet(1)Maven
- Java for Web学习笔记(四):Servlet(2)HelloServlet
- Java for Web学习笔记(六):Servlet(4)HttpServletResponse
- Java for Web学习笔记(九):Servlet(7)上传文件
- Spring Boot + Swagger
- JAVA之HTTP,Servlet项目
- JVM 垃圾回收器工作原理及使用实例介绍
- Hbase API 的简单使用
- java学习(4)ArrayList、LinkedList类以及区别
- Java for Web学习笔记(六一):Controller替代Servlet(3)body映射到参数
- Java数据结构与算法---栈的实现
- Java 模拟福彩双色球
- 在retrofit访问网络返回json数据添加解析器
- 一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
- 遇到 java.lang.NoSuchMethodError的解决办法,路径带L
- Arc协议
- Java虚拟机之高效并发
- 尚学堂百战程序员1573题 答案 第四章数组,仅供参考