自主项目学习中,从后台往数据库中添加数据,总是重复着获取界面的值,然后在利用实现层来完成对数据库的操作。这样稍觉得有点麻烦,于是做了个小小的笔记,加点印象 , 如下:
//考虑到jsp页面的部分参数列表是: columns:[[ {field:'fid',title:'菜品编号',width:60,align:'center'}, {field:'fname',title:'菜品名',width:120,align:'center',editor:"text"}, {field:'normprice',title:'原价',width:70,align:'center',editor:"text"}, {field:'nowprice',title:'折扣价',width:70,align:'center',editor:"text"}, {field:'fphoto',title:'图片名',width:140,align:'center'}, {field:'description',title:'描述',width:180,align:'center',editor:"text"}, {field:'status',title:'上/下架',width:70,align:'center', formatter:function(value,rec){ var a = '<input type="checkbox" class="ck" value="1" >'; return a; } }, {field:'opt',title:'操作',width:200,align:'center', formatter:function(value,rec){ var a = '<a class="editcls1" onclick="editFphoto(\''+rec.fid+'\', \''+rec.fphoto+'\')" href="javascript:void(0)" >商品图片</a>'; var b = '<a class="editcls2" onclick="editDetail(\''+rec.fid+'\')" href="javascript:void(0)" >商品详情</a>'; return a+b; } } ]], .......
private void addFoodOp(HttpServletRequest request,HttpServletResponse response) { /* //注释部分 // 这是惯常喜欢的写法 String fname = request.getParameter("fname"); double normprice = Double.parseDouble(request.getParameter("normprice")); double nowprice = Double.parseDouble(request.getParameter("nowprice")); String description = request.getParameter("description"); FoodBiz fb = new FoodBizImpl(); try { Food food = fb.addFood(fname, normprice,nowprice,description); super.outData(response, food); } catch (Exception e) { e.printStackTrace(); } */ // 简单利用反射: Food f = RequestUtil.parseRequest(request, Food.class ); FoodBiz fb = new FoodBizImpl(); try { f = fb.addFood(f); List<Food> list = (List<Food>) request.getSession().getServletContext().getAttribute( CommonData.APPLICATIONFOODKEY ); list.add(f); request.getSession().getServletContext().setAttribute(CommonData.APPLICATIONFOODKEY, list ); super.outData(response, f); } catch (Exception e) { e.printStackTrace(); } }
package com.yc.utils; import java.lang.reflect.Method; import java.util.Map; import javax.servlet.http.HttpServletRequest; public class RequestUtil { /** * @author 牧羊的伯格女皇 * @date: 2015-10-15 * */ public static <T> T parseRequest(HttpServletRequest request, Class<T> c){ T t; try { t = c.newInstance(); // 根据反射实例生成对象 Method [] ms = c.getMethods(); //1.取出request中所有键值对 注意 Map<String,String[]> 键值对 当成数组看待 Map<String,String[]> map = request.getParameterMap(); //2.循环所有的键 在前面加一个 set 形成 setXXXX for(Map.Entry<String, String[] > entry: map.entrySet() ){ String key = entry.getKey(); // 得到这个键 String [] values = entry.getValue(); if( values != null && values.length > 1 ){ continue; } String v = values[0]; key="set"+key; //3.循环 反射实例c中所有的方法 查找页面的 setXXXX的方法 for(Method m : ms ){ if( key.equalsIgnoreCase( m.getName() )){ //4. 激活这个方法 将这个键所对应的值存进去即可 相当于你调用了 obj.setXXXXX(值) //但是 可能面对参数的类型 太多 //判断m 的采纳数类型 String parameteTypeName = m.getParameterTypes()[0].getName(); //取出参数的类型名 if( "int".equals(parameteTypeName ) || "java.lang.Integer".equals(parameteTypeName ) ){ m.invoke(t, Integer.parseInt(v) ); }else if( "float".equals(parameteTypeName ) || "java.lang.Float".equals(parameteTypeName ) ){ m.invoke(t, Integer.parseInt(v) ); }else if( "double".equals(parameteTypeName ) || "java.lang.Double".equals(parameteTypeName ) ){ m.invoke(t, Integer.parseInt(v) ); }else if( "long".equals(parameteTypeName ) || "java.lang.Long".equals(parameteTypeName ) ){ m.invoke(t, Integer.parseInt(v) ); }else if( "short".equals(parameteTypeName ) || "java.lang.Short".equals(parameteTypeName ) ){ m.invoke(t, Integer.parseInt(v) ); }else if( "java.lang.String".equals(parameteTypeName ) ){ //这里需要注意String类型并非java中的基本数据类型 m.invoke(t, v); } break; } } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } return t; } }