假设我有一个使用< 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中,我必须为自己做一个豆吗?
答案 0 :(得分:0)
通常,用户/角色的权限在登录期间与用户会话信息一起保存,因此不再需要再调用数据库。
这就是Apache Shiro和Spring Security的工作方式,仅举几个认证/授权框架......
如果您使用会话范围的bean来存储用户,您也可以使用它来存储其权限......