一般咱們使用jfinal開發都會寫本身的BaseController來作一些公共全局變量的聲明,或者用來實現一些公共方法,JfinalUIB也不例外。java
參數的封裝主要是在ParamPkgInterceptor類中實現,採用的是jfinal的攔截器。debug
首先獲得controller和BaseController聲明的一些全局變量字段code
BaseController controller = (BaseController) ai.getController(); Class<?> controllerClass = controller.getClass(); Class<?> superControllerClass = controllerClass.getSuperclass(); Field[] fields = controllerClass.getDeclaredFields(); Field[] parentFields = superControllerClass.getDeclaredFields();
在ai.invoke();以前實現請求參數數據到變量的封裝orm
log.debug("*********************** 封裝參數值到 controller 全局變量 start ***********************"); // 封裝controller變量值 for (Field field : fields) { setControllerFieldValue(controller, field); } // 封裝baseController變量值 for (Field field : parentFields) { setControllerFieldValue(controller, field); } log.debug("*********************** 封裝參數值到 controller 全局變量 end ***********************");
在ai.invoke();以後實現變量到request封裝ci
log.debug("*********************** 設置全局變量值到 request start ***********************"); // 封裝controller變量值 for (Field field : fields) { setRequestValue(controller, field); } // 封裝baseController變量值 for (Field field : parentFields) { setRequestValue(controller, field); } log.debug("*********************** 設置全局變量值到 request end ***********************");
下面是反射用到的公共方法開發
/** * 反射set值到全局變量 * @param controller * @param field */ public void setControllerFieldValue(BaseController controller, Field field){ try { field.setAccessible(true); String name = field.getName(); String value = controller.getPara(name); if(null == value || value.isEmpty()){// 參數值爲空直接結束 log.debug("參數值爲空"); return; } String fieldType = field.getType().getSimpleName(); if(fieldType.equals("String")){ field.set(controller, value); }else if(fieldType.equals("int")){ field.set(controller, Integer.parseInt(value)); }else if(fieldType.equals("Date")){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); field.set(controller, format.parse(value)); }else if(fieldType.equals("BigDecimal")){ BigDecimal bdValue = new BigDecimal(value); field.set(controller, bdValue); }else{ field.setAccessible(false); log.debug("沒有解析到有效字段類型"); } field.setAccessible(false); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } /** * 反射全局變量值到request * @param controller * @param field */ public void setRequestValue(BaseController controller, Field field){ try { field.setAccessible(true); Object value = field.get(controller); if(null == value){// 參數值爲空直接結束 field.setAccessible(false); log.debug("參數值爲空"); return; } String name = field.getName(); field.setAccessible(false); controller.setAttr(name, value); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } }