文档章节

JFina教程JfinalUIB 代码笔记 (3)--- jfinal Controller参数封装

littleant
 littleant
发布于 2014/06/12 14:08
字数 463
阅读 2752
收藏 1

通常我们使用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();
  }
 }

© 著作权归作者所有

共有 人打赏支持
littleant

littleant

粉丝 275
博文 13
码字总数 10514
作品 1
武汉
高级程序员
私信 提问
加载中

评论(5)

tonysb
tonysb

引用来自“_晨风”的评论

不用这个了。getModel好像很好使 @Jfinal
这个封装的意义,应该就是如果一个controller中,如果有10个不同的字段需要通过request.getParameter(name)的方式去获取之后,然后做对应的业务,这个时候,如果有了这个拦截器之后,我在这个controller类开始的时候,就把这10个字段变量先定义好,然后在下面具体请求的时候,我没必须每个请求去controller.getPara(name),而是直接去用controller中实现定义好的那个属性就可以了
littleant
littleant

引用来自“_晨风”的评论

不用这个了。getModel好像很好使 @Jfinal
不是所有的参数都和model对应的,所以需要封装
_晨风
_晨风
不用这个了。getModel好像很好使 @Jfinal
littleant
littleant

引用来自“weosang”的评论

这里参数封装的意义是什么呢?最近在学习博主的JfinalUIB ,一切运转的很好,本人能力有限没搞明白。谢谢
jfinal的Controller不是多线程的,每次请求都是new,这和struts2一样,Controller可以适当写一些全局变量用来接收表单的数据,但是jfinal自身没这个功能,struts2自带,jfinal要自己实现,所以...
weosang
weosang
这里参数封装的意义是什么呢?最近在学习博主的JfinalUIB ,一切运转的很好,本人能力有限没搞明白。谢谢
基于JFinal实现的权限管理系统 JFinalUIB

项目用到了众多的开源组件,还有一些是网络分享的学习示例代码片段,感谢他们!!! JFinal高级学习交流QQ群:309647612 代码库地址:http://git.oschina.net/dongcb678/JfinalUIB.git 项目背景...

littleant
2014/06/03
0
35
最近在做的一件事件编写JFinal教程《Jfinal极速开发实战》

从8月1号开始,整整一个月,初稿完成,朋友帮我第一次文字校对完成,现在正在根据波总的意见修改一些jfinal的设计原则说明 Jfinal、JfinalUIB学习交流QQ群:309647612 已经完成,前四章免费阅...

littleant
2015/08/20
0
12
jweb——修改自jfinaluib的java管理系统开发基础框架

项目地址: https://git.oschina.net/xjtweb/jweb.git 几点说明: 一、本工程修改自jfinaluib项目。 二、运行 a、设置jvm参数jweb.home指向工程的工作目录(目录内容参照本文件的同级目录的hom...

xiejuntao
2015/05/22
0
0
jfinalUIB ie8报错

@littleant 你好,想跟你请教个问题: 请教个问题,项目在IE8打开报错,IE9正常,日志如下 JFinal action report -------- 2015-01-27 21:35:57 ------------------------------ Controller ...

-eaststar-
2015/01/28
430
1
JFinal2.1中全局拦截器中配置多个事务规则时报错

@JFinal 你好,想跟你请教个问题: JFinal2.1中在Config中加入事务拦截时,从第三个事务规则开始报错,不能定义多个规则吗? 2.0好像没有报错。@JFinalUIB中就是这样配置的。 /** * 配置全局...

hypocrite11
2016/01/06
855
5

没有更多内容

加载失败,请刷新页面

加载更多

spring学习笔记(二)spring 事件的使用

spring 中的事件 spring事件通过订阅发布 可以解耦操作 可以同步 可以异步 步骤 编写事件 通过继承org.springframework.context.ApplicationEvent 来编写事件 public ApplicationEvent(Obj...

NotFound403
18分钟前
1
0
特斯拉车主成功破解了自己Model 3汽车

据汽车博客Electrek消息,一位特斯拉车主成功破解了自己Model 3汽车,还在此基础上运行了Ubuntu。 这位叫trsohmers的网友表示,“功劳大多要归到Ingineerix的头上,他花了数月才找到初始的那...

linuxCool
32分钟前
1
0
Gitbook : random errors when using gitbook plugin on running "gitbook serve"

在执行gitbook serve时,会有不定的失败错误 参考问题 :#1309 解决方案: 更新gitbook版本,这个问题似乎是3版本的问题 , 官方也不打算在这个版本解决了。 更新 到最新版本后, 不再出现问...

ol_O_O_lo
46分钟前
1
0
提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字

提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字: 作者:王健茜;断断续续一个多月才读完了《中国文化的深层结构》,这并不是一本难懂的书,之所以读得慢,源于对书中观点的思...

原创小博客
49分钟前
1
0
高德地图-行政区域接口

1、获取全国各省信息 https://restapi.amap.com/v3/config/district?extensions=all&key=应用Key&s=rsv3&output=json 2、获取下级行政区域信息 https://restapi.amap.com/v3/config/distric......

voole
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部