【问题标题】:Defining a variable on a JSF page在 JSF 页面上定义变量
【发布时间】:2017-02-07 11:24:49
【问题描述】:

假设我有一个对象列表,使用 标记对其进行迭代,并且用户对每个对象都有一个操作列表,但是 - 根据他的权限 - 其中一些操作被禁用,因为用户没有权限。

<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 中做些什么来实现这一点?

假设我使用这样的

<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>

但据我了解,只是一个快捷方式,它不会缓存与之关联的实际值,而是每次使用时都会重新计算value-expression?这是正确的吗?

那我还能做什么呢? 不是一个选项,因为它仅在查看构建时 afaik 期间设置。

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

我注意到,渲染的=".." 或 disabled=".." 有时甚至会被调用多次,因此表达式不仅每个标签被评估一次,在某些情况下还会被评估 2-3 次。这是一个正确的观察吗?这是什么原因?

提前感谢您的回答。

编辑: BalusC 将其标记为问题的重复,但我没有找到他们的答案,因为那里推荐的 在我的情况下不起作用。或者你想说,这是不可能的,如果我想缓存它,例如在 ui-repeat 中,我必须为自己用一个 bean 来做这件事吗?

【问题讨论】:

  • 我在问之前在我的研究中发现了这个问题,但它没有按问题回答,因为 <c:set>建议没有工作,例如在 ui-repeat 中,并且 ui-param 不缓存该值(而只是更复杂表达式的快捷方式)。所以你想说,除了在 bean 中手动缓存值或使用 bean-method 之外,EL/JSF 中没有任何通用机制来实现这一点把它作为变量放在请求范围内?
  • “用户”到底来自哪里?是否只有一个单一用户(可能是已登录的用户)?
  • 用户对象是当前登录的用户(从会话范围的 bean 中获取)。 getPermissions() 方法从数据库中获取用户对给定项目的权限,该项目基本上是一个 Java Map 对象。我想将此映射存储在某种变量中,因此不需要在 ui-repeat 中再次获取它。我当然可以在我的 bean 中手动缓存 Map,但我想知道是否没有更通用的解决方案。因为我会认为这是一个很常见的问题,所以我想在 JSF/EL 中会有一个内置的解决方案。
  • 是的 - 支持豆。如果我能解决这个问题,我将创建一个适当的 bean 类,它将成为“item”变量,它可以提供视图所需的所有信息。业务逻辑不属于视图。
  • 那么 JSF/EL 中没有机制来存储(真正存储,所以缓存值,而不是重新评估 EL)变量中的东西?我认为这与在视图中完成的业务逻辑无关,因为在我的示例中,业务逻辑已经为视图提供了所有必要的信息。我只想多次使用该信息,而不是一次又一次地获取相同的信息。

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


【解决方案1】:

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

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

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

【讨论】:

  • 权限可以随时更改,所以我不能在登录时将它们存储在会话中。但这只是一个例子,我描述的问题与此无关。
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2012-01-15
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多