JSF 不会在 setter 和 getter 中获取数据(CRUD 应用程序)

JSF wont get data in setters and getters (CRUD App)

我正在通过开发 crud 应用程序学习 jsf,并且完全迷失在一个愚蠢的问题中,那就是我无法将数据添加到数据库中,而我的 sql 命令和数据库都是正确的。以我微薄的知识,我假设我的 xhtml 页面使用不同的对象来设置数据,并且 jdbc class 使用不同的对象来获取。请有人帮忙。

以下是我的 index.xhtml 代码,它显示了学生数据库的所有数据:

 <h:head>
    <title>MY CRUD Application</title>
 </h:head>
 <h:body>
    <center>
        <h:form>
            <h:dataTable var="list" value="#{dBQueries.allStudents}" cellpadding="2" cellspacing="2" border="1">

                <h:column>
                <f:facet name="header">
                Student Id
                </f:facet>
                <h:inputText value="#{list.id}"/>
                </h:column>

                <h:column>
                <f:facet name="header">
                Student Name
                </f:facet>
                <h:inputText value="#{list.name}"/>
                </h:column>

            </h:dataTable>
            <h:commandLink value="Add New Student" action="add"/>

        </h:form>


    </center>
 </h:body>
 </html>

下面是我的add.xhtml页面

<h:head>
    <title>Add New Student</title>
</h:head>
<h:body>
    <f:view>
        <h:form>
  <h:panelGrid  border="1" cellpadding="20" cellspacing="20" columns="3">                                              


                <h:outputLabel value="student Id" />
   <h:inputText value="#{studentManagedBean.id}"  required="true"  requiredMessage="Student id is Required" id="eId">
                </h:inputText><h:message for="eId"/>


                <h:outputLabel value="student Name" />
                <h:inputText value="#{studentManagedBean.name}" required="true" requiredMessage="Student Name is Required" id="eName">
                </h:inputText><h:message for="eName"/>


                <h:commandLink  value="saveAdd"  action="index" actionListener="#{dBQueries.add()}" onclick="confirm('Are you Sure')"  />
            </h:panelGrid>
        </h:form>
    </f:view>
</h:body>

下面是我的 java Managed Bean Class

@ManagedBean
@RequestScoped
public class StudentManagedBean {
private  int id;
private  String name;

 public StudentManagedBean() {
}


public int getId() {
    return id;
}


public void setId(int id) {
    this.id = id;

}


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

my last java class for DBQueries 执行两种方法,1) 获取所有学生数据和 2) 添加新学生数据。代码如下:

@ManagedBean
@RequestScoped
public class DBQueries  {

String query = null;
public PreparedStatement ps = null;
public ResultSet resultSet = null;
StudentManagedBean bean = new StudentManagedBean();
DBConnectivity connectivity = new DBConnectivity();

public DBQueries() {
}

public ArrayList<StudentManagedBean> getAllStudents() {
    ArrayList<StudentManagedBean> arrayList = new ArrayList();
    Connection con = connectivity.connect();
    query = "SELECT id, name FROM student_record";
    try {
        ps = con.prepareStatement(query);
        resultSet = ps.executeQuery();

        while (resultSet.next()) {

            bean.setId(resultSet.getInt("id"));
            bean.setName(resultSet.getString("name"));
            arrayList.add(bean);
        }
    } catch (SQLException ex) {
        Logger.getLogger(DBQueries.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        connectivity.closeConnection(con, resultSet, ps);
    }

    return arrayList;

}

public void add() {

    Connection con1 = connectivity.connect();
    query = "INSERT INTO student_record(id, name) VALUES(?, ?)";
    try {
        ps = con1.prepareStatement(query);

        ps.setInt(1, bean.getId());
        ps.setString(2, bean.getName());
        ps.executeUpdate();

    } catch (SQLException ex) {
        Logger.getLogger(DBQueries.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        connectivity.closeConnection(con1, resultSet, ps);
    }

}

}

当我单击添加新学生并在 add.xhtml 上提供学生 ID 和姓名时,它不会将数据保存到数据库中,在 index.xhtml 中调用的 getAllStudent() 也不会显示该数据。我哪里错了?请帮忙

您尝试插入数据库的 Student 实例为空,因为 StudentManagedBeanDBQueries 中定义为 classic java class,而不是作为其他托管 bean,这就是方法 bean.getId()bean.getName() return 什么都没有的原因。 我认为问题在于 DBQueries 无法识别您通过视图使用的其他托管 bean。为此,您应该将它注入到需要其服务的 bean 中,在 DBQueries bean 中的 Student bean class 之前添加此注释。

@ManagedProperty    
StudentManagedBean bean = new StudentManagedBean();

此外,为了顺利注入,您应该渲染 Student bean @SessionScoped