我在使用f:viewParam
的会话范围bean时遇到了一些问题。我有两个页面,test_first.xhtml
和test_second.xhtml
以及TestBean.java
。
first.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>
second.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开始运行。现在我有两页。
如果我点击link1中的“打印页面ID”按钮,将在控制台中打印1
。在link2中,打印值为2
。
但是如果我单击link1中的Submit
按钮,将打印2
,并且渲染的文本将从1更改为2.(因为link2稍后打开,bean是会话范围的?)
(更新:为什么会这样?如果点击“提交”,我怎么还能打印“1”?)
我想基本上将bean作为其他属性的会话作用域。那么对这个或任何替代方法的任何想法?非常感谢!
答案 0 :(得分:1)
如果您希望它在不同的选项卡或窗口中工作,则需要将这些选项卡特定的属性放在ViewScoped或RequestScoped Bean上。对于特定于会话的属性,您可以创建另一个Bean并使其成为SessionScoped。