JSF Datatable不显示所有列表字段(列)

JSF Datatable不显示所有列表字段(列),jsf,datatable,Jsf,Datatable,我想在JSF:DataTAble中显示一个表。我成功地将表从数据库检索到用户类型列表,其中“users”是我的pojo类。现在,我在数据表上显示它时遇到了问题,一些列,如FName、LName、Pwd,显示正确,但当我添加其他coulmns,如“Note”“Email”时,会出现此错误 javax.servlet.ServletException: /dt.xhtml: Property 'Email' not found on type in.ali.pojo.users javax.

我想在JSF:DataTAble中显示一个表。我成功地将表从数据库检索到用户类型列表,其中“users”是我的pojo类。现在,我在数据表上显示它时遇到了问题,一些列,如FName、LName、Pwd,显示正确,但当我添加其他coulmns,如“Note”“Email”时,会出现此错误

javax.servlet.ServletException: /dt.xhtml: Property 'Email' not found on type in.ali.pojo.users
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)


root cause 

javax.el.ELException: /dt.xhtml: Property 'Email' not found on type in.ali.pojo.users
    com.sun.faces.facelets.compiler.TextInstruction.write(TextInstruction.java:88)
    com.sun.faces.facelets.compiler.UIInstructions.encodeBegin(UIInstructions.java:82)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302)
    com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:385)
    com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:162)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:894)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:443)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
这是我的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"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
<h:dataTable value="#{pretechDataTableBean.user}" var="users">
                 <h:column>
                    <f:facet name="header">Name</f:facet>
                    #{users.FName}
                      </h:column>
                 <h:column>
                    <f:facet name="header">Email</f:facet>
                    #{users.Email}
                </h:column>
                <h:column>
                    <f:facet name="header">Password</f:facet>
                    #{users.pwd}
                </h:column>

             </h:dataTable>
    </h:body>
</html> 

字段必须类似于此,而不是类似于此。只需将JSF代码更改为


名称
#{user.fName}
电子邮件
#{user.email}
密码
#{user.pwd}
并更新
User
类中的字段名,以遵循正确的JavaBean命名约定

public class users implements java.io.Serializable {

    private long userId;
    private String fName;
    private String lName;
    private long userTypeId;
    private String userName;
    private String email;
    private String pwd;
    private String note;
    private boolean isActive;
    //constructor, getters and setters
}
除此之外,当前设计中还有其他缺陷:

  • 您的托管bean的getter中不能有业务逻辑,而应该利用
    @PostConstruct
    方法初始化要使用的必要数据
  • 由于这个bean看起来应该在用户停留在同一视图时保持活动状态,因此最好将其修饰为
    @ViewScoped
    ,而不是
    @RequestScoped
  • 为类和字段使用专有名称。例如,如果您有一个
    列表
    字段,请将变量命名为
    somethingList
    或类似名称,以便代码是自解释的
通过这些,您可以将托管bean更改为:

@ManagedBean
@ViewScoped
public class PretechDataTableBean { 

    private List<users> userList;

    public PretechDataTableBean() {
    }

    @PostConstruct
    public void init() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        List<users> users =null;
        try
        {
            transaction = session.beginTransaction();
            users = session.createQuery("from users").list();   



        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally{
            session.close();
        }
        return users;
    }

    public List<users> getUserList() {
        return this.user;
    }
}
@ManagedBean
@视域
公共类PretechDataTableBean{
私有列表用户列表;
公共数据表bean(){
}
@施工后
公共void init(){
Session Session=HibernateUtil.getSessionFactory().openSession();
事务=空;
列表用户=null;
尝试
{
事务=session.beginTransaction();
users=session.createQuery(“来自用户”).list();
}
捕获(例外e)
{
e、 printStackTrace();
}
最后{
session.close();
}
返回用户;
}
公共列表getUserList(){
返回此.user;
}
}
由于该字段在托管bean中更改了名称,因此应在相应的视图中对其进行相应的编辑:


相关信息:

  • ,更具体地说,第7节:属性

字段必须类似于此,而不是类似于此。只需将JSF代码更改为


名称
#{user.fName}
电子邮件
#{user.email}
密码
#{user.pwd}
并更新
User
类中的字段名,以遵循正确的JavaBean命名约定

public class users implements java.io.Serializable {

    private long userId;
    private String fName;
    private String lName;
    private long userTypeId;
    private String userName;
    private String email;
    private String pwd;
    private String note;
    private boolean isActive;
    //constructor, getters and setters
}
除此之外,当前设计中还有其他缺陷:

  • 您的托管bean的getter中不能有业务逻辑,而应该利用
    @PostConstruct
    方法初始化要使用的必要数据
  • 由于这个bean看起来应该在用户停留在同一视图时保持活动状态,因此最好将其修饰为
    @ViewScoped
    ,而不是
    @RequestScoped
  • 为类和字段使用专有名称。例如,如果您有一个
    列表
    字段,请将变量命名为
    somethingList
    或类似名称,以便代码是自解释的
通过这些,您可以将托管bean更改为:

@ManagedBean
@ViewScoped
public class PretechDataTableBean { 

    private List<users> userList;

    public PretechDataTableBean() {
    }

    @PostConstruct
    public void init() {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;
        List<users> users =null;
        try
        {
            transaction = session.beginTransaction();
            users = session.createQuery("from users").list();   



        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally{
            session.close();
        }
        return users;
    }

    public List<users> getUserList() {
        return this.user;
    }
}
@ManagedBean
@视域
公共类PretechDataTableBean{
私有列表用户列表;
公共数据表bean(){
}
@施工后
公共void init(){
Session Session=HibernateUtil.getSessionFactory().openSession();
事务=空;
列表用户=null;
尝试
{
事务=session.beginTransaction();
users=session.createQuery(“来自用户”).list();
}
捕获(例外e)
{
e、 printStackTrace();
}
最后{
session.close();
}
返回用户;
}
公共列表getUserList(){
返回此.user;
}
}
由于该字段在托管bean中更改了名称,因此应在相应的视图中对其进行相应的编辑:


相关信息:

  • ,更具体地说,第7节:属性