【问题标题】:Setting Managed Bean attribute's value from JSF page and using it in bean's methods从 JSF 页面设置托管 Bean 属性的值并在 bean 的方法中使用它
【发布时间】:2014-07-10 10:28:34
【问题描述】:

我有一个 ViewScoped 托管 Bean。在我的 .xhtml 页面中,我想设置 bean 的属性值并在同一个 bean 的方法中使用它。 我设法从 jsf 页面设置了值,但是当我想在某些方法中使用它时,属性的值不是我之前设置的值。

说明 (xhtml): 在这种形式中,有一个设置属性值的命令链接。它工作正常。此外,当单击命令链接时,将显示第二种形式。

<h:form>
  <h:commandLink value="Set" >
     <f:setPropertyActionListener target="#{bean.attribute}" value="true" />
     <f:ajax execute="@this" />
  </h:commandLink>
</h:form>

此表单执行的方法使用了之前设置的属性值,但该值不为真,为假。

<h:form>
    <h:commandButton id="submit" value="Execute" action="#{bean.execute}" />
</h:form>

豆子:

public void execute(){
    if(isAttribute())
        ---do something---
}

问题是:为什么execute()不能正确读取属性值?

当我使用一种形式时,它工作正常。但我需要它们以分开的形式出现。

【问题讨论】:

  • 如何在同一个请求中同时执行#{bean.execute}#{bean.attribute}
  • 我执行这段代码没有问题。 commandLink 将值设置为true,单击按钮时该值保持不变。我用的是 Mojarra JSF 2.2.7,你用的是哪个版本?

标签: jsf jsf-2


【解决方案1】:

您的 bean 的范围不正确。 ViewScoped 意味着在视图更改的那一刻,bean 被丢弃并为下一个视图重新创建。因此,在您的情况下,您在第一次查看时拥有的原始数据会丢失。

我会推荐你​​去 BalusC 的博客:

http://balusc.blogspot.co.uk/2010/06/benefits-and-pitfalls-of-viewscoped.html

其中规定:

只要您一次又一次地将表单提交到同一个视图,@ViewScoped bean 就会存在。换句话说,只要 action 方法返回 null 甚至 void,bean 就会在下一个请求中出现。一旦你导航到不同的视图,那么 bean 将被丢弃

【讨论】:

  • 我无法理解答案的重点......用户正在使用 commandlink 执行 ajax 回发,它仍然保持在同一个视图中,不是吗?视图没有被破坏。这是我的观点,因为问题本身不是很清楚。
【解决方案2】:

我无法确定您是否会在两个请求中停留在同一页面上。如果这样做,viewScope 甚至应该以两种不同的形式工作。如果您从一个视图导航到另一个视图,则会创建另一个 viewScope,您将失去当前的。

您可以使用 java 或通过注释 backingNean 来设置 sessionScope 中的值。但随后您的 backingBean 中的所有内容都变为 sessionScoped 并且可能不需要。

您也可以使用类似弹簧的流量范围。

用 java 做的例子:

public void callThisAfterFirstClick() {
   Faces.setSessionAttribute(attribute, true)
}

public void callThisAfterSecondClick() {
   Faces.getSessionAttribute(attribute);
}

【讨论】:

  • 如果他从一个视图导航到另一个视图,关键是使用视图参数或闪光灯范围。如果使用多选项卡式导航,将它们存储在会话范围内可能会带来问题。
猜你喜欢
  • 1970-01-01
  • 2012-07-31
  • 2011-04-16
  • 2010-11-08
  • 2014-07-17
  • 2012-06-30
  • 2012-06-30
  • 2016-05-02
  • 2012-09-09
相关资源
最近更新 更多