在JSF页面上定义变量

时间:2017-02-07 11:24:50

标签: jsf el jsf-2.2 java-ee-7

假设我有一个使用< ui:repeat>迭代的对象列表标签和用户有一个每个对象的操作列表,但是 - 根据他的权限 - 其中一些操作被禁用,因为用户缺少权限。

<ui:repeat var="item" value="#{myBean.selectedItems}">

     <h1>#{item.name}</h1>        

     <h:commandButton value="Edit" disabled="#{myBean.getPermissions(item, user).has('EDIT') .../>
     <h:commandButton value="Move" disabled="#{myBean.getPermissions(item, user).has('MOVE') .../>
     <h:commandButton value="Copy" disabled="#{myBean.getPermissions(item, user).has('COPY') .../>
     <h:commandButton value="Delete" disabled="#{myBean.getPermissions(item, user).has('DELETE') .../>
     <h:commandButton value="Rotate" disabled="#{myBean.getPermissions(item, user).has('ROTATE') .../>


</ui:repeat>

让我们说,检索权限[myBean.getPermissions()]的操作非常昂贵,而且我不希望它为一个项目执行多次。

那么我可以在JSF / EL中做些什么来实现这个目标呢?

假设我使用&lt; ui:param&gt;像这样:

<ui:repeat var="item" value="#{myBean.selectedItems}">

     <h1>#{item.name}</h1>        

     <ui:param name="itemPermissions" value="#{myBean.getPermissions(item, user)"/>

     <h:commandButton value="Edit" disabled="#{itemPermissions.has('EDIT') .../>
     <h:commandButton value="Move" disabled="#{itemPermissions.has('MOVE') .../>
     <h:commandButton value="Copy" disabled="#{itemPermissions.has('COPY') .../>
     <h:commandButton value="Delete" disabled="#{itemPermissions.has('DELETE') .../>
     <h:commandButton value="Rotate" disabled="#{itemPermissions.has('ROTATE') .../>


</ui:repeat>

但据我所知,&lt; ui-param&gt;只是一个快捷方式,它不会缓存与之关联的实际值,但每次使用时都会重新评估value-expression?这是对的吗?

那我该怎么办? c为C:集&gt;不是一个选项,因为它只在view-build-time afaik期间设置。

唯一的选择是,在bean变量中手动缓存权限,然后再使用bean来访问它们吗?在JSF / EL中是否没有允许定义变量的机制(比如在普通的Java方法中),我可以设置一个值并在以后读取该值?

我注意到,渲染=&#34; ..&#34;或者禁用=&#34; ..&#34;有时甚至多次调用,因此表达式不仅每个标记评估一次,但在某些情况下评估2-3次。这是正确的观察结果吗?原因是什么?

提前感谢您的回答。

编辑: BalusC将其标记为问题的副本,但我没有找到答案,因为&lt; c:set&gt;这是建议在我的情况下不起作用。或者你想说,这是不可能的,如果我想缓存它,例如在一个ui-repeat中,我必须为自己做一个豆吗?

1 个答案:

答案 0 :(得分:0)

通常,用户/角色的权限在登录期间与用户会话信息一起保存,因此不再需要再调用数据库。

这就是Apache Shiro和Spring Security的工作方式,仅举几个认证/授权框架......

如果您使用会话范围的bean来存储用户,您也可以使用它来存储其权限......