设置托管Bean属性';从JSF页面中获取s值并在bean中使用它';s方法

设置托管Bean属性';从JSF页面中获取s值并在bean中使用它';s方法,jsf,jsf-2,Jsf,Jsf 2,我有一个ViewScope托管Bean。在我的.xhtml页面中,我想设置bean的属性值,并在同一个bean的方法中使用它。 我设法从jsf页面设置了这个值,但是当我想在某些方法中使用它时,属性的值不是我以前设置的值 说明(xhtml): 在这种形式中,有一个命令链接,用于设置属性的值。它工作得很好。此外,当单击命令链接时,将显示第二个表单 <h:form> <h:commandLink value="Set" > <f:setPropertyAct

我有一个ViewScope托管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>
问题是:为什么execute()没有正确读取属性的值?


当我使用一个表单时,它运行良好。但是我需要它们以单独的形式出现。

您的bean的范围不正确。ViewScoped意味着视图一更改,bean就被丢弃并为下一个视图重新创建。因此,在您的情况下,第一个视图的原始数据丢失了

我将向您介绍BalusC的博客:

其中指出:

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


我不能确定你们中有多少人对这两个要求保持一致。如果这样做,viewScope甚至可以以两种不同的形式工作。如果您正在从一个视图导航到另一个视图,则将创建另一个viewScope,并且您将失去当前的viewScope

您可以在sessionScope中使用java或通过注释backingNean来设置值。但是,backingBean中的所有内容都变成了sessionScope,这可能不需要

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

使用java执行此操作的示例:

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

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

如何在同一个请求中同时执行
{bean.execute}
{bean.attribute}
?我执行这段代码没有问题。commandLink将该值设置为
true
,单击按钮时该值保持不变。我使用的是MojarraJSF2.2.7,您使用的是哪个版本?我不明白答案的意思。。。用户正在使用commandlink执行ajax回发,但它仍然保持在同一视图中,不是吗?视图没有被破坏。这是我的观点,因为问题本身不是很清楚。如果他从一个视图导航到另一个视图,关键是使用视图参数或闪光灯范围。如果使用多选项卡导航,将它们存储在会话范围中可能会带来问题。
public void execute(){
    if(isAttribute())
        ---do something---
}
public void callThisAfterFirstClick() {
   Faces.setSessionAttribute(attribute, true)
}

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