通常我们使用jfinal开发都会写自己的BaseController来做一些公共全局变量的声明,或者用来实现一些公共方法,JfinalUIB也不例外。
参数的封装主要是在ParamPkgInterceptor类中实现,采用的是jfinal的拦截器。
首先得到controller和BaseController声明的一些全局变量字段
BaseController controller = (BaseController) ai.getController();
Class<?> controllerClass = controller.getClass();
Class<?> superControllerClass = controllerClass.getSuperclass();
Field[] fields = controllerClass.getDeclaredFields();
Field[] parentFields = superControllerClass.getDeclaredFields();
在ai.invoke();之前实现请求参数数据到变量的封装
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封装
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();
}
}