利用反射来或者jsp页面表单中的值

在新公司工作的时候,遇到一个模块没有用框架,而且一个对象二十几个属性值,要做增删改查,如果是手写的话,在每次请求request的时候都要手动的去request.getParameter("xxx");这样一来就显得很麻烦了,因此在这里介绍一种利用反射来获取jsp页面form表单属性值

 1 /**
 2      * 将request请求转换为JavaBean
 3      * @param <T>
 4      * @param request
 5      * @param clazz JavaBean对象.class
 6      * @return T
 7      * @throws IllegalAccessException 
 8      * @throws InstantiationException 
 9      * @throws SecurityException 
10      */
11     public<T> T ParseRequestToJavaBean(HttpServletRequest request,Class<T> clazz) 
12         throws SecurityException, InstantiationException, IllegalAccessException{
13         Map<String, Object> pageInfo = null;
14         try {
15             pageInfo = getPageInfo(request,clazz);
16         } catch (UnsupportedEncodingException e1) {
17             e1.printStackTrace();
18         }
19         T t = null;
20         Method[] methods = clazz.getMethods();
21         try {
22             t = clazz.newInstance();
23             for (String paramName : pageInfo.keySet()) {
24                 //把key变成set方法名
25                 String setMethodName = "set" + paramName;
26                 for (Method setMethod : methods) {
27                     //方法名相同
28                     if(setMethodName.equalsIgnoreCase(setMethod.getName())){
29                         //标准的JavaBean只有一个参数
30                         String fieldTypeName = setMethod.getParameterTypes()[0].getName();
31                         //获得Map中参数参数类型
32                         String typeName = pageInfo.get(paramName).getClass().getName();
33                         //比较参数类型是否相同
34                         if(typeName.equalsIgnoreCase(fieldTypeName)){
35                             setMethod.invoke(t, new Object[]{pageInfo.get(paramName)});
36                         }else
37                             continue;
38                         break;
39                     }
40                 }
41             }
42         } catch (Exception e) {
43             throw new JdbcCloseException("请求转换为javabean异常");
44         }
45         return t;
46     }
47     
48     /**
49      * 将request请求转换为Map
50      * @param request
51      * @return Map<String,Object>
52      * @throws IllegalAccessException 
53      * @throws InstantiationException 
54      * @throws SecurityException 
55      * @throws UnsupportedEncodingException 
56      */
57      public<T> Map<String,Object> getPageInfo(HttpServletRequest request,Class<T> clazz)
58          throws SecurityException, InstantiationException, IllegalAccessException,
59                                          UnsupportedEncodingException{
60         Map<String,Object> pageInfo = new HashMap<String,Object>();
61         //获得参数枚举
62         Enumeration<?> enumeration = request.getParameterNames();
63         //获得对象的字段名
64         while(enumeration.hasMoreElements()){
65             //获取参数名称
66             String paramName = (String) enumeration.nextElement();
67             //字段名和参数名相同,赋值
68             //获得参数值数组
69             String[] values = request.getParameterValues(paramName);
70             if(values == null)
71                 pageInfo.put(paramName, "");
72             else if(values.length == 1){    //转码URLDecoder
73                 pageInfo.put(paramName, URLDecoder.decode(values[0],"utf-8"));
74             }
75             else{
76                 String v = URLDecoder.decode(values[0],"UTF-8");
77                 for (int i = 1; i < values.length; i++) {
78                     v += "," + URLDecoder.decode(values[i],"UTF-8");
79                 }
80                 pageInfo.put(paramName, v);
81             }
82         }
83         return pageInfo;
84     }

不过该方法有个缺陷,就是我在取值的时候,面对select元素,无法取的被选择的option选项的值,有知道的大大还请留下一些解决方法,感激不敬

 

posted @ 2013-07-21 09:41  离尘  阅读(356)  评论(0)    收藏  举报