具有许多浏览器选项卡的bean的属性

时间:2013-11-12 04:18:55

标签: jsf

我正在使用JSF,...我认为这是一个愚蠢的问题,但我真的不明白。我的问题: 我有一个jsf页面:/product.xhtml

<f:metadata>
    <f:viewParam name="p" value="#{singleProduct.p}" />
</f:metadata>
...
<h:form>
        <h:inputTextarea value="#{singleProduct.content}" />
        <h:commandLink value="Comment" action="#{singleProduct.postComment}" />
</h:form>

我的bean:SingleProduct

@Named
@SessionScoped
@Inject
private ProductService productService; //EJB
private int p;
private String content;
//Getters and setters;

public void postComment(){
  productService.addComment(p,content); //addComment(int productId, String commentContent)
}

现在,我打开一个浏览器标签,其中包含网址:/product.xhtml?p=1。然后打开另一个包含网址的标签:/product.xhtml?p=2。然后返回包含网址的标签:/product.xhtml?p=1以输入并提交表单。 我想问一下:保存到数据库的注释有多少productId值:1或2? 我认为我的问题与JSF的状态有关,但我不清楚它。感谢

1 个答案:

答案 0 :(得分:1)

您需要了解不同范围的bean的生命周期,以便自己回答您的问题。会话范围的数据一直存在,直到会话失效或由于一段时间不活动而超时。它可以在首次需要时由JSF隐式创建,即当您通过EL访问视图中的会话bean时。你当然可以事先自己创建会话,或删除会话属性,这些bean(或代理),但我认为这不是你的场景。

对于可能打开不同选项卡的每个浏览器,HTTP会话在一段时间内是唯一的。因此,由于有一个bean的值不断被覆盖,因此存在明显的范围问题。你最终不希望你的信息被写入不同的身份证,是吗?基本上,您希望基于每个视图的唯一数据(bean),因此您需要@ViewScoped bean。