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

Jsf 具有多个浏览器选项卡的bean的属性,jsf,Jsf,我正在使用JSF,。。。我认为这是一个愚蠢的问题,但我真的不明白。我的问题: 我有一个jsf页面:/product.xhtml <f:metadata> <f:viewParam name="p" value="#{singleProduct.p}" /> </f:metadata> ... <h:form> <h:inputTextarea value="#{singleProduct.content}" />

我正在使用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>
现在,我打开一个带有URL的浏览器选项卡:
/product.xhtml?p=1
。然后打开另一个带有URL的选项卡:
/product.xhtml?p=2
。然后返回带有URL的选项卡:
/product.xhtml?p=1
,以键入并提交表单。 我想问:保存到数据库的注释有多少productId值:1或2?
我认为我的问题和JSF的状态有关,但我不太清楚。谢谢

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


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

我知道不同范围bean的生存期,我知道'@ViewScoped'。但在JSF2.2之前,CDIBean没有'@ViewScoped'。真的,我不喜欢托管bean,因为它的局限性。根据你的回答,p=2?如果我使用'@RequestScoped',会发生什么?请求范围bean将在每个页面提交时创建,视图参数也将在回发时设置,因此在您的情况下,它将按预期工作。由于您似乎没有保持视图状态,这对于您的用例来说是一个很好的解决方案。相关:
@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)
}