java web开发将请求的参数转换为bean对象

本文介绍了如何在Java Web开发中将HTTP请求的参数高效地转换为Bean对象,避免了大量的手动赋值操作,提高了代码的扩展性和可维护性。通过一个工具类RequestUtils,实现了从Post和Get请求中获取参数并封装成Map,再利用反射机制将Map中的数据填充到指定的Bean中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一些应用中使用较为方便,比如你插入一行数据,通过Post或Get请求得到所有参数,而在一些时候我们是要直接操作对于数据行的一个bean对象,下面的是一个扩展性较好的方法。

注:常规编程时可以简单操作,如下一个bean

public class Student implements java.io.Serializable{
	private static final long serialVersionUID = 1L;
	
	private String studentid;
	private String studentname;
	private String studentbir;
	private String studentsex;
	
	public String getStudentid() {
		return studentid;
	}

	public void setStudentid(String studentid) {
		this.studentid = studentid;
	}

	public String getStudentname() {
		return studentname;
	}

	public void setStudentname(String studentname) {
		this.studentname = studentname;
	}

	public String getStudentbir() {
		return studentbir;
	}

	public void setStudentbir(String studentbir) {
		this.studentbir = studentbir;
	}

	public String getStudentsex() {
		return studentsex;
	}

	public void setStudentsex(String studentsex) {
		this.studentsex = studentsex;
	}
	
	
}

假设视图层将通过Post表单提交一个这样的参数集合:studentid=001,studentname='xiaoli',studentbir='1992-1-27',studentsex='男'

我们在控制层通过多个getParameter()得到对于数据,接下来new Student(),对象赋值得到一个Student的bean,后面再使用什么spring之类的Dao层就插入数据库中持久化了。

以上方法简单也比较好理解,但是扩展性不好,你要是有成百上千个bean,那代码量都是这样,可想而知,冗余,维修性差……

 

2、下面是在一个项目中借鉴的操作性较好的方法,将任何请求(Post/ Get),参数混乱中的情况下拿到bean:

面向对象好处在之一少不了封装:下面是将任何请求所有参数封装为一个Map<String ,Object>,直接在控制层执行Map<String, Object> m=RequestUtils.getQueryParams(request);就可以啦,下面就是在工具类RequestUtils实现这个静态方法:

 

@SuppressWarnings("unchecked")
	public static Map<String, Object> getQueryParams(HttpServletRequest request) {
		Map<String, String[]> map;
		if (request.getMethod().equalsIgnoreCase(POST)) {
			map = request.getParameterMap();
		} else {
			//为GET请求时就获取其请求参数的那段信息
			String s = request.getQueryString();
			if (StringUtils.isBlank(s)) {
				return new HashMap<String, Object>();
			}
			try {
				//将得到的HTML数据用UTF-8转码
				s = URLDecoder.decode(s, UTF8);
			} catch (UnsupportedEncodingException e) {
				log.error("encoding " + UTF8 + " not support?", e);
			}
			map = parseQueryString(s);
		}

		Map<String, Object> params = new HashMap<String, Object>(map.size());
		int len;
		for (Map.Entry<String, String[]> entry : map.entrySet()) {
			len = entry.getValue().length;
			if (len == 1) {
				params.put(entry.getKey(), entry.getValue()[0]);
			} else if (len > 1) {
				params.put(entry.getKey(), entry.getValue());
			}
		}
		return params;
	}

上面看出,两种请求下做了不同处理,最后将所有参数键值转化为一个Map,

这样之后就可以在控制层用String action=m.get("action").toString();的形式得到各种参数;

前面说了一个项目bean成百个,所有将参数集转化为bean也进行封装,如调用时:Student s=(OrgList) BeanConverter.toJavaBean(new Student(), m,true);m为上面得到的Map参数映射表,具体实现要使用到了Java的反射机制处理,也就是根据传入的bean对象,得到这个对象所在类,并获取到这个类的所有声明了的方法:Method[] methods = javabean.getClass().getDeclaredMethods();再循环得到打头为set的方法,拿到这个方法的名字如setStudentsex转换为一个参数studentsex,然后将这个参数与map中的key做识别,有相同的key便将其value插入该bean中,具体实现如下:

 public static Object toJavaBean(Object javabean, Map<String, Object> m,Boolean zhuanma) 
    { 
    	//System.out.println(m);
    	//所有声明了的方法
        Method[] methods = javabean.getClass().getDeclaredMethods(); 
        for (Method method : methods) 
        { 
                if (method.getName().startsWith("set")) 
                { 
                	//得到该方法的参数类型
                	Class<?>[] params = method.getParameterTypes();
                    String field = method.getName(); 
                    field = field.substring(field.indexOf("set") + 3); 
                    field = field.toLowerCase().charAt(0) + field.substring(1); 
                    //System.out.println(field+"----"+m.get(field.toString()));
                    Object value=m.get(field.toString());
                    try {
                        // convert types for some popular ones
                        if (value != null&&!"".equals(value)) {
                        	String pa=params[0].getName().toString();
                        	//if (value instanceof java.util.Date) {
                                if (pa.equals("java.util.Date")) {
                                    value = new java.util.Date(((java.util.Date) value).getTime());
                                }
 //                           }
                            else if(pa.equals("java.lang.String")){
                            	//value= new java.lang.String(Function.PageToDb(value.toString()));
                            	if(zhuanma)value= new java.lang.String(Function.PageToDb(value.toString()));
                            }
                            else if(pa.equals("java.lang.Integer")||pa.equals("int")){
                            	 value= new java.lang.Integer(value.toString());
                            }else if (pa.equals("java.lang.Long")) {
                                 value= new java.lang.Long(value.toString());
                            } else if (pa.equals("java.lang.Double")) {
                            	 value= new java.lang.Double(value.toString());

                            } else if (pa.equals("java.lang.Float")) {
                            	 value= new java.lang.Float(value.toString());

                            } else if (pa.equals("java.lang.Short")) {
                            	 value= new java.lang.Short(value.toString());

                            } else if (pa.equals("java.lang.Byte")) {
                            	 value= new java.lang.Byte(value.toString());

                            } else if (pa.equals("java.lang.Character")) {
                            	// value= new java.lang.Character(value);

                            } else if (pa.equals("java.lang.Boolean")) {
                            	 value= new java.lang.Boolean(value.toString());

                            } 
                                
                                // Don't call setter if the value object isn't the right type 
                                if (isCompatibleType(value, params[0])) {
                                    method.invoke(javabean, new Object[] { value });
                                } else {
                                  throw new Exception(
                                      "Cannot set " + field.toString() + ": incompatible types.");
                                }
                        }
                } catch(Exception e){
                	e.printStackTrace();
                }
        } 
                }

        return javabean; 
    } 


 

上面看起来有点复杂,但实际项目中个人认为较为实用,但可能还有其它个好的解决方案,这里只将个人学习所得记录,自我学习。


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值