【问题标题】:JSF One Session Per UserJSF 每个用户一个会话
【发布时间】:2013-01-17 15:32:53
【问题描述】:


我刚开始学习 JSF,我想知道这个问题。 我有 16 个复选框。当我打开页面并且我的兄弟也在打开它时,似乎我们有相同的会话。当我单击其中一个复选框时,它也会在我的兄弟浏览器上被选中。 选中的复选框保存在private ArrayList<String> selectedBoes = new ArrayList<String>();
我的 ManagedBean 是 SessionScoped。

为什么会发生这种情况以及如何避免?

【问题讨论】:

  • 我们需要更多数据(可能还有代码): - 您是否将数据保存在某处(数据库、文件)? - 当您提到“我的兄弟”时,您是指不同的计算机还是什么?
  • 我打开它或另一台计算机打开它都没有关系。结果是一样的。选中的复选框保存在private ArrayList<String> selectedBoes = new ArrayList<String>();
  • 如何在应用程序中启动会话?
  • 我不确定你的意思.. 我真的是 JSF 的新手。在 xhtml 文件中,我只有 <h:selectManyCheckbox id="selBoxes" value="#{main.selBoxes}"><f:selectItems value="#{main.boxes}"/></h:selectManyCheckbox>
  • 在页面中输入<p>My session ID is #{session.id}</p>,让我们知道您和您的兄弟看到了什么。

标签: java jsf session


【解决方案1】:

我兄弟的会话 ID 是 cdbbb126e96060ddb924b9d5e591。我的是cd9a5c4180bd9dfef0ec8db2ac4d

那么唯一可能的原因是您实际上没有将它们存储在会话范围内。症状表明您要么将它们存储在应用程序范围内,要么甚至声明它static(因此问题中的代码根本不代表真实代码;您的 cmets 中的代码也表明更少或更多,您使用了不同的属性名称,显然您试图从头顶输入它,您不应该这样做,您应该复制粘贴 real 代码)。

请注意,当您使用 CDI 的 @Named 而不是 JSF 的 @ManagedBean 时,它将默认为应用程序范围,除非使用 javax.enterprise.context 范围注释另外指定。因此,如果您使用 JSF 自己的 javax.faces.bean.SessionScoped 注释,而 CDI 不支持,那么它仍然在应用程序范围内。

【讨论】:

  • 正如我所说,我是 JSF 的新手,我不知道如何保存它的会话范围。代码是真实的。我唯一改变的是列表的名称。我没有声明它是静态的,我使用了@ManagedBean。对于 @SessionScoped,我使用了import javax.faces.bean.SessionScoped。我应该把它改成javax.enterprise.context.SessionScoped吗?
  • 那么问题是由迄今为止提供的信息中可见的其他地方引起的。也许您根本没有运行您认为正在运行的代码?
  • javax.faces.bean.SessionScopedjavax.enterprise.context.SessionScoped有什么区别
  • 一个来自JSF,另一个来自CDI。
猜你喜欢
  • 2011-07-25
  • 2014-02-21
  • 2014-02-21
  • 1970-01-01
  • 2015-12-26
  • 2019-10-19
  • 2012-06-02
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多