jfinal的Enjoy 模板引擎如何获取url参数

像jsp的话是param.attrName来获取url表单参数,Enjoy引擎有没有类似的便捷获取方式,还是说只能通过request.getParameter()来获取?

评论区

JFinal

2019-03-12 17:56

enjoy 被设计为用于任何 java 开发环境,所以是不会与 requset 产生耦合的

想要获取参数,可以在 controller 中通过 keepPara() 以及 keepModel 来实现

如果希望全局都可以获取 request 对象,做一个全局拦截器,里头的代码大致如下:
public void intercept(Invocation inv) {
try {
inv.invoke();
finally {
inv.getController().setAttr("request"), inv.getController().getRequest());
}
}


然后就可以在模板中任意使用 request 对象了,例如:
#(request.getAttribute(...))

zeroabc

2019-03-13 16:18

@JFinal 好的,谢谢波总

JFinal

2019-03-19 20:20

如果用得不多,另一个简单的办法是使用 controller 中的 keepPara() 方法

zeroabc

2019-03-20 15:49

@JFinal 我现在的做法是在拦截器或者是全局handle里写一行request.setAttribute("param", request.getParameterMap());然后前端页面就依然可以像jsp一样通过#(param.attrName)来获取表单参数

JFinal

2019-03-20 22:12

request.getParameterMap()); 获取到的 Map 值是 String[] ,在读取值的时候会不会有问题?

建议你这么来用:
request.setAttribute("param", getKv());

因为 getKv() 内部已经将 String[] 处理成了 String ,记得回来再反馈

zeroabc

2019-03-21 14:12

噢,我的那个处理确实会出问题,有值的时候前端会显示成内存地址[Ljava.lang.String;@6ead6c87。用getKv()里面的方法处理过之后就没问题了,谢谢波总!

JFinal

2019-03-21 16:45

zeroabc

2019-03-21 18:02

@JFinal Enjoy引擎还是有点不足的地方,不能像jsp一样直接用变量名拿session的attr

zeroabc

2019-03-21 18:12

噢,还是得认真研究一下用法,me.add(new SessionInViewInterceptor());然后session.attr;看到有个朋友分享的帖子提到这个方法,http://www.jfinal.com/share/390

zeroabc

2019-04-19 17:36

@JFinal 又遇到个问题,如何获取对象的静态变量呢,用public static final修饰的。jfinal文档虽然提到可以用com.demo.common.model.Account::STATUS_LOCK_ID这种方式获取,但是很长,太不优雅了。能否从对象就能直接获取静态变量?

JFinal

2019-04-20 00:16

@zeroabc 使用下面的用法:
engine.addSharedObject("Account", new Account());

用的时候这样:
#(Account.STATUS_LOCK_ID)

一行代码,全局通用,简洁方便

zeroabc

2019-04-25 18:10

@JFinal 詹总你好,试了不行。首先是me.addSharedObject("Role", new Role());然后前端是
#if(AuthorityHelper.hasRole(request, Role.ID_ADMIN))
div class="am-g am-margin-top">xxx
#end

但是没有效果,AuthorityHelper.hasRole获取的是null而不是 Role.ID_ADMIN的值,很奇怪

JFinal

2019-04-25 18:58

@zeroabc ID_ADMIN 要是 public 修饰

zeroabc

2019-04-26 16:46

@JFinal 用的是public static final修饰

JFinal

2019-04-26 19:46

@zeroabc 一定可以,肯定是别的原因引起的,我自己天天在用的功能

zeroabc

2019-04-29 16:26

@JFinal 詹总打扰了,经过反复测试,只要addSharedObject的object是extends Model的,class里面public static final修饰的属性拿到的都是null。

JFinal

2019-04-29 17:20

@zeroabc 确实有这个问题,原因是 Model 的 ModelFieldGetter 比 RealFieldGetter 的优先级要高,也就是说 field 表达式在知道是 model 类型时会默认给定 ModelFieldGetter 来获取数据,解决起来也很容易:

Engine.removeFieldGetter(com.jfinal.template.expr.ast.FieldGetters.RealFieldGetter.class);
Engine.addFieldGetter(1, new com.jfinal.template.expr.ast.FieldGetters.RealFieldGetter(null));

记得搞定后,再来回复一次

这个反馈十分有用,谢谢你

JFinal

2019-04-29 17:21

注意,上面两行代码,在 configEngine 中添加即可

JFinal

2019-04-29 17:41

jfinal 4.0 版本已对此处做了改进:
https://gitee.com/jfinal/jfinal/commit/c2e56a5d4506bc28ad9a15399777d51d56808647

zeroabc

2019-04-29 17:43

@JFinal 感谢詹总,这样处理之后模板页里面能正常获取public static属性了,请问这样处理会有别的副作用吗?

zeroabc

2019-04-29 17:47

@JFinal 好的,4.0版本发布马上更新!!

JFinal

2019-04-29 17:48

@zeroabc 副作用的概率极低,这个仅仅只是改变了 “取值方式” 的优先级,下面给出一种可能的影响:
1:假定你的 MyModel 中定义了一个 public 属性 public static final String test = 123
2:假定你的 MyModel 所对应的数据库表叫 my_table,里头也有一个字段叫 test
那么取值的时候是取 public 属性的值,而取不到数据库字段的值

这个可想而知,不会有谁会在 model 中定义的与字段名同名的东东,并且一定要是 public 的才会有冲突

题外话,obj.field 取字段值的时候,并不要求是 static,只要是 public 即可,例如:
public String test = 123;

JFinal

2019-04-29 17:51

@zeroabc 4.0 版本上了以后,即便不改代码也可以的, remove 再 add 这个不影响 jfinal 4.0 中配置的优先级,有兴趣可以看一下 FieldKit.java 源码

zeroabc

2019-04-29 17:59

@JFinal 好的,抱拳