@JFinal 詹总你好,试了不行。首先是me.addSharedObject("Role", new Role());然后前端是 #if(AuthorityHelper.hasRole(request, Role.ID_ADMIN)) div class="am-g am-margin-top">xxx #end
@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));
@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;
想要获取参数,可以在 controller 中通过 keepPara() 以及 keepModel 来实现
如果希望全局都可以获取 request 对象,做一个全局拦截器,里头的代码大致如下:
public void intercept(Invocation inv) {
try {
inv.invoke();
finally {
inv.getController().setAttr("request"), inv.getController().getRequest());
}
}
然后就可以在模板中任意使用 request 对象了,例如:
#(request.getAttribute(...))