在一些应用中使用较为方便,比如你插入一行数据,通过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;
}
上面看起来有点复杂,但实际项目中个人认为较为实用,但可能还有其它个好的解决方案,这里只将个人学习所得记录,自我学习。