Java反射应用 1:前台到后台数据自动装入对象 2:poi中写个通用poi工具类,作用是自动将参数装入到到excel单元格中 在传统的写法就是需要将数据源每列数据都一个个装入到excel没每个单元格中。
注意:这里主要详细讲解第1个,因为poi通用工具类还需要优化,以后再开反射应用(2)详细讲解poi公共工具类。 一:前台到后台数据自动装入对象。 1:原始前台到后台参数如何接收? (1):一种就是根据前台name取值,一个个对应的取值。 例如:
if((request.getParameter("CarNo"))!=null&&!"".equals(request.getParameter("CarNo"))) { carNo=URLDecoder.decode((request.getParameter("CarNo")),"utf-8"); } 结论:这样的话代码会很多很多,在很多业务比较复杂的公司他们表单动不动就说2,3十个的节奏,我想你在后台会获取值会写的很悲伤的。 (2):另外种就是将前台参数先提前处理转成json字符串,传入到后台在直接转成对象 eg:后台Bean b= (Bean)JSONObject.fromObject(前台json串); 结论:第二种是我没试验过,不过流程很简单,前台对参数进行处理,后台强转成对象,这中写法需要对前台数据进行处理,大大加强了复杂度。 (3):通过反射将前台参数装入到后台bean中。 这里要详细介绍的就是这种方法,技术点是拦截器,反射,枚举。下面奉上controller中:Bean modelRequest=(Bean)request.getAttribute(“baseRequest”);//枚举方法/** * 技术点:枚举类 Java基础 * 功能:全局变量 * @author Administrator * */ public interface CommonConstant { public enum CheckModels{ //登录 login(“/logIn”,”com.rokin.pojo.UsersPojo”), //车源方管理(trucker) 管理我的司机 分页查询 getDrivers(“/getDrivers”,”com.rokin.pojo.trucker.DriversPojo”), //车源方管理(trucker) 管理我的司机 添加 saveDrivers(“/saveDrivers”,”com.rokin.pojo.trucker.DriversPojo”), //车源方管理(trucker) 管理我的司机 导出(先查询出数据在导出) OutDriverExcelAction(“/OutDriverExcelAction”,”com.rokin.pojo.trucker.DriversPojo”),
//车源方管理(trucker) 管理我的车辆 分页查询 getMyVehicles(“/getMyVehicles”,”com.rokin.pojo.trucker.BasePagePojo”), ; private String servlet; private String object;
private CheckModels(String servlet,String object) { this.servlet = servlet; this.object = object; }
public String getServlet(){ return this.servlet; }
public String getObject(){ return object; }
public static String getObject(String servlet){ if(servlet==null||”“.equals(servlet)){ return null; } for(CheckModels model:CheckModels.values()){ if(model.getServlet().equals(servlet)){ return model.getObject(); } } return null; } } //这里是拦截器
public class RequestInterceptor implements HandlerInterceptor {
@Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub
}
@Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { // TODO Auto-generated method stub
}
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { // TODO Auto-generated method stub System.out.println(“进入拦截器”); String servletPath = request.getServletPath(); LogUtils.logger().info(“servletPath:”+servletPath); String modelName = CommonConstant.CheckModels.getObject(servletPath); LogUtils.logger().info(“modelName:”+modelName); if(!StringUtils.isEmpty(modelName)){ Object baseRequest = ReflectPojo.reflectModel(modelName, request); request.setAttribute(“baseRequest”, baseRequest); } return true; } 这个是反射类
public class ReflectPojo { public static Object reflectModel(String className,HttpServletRequest request){ try { Class<?> model = Class.forName(className); Object object = model.newInstance(); Field[] fields = model.getDeclaredFields(); /*Class<?> Superclass=model.getSuperclass(); Object object2 = Superclass.newInstance(); Field[] fields2=Superclass.getDeclaredFields();*/ LogUtils.logger().info("model:"+model); LogUtils.logger().info("object:"+object); LogUtils.logger().info("fields:"+fields); for(Field field:fields){ String key = field.getName(); String type = field.getType().getSimpleName(); String value = request.getParameter(key); PropertyDescriptor pd = new PropertyDescriptor(key, model); Method method = pd.getWriteMethod(); LogUtils.logger().info("key:"+key); LogUtils.logger().info("type:"+type); LogUtils.logger().info("value:"+value); LogUtils.logger().info("pd:"+pd); LogUtils.logger().info("method:"+method); /*if("Integer".equals(type)){ //int method.invoke(object, CustomStringUtils.safeInteger(value)); }else if("Double".equals(type)){ method.invoke(object, CustomStringUtils.safeDouble(value)); }else { method.invoke(object, value); }*/ invokeObject(object, value, method, type); System.out.println(key+"----->"+value); //System.out.println(field.getType().getSimpleName()); } return object; } catch (Exception e) { e.printStackTrace(); } return null; } public static void invokeObject(Object object,String value,Method method,String type){ try { if("Integer".equals(type)){ //int method.invoke(object, CustomStringUtils.safeInteger(value)); }else if("Double".equals(type)){ method.invoke(object, CustomStringUtils.safeDouble(value)); }else { method.invoke(object, value); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { reflectModel(null,null); } }件主要是这3个,复制过去后需要自己在配置文件中配置拦截器哟 这里就不贴代码了,自行解决吧。 使用这种方法在面对前台参数很多的情况下很好用,只需要我们编写对应bean和在枚举接口中编写对应bean与路径关系,然后我们就可以在controller中获取baseRequest 就可以愉快的进行业务逻辑处理不用关系前台参数有没有呀,一个个set的,一个个获取的烦心事了。
