package com.heima.request;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import com.heima.bean.User;
//演示获取客户端的请求参数
public class ServletReqeust3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// tes1(request) ;
// tes2(request) ;
// tes3(request) ;
// tes4(request) ;
// tes5(request) ;
tes6(request) ;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
//1.拿到单个表单控件的的值:拿取姓名的值
public void tes1(HttpServletRequest request){
String name = request.getParameter("username") ;
System.out.println(name);
}
//2.拿到表单控件的的值(同名控件的多个值):拿取密码的值
public void tes2(HttpServletRequest request){
String[] password = request.getParameterValues("password") ;
for (String string : password) {
System.out.println(string);
}
}
//3.拿到所有控件的名字和值
public void tes3(HttpServletRequest request){
Enumeration<String> names = request.getParameterNames() ;
while(names.hasMoreElements()){
String name = names.nextElement() ;
String[] values = request.getParameterValues(name) ;
System.out.println(name + ":" + Arrays.asList(values));
}
}
//4.将获取的参数应当封装到javabean中: 采用PropertyDesciptor
public void tes4(HttpServletRequest request){
User user = new User() ;
System.out.println("封装前: " + user);
//获取所有的表单控件的名字
Enumeration<String> names = request.getParameterNames() ;
//循环封装
while(names.hasMoreElements()){
//拿取控件的名字
String name = names.nextElement() ;
//控件的值
String[] values = request.getParameterValues(name) ;
try {
PropertyDescriptor pd = new PropertyDescriptor(name, User.class) ; //拿到User对象的属性name的属性描述器
Method m = pd.getWriteMethod() ; //拿到属性的set方法
//为了兼容jdk1.4的版本,虚拟机会将values拆分成一个一个值进行传递
if(values !=null && values.length == 1)
m.invoke(user, values) ;
else{
//方法一:强转成一个object
//m.invoke(user, (Object)values) ;
//方法二:创建一个数组
m.invoke(user, new Object[]{values}) ;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("封装后: " + user);
}
//5.将获取的参数应当封装到javabean中: 采用BeanUtils
public void tes5(HttpServletRequest request){
User user = new User() ;
System.out.println("封装前: " + user);
//获取所有的表单控件的名字
Enumeration<String> names = request.getParameterNames() ;
//循环封装
while(names.hasMoreElements()){
//拿取控件的名字
String name = names.nextElement() ;
//控件的值
String[] values = request.getParameterValues(name) ;
try {
BeanUtils.setProperty(user, name, values) ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("封装后: " + user);
}
//6.将获取的参数应当封装到javabean中: 采用BeanUtils的另一种方式
public void tes6(HttpServletRequest request){
User user = new User() ;
System.out.println("封装前: " + user);
//拿到键值对的映射
Map<String,String[]> map = request.getParameterMap() ;
for (Map.Entry<String, String[]> entry : map.entrySet()) { //entry就是键值对
String name = entry.getKey() ; //拿到键
String[] values = entry.getValue() ; //拿到值
try {
BeanUtils.setProperty(user, name, values) ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("封装后: " + user);
}
//7.终极必杀技 (采用beanUtils类)(推荐)
public void tes7(HttpServletRequest request){
User user = new User() ;
System.out.println("封装前: " + user);
try {
BeanUtils.populate(user, request.getParameterMap()) ;
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("封装后: " + user);
}
}