您的位置:首页 > 编程语言 > Java开发

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

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

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

[java] view
plaincopy

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实现这个静态方法:

[java] view
plaincopy

@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中,具体实现如下:

[java] view
plaincopy

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;

}

上面看起来有点复杂,但实际项目中个人认为较为实用,但可能还有其它个好的解决方案,这里只将个人学习所得记录,自我学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: