-1

我在使用f:viewParam. 所以我有两页,test_first.xhtmlandtest_second.xhtml和 a TestBean.java

第一个.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">

<h:head/>
<h:body>
<h:form>
    <h:link value="link1" outcome="test_second" >
        <f:param name="id" value="1"/>
    </h:link>
    <br/><br/>
    <h:link value="link2" outcome="test_second" >
        <f:param name="id" value="2"/>
    </h:link>
</h:form>
</h:body>
</html>

第二个.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<f:metadata>
    <f:viewParam name="id" value="#{testBean.userId}" />
</f:metadata>
<h:head/>
<h:body>
<h:form>
    This is the second page.
    <h:outputText value="Selected id is #{testBean.userId}" />
    <h:commandButton value="Print page id" action="#{testBean.print()}" />

    <h:commandButton styleClass="submitButton" value="Submit" action="#{testBean.submit}">
        <f:ajax execute="@form" render="@form"/>
    </h:commandButton>
</h:form>
</h:body>
</html>

TestBean.java:

@ManagedBean
@SessionScoped
public class TestBean implements Serializable{
    private Integer userId;

public void print() {
    System.out.println(userId);
}

public void submit() {
    System.out.println(userId);
}
    /...
}

link1如果我在新选项卡中打开然后link2在另一个新选项卡中打开,则从 first.xhtml 开始运行。现在我有两页。

如果我单击链接1中的“打印页面ID”按钮,1将在控制台中打印。在链接 2 中,打印的值为2

但是如果我点击Submitlink1中的按钮,2将被打印出来,渲染的文本将从1变为2。(因为link2稍后打开并且bean是会话范围的?)

更新:为什么会这样?如果我点击“提交”,我怎么还能打印“1”?)

我想基本上将 bean 保留为其他属性的会话范围。那么对这个或任何替代方法有什么想法吗?非常感谢!

4

1 回答 1

1

如果您希望它在不同的选项卡或窗口中工作,您需要将这些选项卡特定的属性放在 ViewScoped 或 RequestScoped Bean 上。对于特定于会话的属性,您可以创建另一个 Bean 并将其设置为 SessionScoped。

于 2013-08-21T05:51:56.627 回答