这篇还是来学习HttpServletRequest如何获取表单内容的相关方法,本篇重点学习getParameterMap()这个方法,就是得到表单里全部键值对,返回一个map对象。我们实际开发中,得到表单数据肯定不是为了打印到控制台,而是存入到数据库。在存入数据库之前,我们拿到零散的数据去操作效率很低,一般我们都要封装成高级对象(Java Bean),然后通过JDBC存入数据库。本篇具体来学习如何得到表单数据并封装成高级对象的过程。
1.先写一个高级对象User.java
package com.anthony.entity;
import java.util.Arrays;
public class User {
private String userName;
private String pwd;
private String gender;
private String[] hobby;
private String city;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "User [userName=" + userName + ", pwd=" + pwd + ", gender=" + gender + ", hobby="
+ Arrays.toString(hobby) + ", city=" + city + "]";
}
}
这些字段和register.html中name一致,具体register.html内容请看前面文章。
2.ServletDemo.java内容
package com.anthony.servlet;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.anthony.entity.User;
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
try {
User u = new User();
System.out.println("封装数据之前的用户数据:" + u);
//获取表单里数据,返回是一个map
Map<String, String[]> map = req.getParameterMap();
for (Entry<String, String[]> m : map.entrySet()) {
String name = m.getKey();
String[] value = m.getValue();
//创建一个属性描述器
PropertyDescriptor dp = new PropertyDescriptor(name, User.class);
Method setter = dp.getWriteMethod();
if(value.length == 1) {
setter.invoke(u, value[0]);
}else {
setter.invoke(u, (Object)value);
}
}
System.out.println("封装数据之后的用户数据:" + u);
} catch (Exception e) {
e.printStackTrace();
}
}
private void test(HttpServletRequest req) {
//获取表单中全部name的值
Enumeration<String> names = req.getParameterNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
//考虑到hobby下有多个值
String[] values = req.getParameterValues(name);
for (int i = 0; values != null && i < values.length; i++) {
System.out.println(name +"\t"+ values[i]);
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
重点理解上面代码描述器PropertyDescriptor的使用,通过反射可以找到User.class,然后PropertyDescriptor对象有获取高级对象类中setter和getter方法,上面我们只用了得到setter方法,然后遍历map集合,封装成User对象。
测试运行效果
信息: Server startup in 522 ms
封装数据之前的用户数据:User [userName=null, pwd=null, gender=null, hobby=null, city=null]
封装数据之后的用户数据:User [userName=AnthonyLiu, pwd=123abc, gender=男, hobby=[唱歌, 编码], city=BJ]