【问题标题】:jsf sessionbean has different values for setter and getterjsf sessionbean 对 setter 和 getter 有不同的值
【发布时间】:2015-01-21 16:23:08
【问题描述】:

在一个 jsf(Mojarra 2.1) 应用程序中,我从下面的 sessionbean 中调用一个布尔值。 一切正常,直到我使用 session.invalidate 注销并重新登录。 新登录后,getter 和 setter 的 detailView 的值是不同的。这意味着:

  • 调用setter方法,将detailView的值设置为 是的。
  • 之后,调用 getter 方法,并在客户端为 详细查看收到的值“false”!!

您也可以通过这些输出线看到这一点:

System.out.println("getdetailView:" + detailView + ": " + sessionId )

System.out.println("setdetailView:" + detailView + ": " + sessionId );

当我比较两个方法调用的 sessionIds 时,我们可以看到两个方法具有相同的 sessionId。

@ManagedBean(name = "sessionBean")
@SessionScoped
public class SessionBean implements Serializable {
…

private boolean detailView = false;
public boolean isDetailView() {

    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
    String sessionId = session.getId();
    System.out.println("getdetailView:" + detailView + ": " + sessionId );

    Return detailView;
}

public void setDetailView(final boolean detailView) {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
    String sessionId = session.getId();
    System.out.println("setdetailView:" + detailView + ": " + sessionId );
    this.detailView = detailView;
}

在jsf中,值是这样调用的:

<p:inputText rendered="#{sessionBean.detailView} value="bla"/>

看起来,getter 和 setter 绑定到不同的数据源,但这怎么可能呢?

感谢任何帮助。提前致谢。

【问题讨论】:

  • 什么设置detailView的值?

标签: jsf-2


【解决方案1】:

我在支持 bean 中没有看到任何 detailView 的 getter,你必须有一个 getter:

public boolean getDetailView() {
    //any required code.
    Return detailView;
}

注意您的支持 bean 由 @SessionScoped 注释,因此如果您希望它在应用程序期间处于活动状态,则如果在会话结束后无法访问字段,则使用 @ApplicationScoped 注释它是逻辑。

另外我在jst 代码中看到一个错误,请更正它:&lt;p:inputText rendered="#{sessionBean.detailView}" value="bla"/&gt; 但是我不确定是否可以将EL 表达式用于inputText 的render 属性, 另一件事是在&lt;form&gt;标签中加入代码

【讨论】:

  • afaik 对于布尔值,我们必须将“public boolean isDetailView()”设置为 getter,还是我错了?在任何地方,我都用 getDetailview() 尝试了同样的方法,它显示了相同的行为。
  • 我认为, sessioScoped 是正确的,因为我希望在新登录后拥有全新的值。我的问题是,新的 sessionbean 似乎(部分)使用旧会话的值。至少,我不能在新的 sessionbean 中改变 detailView 的值,因为 getter 总是返回初始值(false),尽管事实上 setter 已经正确地改变了值(如 println 所示)。跨度>
  • 有问题你能说明你是如何在 JSF 中使用它的吗?我的意思是你也可以展示你的 JSF 代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多