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