0

我正在使用 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)
}

现在,我打开一个带有 URL: 的浏览器选项卡/product.xhtml?p=1。然后打开另一个带有 URL: 的选项卡/product.xhtml?p=2。然后返回到带有 URL 的选项卡:/product.xhtml?p=1键入并提交表单。我想问:保存到数据库的评论有多少 productId 值: 1 或 2 ?我认为我的问题与 JSF 的状态有关,但我并不清楚。谢谢

4

1 回答 1

1

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

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

于 2013-11-12T07:08:10.787 回答