form表单传递到servlet数据的封装
一、前言:
为什么要封装
先看看初始代码:
addUser.jsp中代码段
<!-- 这里只是写个测试,数据没用到handler也没用到BaseServlet -->
<form action="${ctxPath }/userInfo.do" method="post">
<input type="hidden" name="handler" value="addUser">
用户名称:<input type="text" name="realName"><br>
别名:<input type="text" name="avatar"><br>
性别:<input type="radio" name="gender" value="F">女<input type="radio" name="gender" value="M">男<br>
生日:<input type="text" name="birthday"><br>
邮箱:<input type="text" name="email"><br>
电话:<input type="text" name="phone"><br>
<input type="submit" value="提交">
</form>
UserInfoServlet.java中代码段
request.setCharacterEncoding("UTF-8");
String realName=request.getParameter("realName");
String avatar=request.getParameter("avatar");
String gender=request.getParameter("gender");
String birthday=request.getParameter("birthday");
String email=request.getParameter("email");
String phone=request.getParameter("phone");
你会发现 StringrealName=request.getParameter("realName"); 这种代码要写一堆,如果一个表单几十条数据(写表单的瓜皮丧心病狂啊)。
就需要几十条get方法。
然后封装成对象,就要写几十条set方法。
(例如:UserDetailInfo udi = new UserDetailInfo();
udi.setRealName(realName);
......balabala
)
很不方便。所以,愚蠢的人类妄图want to 封装伊特。
二、工具包:
commons-beanutils包
用maven导入。如果没用过maven可以看我的上一篇文章如何使用maven,哦好吧,我还没写,这是个假的超链接,先立个flag在这吧。
导入代码
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
复制粘贴进pom.xml即可
主要使用org.apache.commons.beanutils.BeanUtils类的populate方法
三、使用:
//将属性全放到map里面。相当于那一堆get
Map<String, String[]> map = request.getParameterMap();
System.out.println("========看看是个啥========>"+ map);
输出:
========看看是个啥========>org.apache.catalina.util.ParameterMap@20a1e884
发现阔以直接存Map里。
//然后将请求的Map封装成JavaBean。相当于一堆set
BeanUtils.populate(udi, map);
System.out.println("==================>" + udi);
输出:==================>UserDetailInfo[userId=0, realName=chenyu, gender=M, avatar=xue, phone=999, email=soccor@163.com,birthday=Thu May 09 00:00:00 GMT+08:00 1996]
HTTP Status 500
还差一个东西。封装时日期格式不对。
UserDetailInfo.java中定义属性时:
private Date birthday;
String和Date相遇的尴尬
解决:
利用这个类的方法 org.apache.commons.beanutils.ConvertUtils将String转换成日期格式
UserInfoServlet.java中代码段
//添加一个转换器。成功转换日期
ConvertUtils.register(new Converter(){
public Date convert(Class type, Object value) {
if(value != null){
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(value.toString());
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}, Date.class);
添加上之后,输出:==================>UserDetailInfo[userId=0, realName=chenyu, gender=M, avatar=xue, phone=999, email=soccor@163.com,birthday=Thu May 09 00:00:00 GMT+08:00 1996]
所以,这个代码段的作用是减去一个删除线(我在扯淡)。是将String转换成日期格式。
四、完整java代码:
BaseServlet祥见利用反射简化(抽象)Servlet层
反射基础详见java反射机制
UserInfoServlet.java完整代码
package com.zzit.mvc.user.action;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import com.zzxtit.mvc.common.servlet.BaseServlet;
import com.zzxtit.mvc.user.entity.UserDetailInfo;
@WebServlet("/userInfo.do")
public class UserInfoServlet extends BaseServlet{
private static final long serialVersionUID = 7050340646138731680L;
public void addUser(HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("UTF-8");
UserDetailInfo udi = new UserDetailInfo();
//将属性全放到map里面
Map<String, String[]> map = request.getParameterMap();
System.out.println("=========看看是个啥========>" + map);
//添加一个转换器。成功转换日期
ConvertUtils.register(new Converter(){
public Date convert(Class type, Object value) {
if(value != null){
try {
return new SimpleDateFormat("yyyy-MM-dd").parse(value.toString());
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}, Date.class);
//将请求的Map封装为JavaBean
BeanUtils.populate(udi, map);
System.out.println("==================>" + udi);
}
}
输出:=========看看是个啥========>org.apache.catalina.util.ParameterMap@20a1e884
==================>UserDetailInfo[userId=0, realName=chenyu, gender=M, avatar=xue, phone=999,email=soccor@163.com, birthday=Thu May 09 00:00:00 GMT+08:00 1996]
五、总结:
这次学到了一个很简单的方法封装数据,以后写后台又方便了。