JFina教程JfinalUIB 代码笔记 (3)

Stella981
• 阅读 619

通常我们使用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();
  }
 }
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
jabdp系统表单
系统表单一共分三种:流程表(ACT开头的)、系统表(sys开头的)和业务表(就是自己创建的)。接下来介绍一些在项目中会用到的流程表和系统表,没有介绍到的都是不常用的,可以不用管。一、公共字段在讲解流程表和系统之前,先讲解一下所有表中的公共字段。这些字段是比较重要的,所以放在前面进行讲解。表中的公共字段可以看如下表:字段说明ID
Easter79 Easter79
3年前
springboot项目解决跨域问题
在你的controller上面加上@CrossOrigin注解即可如果加在BaseController上,其他Controller继承BaseController即可/ClassName:BaseControllerFunction:TODODate:2018092
Easter79 Easter79
3年前
Swift专题讲解二十一——协议
Swift专题讲解二十一——协议一、引言      协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现一些方法和附加功能。
Stella981 Stella981
3年前
Commons CLI 入门及代码简单分析
前言    以前写过一些命令行程序,在需要带参数的时候都是自己来判断args,导致程序光解析args都占了好大一堆,而且解析代码也不美观。    偶然间发现了apache公共库中的cli库,在这里分享给大家。入门commonscli中把解释参数分为三种状态,分别是定义、解释和询问交互。接下来,我以一个例子做一
Wesley13 Wesley13
3年前
Java基础之内省
Java基础之内省什么是内省  首先,我们要知道什么是内省。按我自己的理解就是在反射的原理上进行封装,来更方便的操作JavaBeanJavaBean就是特殊格式的类,其规范为:1.JavaBean类必须是一个公共类,即使用关键字public声明类。2.JavaBean类中必须有
Stella981 Stella981
3年前
Post 方式进行文件下载
不啰嗦了,直接上代码,依赖jquery,下面代码可以直接复制到你的项目作为公共方法前端封装代码,作为公共方法://postDownload.js/下载文件,以POST的方式提交@paramoptions{url,data}使用方式postDownload({
Stella981 Stella981
3年前
JavaScript 声明全局变量的三种方式
JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍。声明方式一:使用var(关键字)变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量。声明方式二:没有使用var,直接给标识符e赋值,这样会隐式的声明了全局变量e。即使该语句是在一个function内,当该funct
桥蕤 桥蕤
7个月前
Python封装,继承与多态
封装、继承和多态是面向对象的三大特点;直接看Python中是怎么实现的封装首先定义一个Human类,初始化类的属性和方法:pythonclassHuman:definit(self):这是可以公共知道的属性self.ageNone年龄self.height
京东云开发者 京东云开发者
4个月前
微前端父子应用及兄弟应用间组件或方法共享方案
背景我们的很多web应用在持续迭代中功能越来越复杂,参与的人员、团队不断增多,导致项目出现难以维护的问题,这种情况PC端尤其常见,微前端为我们提供了一种高效管理复杂应用的方案。但是在使用微前端的过程中,通常会有一些公共方法或公共组件,本文将对如何实现父子应
京东云开发者 京东云开发者
4个月前
微前端父子应用及兄弟应用间组件或方法共享方案
背景我们的很多web应用在持续迭代中功能越来越复杂,参与的人员、团队不断增多,导致项目出现难以维护的问题,这种情况PC端尤其常见,微前端为我们提供了一种高效管理复杂应用的方案。但是在使用微前端的过程中,通常会有一些公共方法或公共组件,本文将对如何实现父子应