【问题标题】:JSF page, why doesn't bean increment?JSF页面,为什么bean不增加?
【发布时间】:2016-04-07 18:56:41
【问题描述】:

我期望每当我单击 commandLink 时,我都会看到 bean.count 属性增加。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
   xmlns:h="http://java.sun.com/jsf/html"> 
<h:head>
  <title>test page</title>
</h:head>
<h:body> 
   <h:form>
     <h:commandLink action="#{myBean.inc}" value="Click me"/><br/>
     #{myBean.count} 
   </h:form>
</h:body>
</html> 

用一颗豆子

package com.test;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class MyBean implements Serializable{
  int count=0;
  public int getCount() {
    return count;
  }
  public void inc(){
    count++;
  }
}

然而,它只会在第一次点击时从 0 递增到 1。 谁能告诉我为什么?

【问题讨论】:

    标签: jsf


    【解决方案1】:

    Action 具有特殊含义,如you can see here。请改用 actionListener 并添加 ActionEvent 参数。

    public void inc(ActionEvent event){
      count++;
    }
     <h:commandLink actionListener="#{myBean.inc}" value="Click me"/><br/>
    

    【讨论】:

    • 谢谢彼得,没有办法直接调用 bean 方法,即没有参数?奇怪的是,我最初发布的代码工作了一小会儿,并显示了递增的值。然后,当我按照您的建议进行更改时,它再次起作用了一段时间,但随后停止了工作!我试过重新启动 Tomcat,关闭并重新打开 Firefox,清除浏览器缓存并删除所有 cookie。不过还是不行!
    • 其实根据这个答案stackoverflow.com/a/3909382/564045,在这种情况下操作是正确的
    • @PaulStatham actionListener 会更正确。无论如何,这是一个会话问题。
    【解决方案2】:

    嗯,我找到了问题的原因。

    它源于我导航到然后在 Firefox 中测试我的页面的方式。

    如果我重新启动 Firefox 并输入测试页的 URL,一切正常。

    但是,我正在将我的测试 web 应用程序部署到 Tomcat。如果我使用 Tomcat Web 应用程序管理器页面并从应用程序管理器的列表应用程序页面导航到我的测试 web 应用程序,那么每次单击链接时似乎都会重新创建被认为是会话范围的 bean。观察 JSESSIONID cookie,每次都会创建一个新的。

    IE 中相同的用户操作序列不会丢失会话。

    火狐 45.0.1

    IE 8

    Tomcat 7.0.55

    Mojarra 2.2.0

    感谢彼得和拉维的帮助。

    【讨论】:

      【解决方案3】:

      相同的代码对我来说可以正常工作:)

      package com.test;
      
      import java.io.Serializable;
      
      import javax.faces.bean.ManagedBean;
      import javax.faces.bean.SessionScoped;
      
      @ManagedBean
      @SessionScoped
      public class MyBean implements Serializable {
          int count = 0;
      
          public int getCount() {
              System.out.println("getCount " +count);
              return count;
          }
      
          public void inc() {
              count++;
              System.out.println("inc " +count);
          }
      }
      

      MyBean.xhtml 页面

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html">
      <h:head>
          <title>test page</title>
      </h:head>
      <h:body>
          <h:form>
              <h:commandLink action="#{myBean.inc}" value="Click me" />
              <br />
           #{myBean.count} 
         </h:form>
      </h:body>
      </html>
      

      控制台日志

      getCount 0
      inc 1
      getCount 1
      inc 2
      getCount 2
      inc 3
      getCount 3
      inc 4
      getCount 4
      inc 5
      getCount 5
      inc 6
      getCount 6
      inc 7
      getCount 7
      inc 8
      getCount 8
      inc 9
      getCount 9
      inc 10
      getCount 10
      inc 11
      getCount 11
      inc 12
      getCount 12
      inc 13
      getCount 13
      inc 14
      getCount 14
      inc 15
      getCount 15
      inc 16
      getCount 16
      inc 17
      getCount 17
      inc 18
      getCount 18
      inc 19
      getCount 19
      inc 20
      getCount 20
      inc 21
      getCount 21
      

      测试环境: 面向 Web 开发人员的 Eclipse Java EE IDE。版本:Mars.1 Release (4.5.1), JSF 2.2.4, JDK 1.8.0_73 , 在 IE , Chrome 和 Firefox 上测试过。

      检查失败时的情况,它甚至会调用 inc() 方法,以及日志文件中是否存在会话超时或任何消息。

      【讨论】:

      • 所有应有的尊重,“为我工作”不是解决当前形式的问题中描述的具体问题的答案。如果您无法解释和解决问题,下次您有足够的声誉时最好发表评论。
      • 感谢 BalusC。刚开始我在 stackoverflow 中的第一组贡献。希望能提供更具体的答案和cmets。
      • 我赞成根据此处提出的问题在沙盒环境中重现该问题的尝试。对于初学者来说,这确实是一个很好的学习练习。继续这样做。但是发布“为我工作”作为答案对提问者没有帮助。
      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 2012-09-09
      • 2015-11-16
      • 2018-04-04
      • 1970-01-01
      • 2015-10-22
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多