内省和BeanUtils框架封装请求参数到JavaBean中的原理
注: 需要jar包: commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar
*********************************************************************************************
public class User {
private String username;
private String[] password;
private String gender;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String[] getPassword() {
return password;
}
public void setPassword(String[] password) {
this.password = password;
}
@Override
public String toString() {
return "User [gender=" + gender + ", password="
+ Arrays.toString(password) + ", username=" + username + "]";
}
}
*********************************************************************************************
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Regist.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<form action="/day07/servlet/RequestDemo3" method="post">
用户名: <input type="text" name="username"> <br/><br/>
密码: <input type="password" name="password"> <br/><br/>
重复密码:<input type="password" name="password"/><br/><br/>
性别: <input type="text" name="gender"><br/><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
*********************************************************************************************
// 获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中
// 但若有多个字段,则须添加多次if判断,麻烦
public void test1(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String paramName = (String) e.nextElement();
String values[] = request.getParameterValues(paramName);
if("username".equals(paramName)){
user.setUsername(values[0]);
}
if("password".equals(paramName)){
user.setPassword(values);
}
}
System.out.println("封装后:" + user);
}
---------------------------------------------------------------------------------------------------------------
// **获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中
// 表单输入域的名称和JavaBean中的属性名称一致 且可以通过修改javaBean和html中的字段来增加字段而不必更改servlet
public void test2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String paramName = (String) e.nextElement();
String values[] = request.getParameterValues(paramName);
try {
PropertyDescriptor pd = new PropertyDescriptor(paramName, User.class);
Method m = pd.getWriteMethod(); // 得到setter方法
if(!(values.length > 1))
m.invoke(user, values);
else
m.invoke(user, (Object)values);
} catch (Exception e1) {
e1.printStackTrace();
}
}
System.out.println("封装后:" + user);
}
---------------------------------------------------------------------------------------------------------------
// ***获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中 该方法封装了如上方法
public void test3(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
// key: 请求参数的名称 是String类型; value: 请求参数的值,是String[]类型
Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> me:map.entrySet()){
String paramName = me.getKey();
String[] values = me.getValue();
try {
PropertyDescriptor pd = new PropertyDescriptor(paramName,User.class);
Method m = pd.getWriteMethod();
if(!(values.length > 1))
m.invoke(user, values);
else
m.invoke(user, (Object)values);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("封装后:" + user);
}
---------------------------------------------------------------------------------------------------------------
// ***获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中 最简便的方式
// *****通用方式: 借助于BeanuTils框架,编写代码时,保持表单输入与与javaBean的属性一致即可
public void test4(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
try {
// 该方法实现原理就是 test3的封装
BeanUtils.populate(user, request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("封装后:" + user);
}
注: 需要jar包: commons-beanutils-1.8.3.jar和commons-logging-1.1.1.jar
*********************************************************************************************
public class User {
private String username;
private String[] password;
private String gender;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String[] getPassword() {
return password;
}
public void setPassword(String[] password) {
this.password = password;
}
@Override
public String toString() {
return "User [gender=" + gender + ", password="
+ Arrays.toString(password) + ", username=" + username + "]";
}
}
*********************************************************************************************
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Regist.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<form action="/day07/servlet/RequestDemo3" method="post">
用户名: <input type="text" name="username"> <br/><br/>
密码: <input type="password" name="password"> <br/><br/>
重复密码:<input type="password" name="password"/><br/><br/>
性别: <input type="text" name="gender"><br/><br/>
<input type="submit" value="注册">
</form>
</body>
</html>
*********************************************************************************************
// 获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中
// 但若有多个字段,则须添加多次if判断,麻烦
public void test1(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String paramName = (String) e.nextElement();
String values[] = request.getParameterValues(paramName);
if("username".equals(paramName)){
user.setUsername(values[0]);
}
if("password".equals(paramName)){
user.setPassword(values);
}
}
System.out.println("封装后:" + user);
}
---------------------------------------------------------------------------------------------------------------
// **获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中
// 表单输入域的名称和JavaBean中的属性名称一致 且可以通过修改javaBean和html中的字段来增加字段而不必更改servlet
public void test2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String paramName = (String) e.nextElement();
String values[] = request.getParameterValues(paramName);
try {
PropertyDescriptor pd = new PropertyDescriptor(paramName, User.class);
Method m = pd.getWriteMethod(); // 得到setter方法
if(!(values.length > 1))
m.invoke(user, values);
else
m.invoke(user, (Object)values);
} catch (Exception e1) {
e1.printStackTrace();
}
}
System.out.println("封装后:" + user);
}
---------------------------------------------------------------------------------------------------------------
// ***获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中 该方法封装了如上方法
public void test3(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
// key: 请求参数的名称 是String类型; value: 请求参数的值,是String[]类型
Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> me:map.entrySet()){
String paramName = me.getKey();
String[] values = me.getValue();
try {
PropertyDescriptor pd = new PropertyDescriptor(paramName,User.class);
Method m = pd.getWriteMethod();
if(!(values.length > 1))
m.invoke(user, values);
else
m.invoke(user, (Object)values);
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("封装后:" + user);
}
---------------------------------------------------------------------------------------------------------------
// ***获取所有的参数和取值: 实际开发中应该把数据封装到javaBean中 最简便的方式
// *****通用方式: 借助于BeanuTils框架,编写代码时,保持表单输入与与javaBean的属性一致即可
public void test4(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
System.out.println("封装前:" + user);
try {
// 该方法实现原理就是 test3的封装
BeanUtils.populate(user, request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("封装后:" + user);
}