我在使用f:viewParam
. 所以我有两页,test_first.xhtml
andtest_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
。
但是如果我点击Submit
link1中的按钮,2
将被打印出来,渲染的文本将从1变为2。(因为link2稍后打开并且bean是会话范围的?)
(更新:为什么会这样?如果我点击“提交”,我怎么还能打印“1”?)
我想基本上将 bean 保留为其他属性的会话范围。那么对这个或任何替代方法有什么想法吗?非常感谢!