文档章节

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

littleant
 littleant
发布于 2014/06/12 14:08
字数 463
阅读 2685
收藏 1
点赞 1
评论 5

通常我们使用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

粉丝 272
博文 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 3.4 发布,将极速贯彻到 UI 层

jfinal 的终极目标是全面实现软件开发整个过程的极速开发,极大提升开发效率,极大降低学习成本,极大提升开发体验 jfinal 诞生头五年,已实现 WEB + ORM + AOP 层面的极速开发,赢得了大量开...

JFinal ⋅ 04/28 ⋅ 129

JFinal(1.6)在Validator里执行过getFile,在Controller里取不到文件

JFinal在Validator里执行过getFile之后Validator中是可以取到文件及有关信息,但是在Controller里取不到文件,是不是我的姿势不正确?@JFinal

车开源 ⋅ 05/15 ⋅ 0

JAVA 极速WEB+ORM框架 - JFinal

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、p...

JFinal ⋅ 2012/03/18 ⋅ 496

找不到或无法加载主类 IndexController

我完全是按照教程练习的代码,结果写出来报错 错误: 找不到或无法加载主类 IndexController 原因: java.lang.NoClassDefFoundError: com/jfinal/core/Controller 网上找了半天也没有类似的资...

葛勇立 ⋅ 05/19 ⋅ 0

Jboot v1.4.9 发布,核心 JFinal 升级到 3.4 最新版本

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/03 ⋅ 0

jfinal兼容oracle integer字段

为什么oracle integer字段用了number(3,0),jfinal生成的字段还是BigDecimal @jfinal

tianxia007 ⋅ 05/02 ⋅ 0

JFinal 1.6可以无缝升级到最高哪个版本?

大约在JFinal 1.6的时候做了一个项目,一直运行至今。中途没升级也没做功能扩展,时至今日,需要做功能升级了,但是时隔太久远,基本不记得JFinal这个框架一路过来的升级过程了。所以想请求帮...

车开源 ⋅ 05/11 ⋅ 0

基于注释自动生成 API 文档 - Regan API

Regan API 前言 Regan API 项目是基于注释自动生成api文档,很大缩短了开始与后期维护API接口文档的时间。 Regan API 利用jdk提供的Doclet 类读取文档注释,可手动配置需要读取的文件,同时增...

Jeff_Regan ⋅ 06/15 ⋅ 0

JFinal如何使用JNDI连接数据库

想用JNDI的方式连接数据库,但是JFinal中用的是DruidPlugin和ActiveRecordPlugin,没有看到用DataSource的地方?请问JFinal支持JNDI连接方式吗?怎么具体实现?...

zqq3436 ⋅ 06/11 ⋅ 0

jfinal-admin 3.2 发布,beetl 模板升级到 2.7.14

jfinal-admin 3.2 版本正式发布啦。 基于JFinal的后台管理系统,采用了简洁强大的JFinal作为web框架,模板引擎用的是beetl,数据库用mysql,前端bootstrap框架。 演示地址 http://jad.yxyun...

IT小香猪 ⋅ 04/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

IDEA创建SpringMVC+Mybatis+Maven项目

视频如下(加载有点慢请见谅,服务器不太好): 视频

影狼 ⋅ 24分钟前 ⋅ 0

前阿里P8架构师:精准定制Java架构师学习计划!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,除了掌握J...

java高级架构牛人 ⋅ 27分钟前 ⋅ 0

zookeper学习

https://blog.csdn.net/u012152619/article/category/6470028

~少司命~ ⋅ 28分钟前 ⋅ 0

Spring MVC ,JSON,JQuery,不懂JQuery,跳过了

/spring-mvc-study/src/main/webapp/course_json.jsp <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD ......

颖伙虫 ⋅ 28分钟前 ⋅ 0

2018上海云栖大会workshop-日志数据采集与分析对接

摘要: 日志数据采集与分析对接 课程描述 通过日志服务采集用户、数据库、业务等访问数据。演示对于业务日志分析与处理,程序日志查询与监控,打通日志与数据仓库对接案例。 日志种类 网站访...

阿里云云栖社区 ⋅ 29分钟前 ⋅ 0

mahout demo

package com.datamine.CollaborativeFiltering.mysql; import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; import org.apache.mahout.cf.taste.impl.recommend......

xiaomin0322 ⋅ 31分钟前 ⋅ 0

red hat openstack 12配置要求

安装 openstack 之前,一般要规划整个系统中,到底要多少台机器来参与openstack, 根据rhosp12的官方文档: 最低要求是3台物理机,1台作为director,一台作为 controller ,一台作为computer....

tututu_jiang ⋅ 32分钟前 ⋅ 0

Rocket-Chip在GitHub上的各个源码

在github上通过搜索Rocket-chip可以得到36个结果:其中 https://github.com/freechipsproject/rocket-chip https://github.com/ucb-bar/riscv-boom https://github.com/ucb-bar/fpga-zynq (......

whoisliang ⋅ 37分钟前 ⋅ 0

【HAVENT原创】CentOS 6.5 下 Nginx 的安装与配置

nginx是轻量级的Web服务器、反向代理服务器及邮件服务器,具有占用内存少,并发能力强的优点,已被广泛应用。本文介绍目前最新版本 1.12.2 的安装。 各版本nginx下载地址:http://nginx.org/...

HAVENT ⋅ 43分钟前 ⋅ 0

查看linux系统重启之前的log -- last_kmsg

当 Linux Kernel 出现 BUG 的时候,后走入 panic flow,这个时候由于 Kernel 出现了严重的问题,adbd 也无法响应 adb 连接请求,这个时候想透过读取 Kernel Log Buffer 来看 Kernel Log 是不...

zyzzu ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部