我正在使用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的状态有关,但我不清楚它。感谢
答案 0 :(得分:1)
您需要了解不同范围的bean的生命周期,以便自己回答您的问题。会话范围的数据一直存在,直到会话失效或由于一段时间不活动而超时。它可以在首次需要时由JSF隐式创建,即当您通过EL访问视图中的会话bean时。你当然可以事先自己创建会话,或删除会话属性,这些bean(或代理),但我认为这不是你的场景。
对于可能打开不同选项卡的每个浏览器,HTTP会话在一段时间内是唯一的。因此,由于有一个bean的值不断被覆盖,因此存在明显的范围问题。你最终不希望你的信息被写入不同的身份证,是吗?基本上,您希望基于每个视图的唯一数据(bean),因此您需要@ViewScoped
bean。