自主项目学习中,从后台往数据库中添加数据,总是重复着获取界面的值,然后在利用实现层来完成对数据库的操作。这样稍觉得有点麻烦,于是做了个小小的笔记,加点印象 , 如下:
//考虑到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;
}
}
原文:http://my.oschina.net/u/2405367/blog/517363