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

Java JSF不会在setter和getter中获取数据(CRUD应用程序),java,jsf,servlets,web-applications,crud,Java,Jsf,Servlets,Web Applications,Crud,我通过开发crud应用程序学习jsf,完全陷入了一个愚蠢的问题,即我不能将数据添加到数据库中,而我的sql命令和数据库都是正确的。根据我微薄的知识,我假设我的xhtml页面使用不同的对象来设置数据,jdbc类使用不同的方法来获取数据。请找个人帮忙 下面是我的index.xhtml代码,它显示了学生数据库的所有数据: <h:head> <title>MY CRUD Application</title> </h:head> <h:

我通过开发crud应用程序学习jsf,完全陷入了一个愚蠢的问题,即我不能将数据添加到数据库中,而我的sql命令和数据库都是正确的。根据我微薄的知识,我假设我的xhtml页面使用不同的对象来设置数据,jdbc类使用不同的方法来获取数据。请找个人帮忙

下面是我的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>
}

我的上一个用于DBQueries的java类执行两种方法,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);
    }

}
}


当我单击addnewstudent并在add.xhtml上给出student id和name时,它不会将数据保存到数据库中,在index.xhtml中调用的getAllStudent也不会显示该数据。我错在哪里?请帮助

您试图插入数据库的学生实例是空的,因为StudentManagedBean在DBQueries中定义为经典java类,而不是其他托管bean,这就是方法bean.getId和bean.getName不返回任何内容的原因。 我假设问题在于DBQueries无法通过视图识别您正在使用的另一个托管bean。要做到这一点,您应该将其注入需要其服务的bean中,在dbbean中的Student bean类之前添加此注释


另外,对于没有问题的注入,您应该呈现Student bean@SessionScoped。

首先,不要在getter方法中实现业务逻辑。默认情况下,开头有多个相邻大写字母的托管bean名称与非限定类名相同,而不会将第一个字母改为小写。因此,在本例中,您需要像value={dbquerys.allStudents},actionListener={dbquerys.add}这样的表达式,或者像这样显式地指定托管bean名称,@ManagedBeanname=dbquerys或者其他任何有意义的表达式,现在我终于可以将数据插入数据库了,但index.xhtml中的dataTable只显示数据库中最新的insert条目,而当我直接签入数据库时,它显示实际插入的数据。我哪里错了?很好,这是另一个问题。你能通过放一个SOP来调试while循环吗?检查它循环数据库中的记录是否多于?我有5列和2行。当我使用语句resultset.getStringlabel将SOP放入while循环中5次时,我将整个记录打印了3次;是的,但这并没有解决问题。仍然会打印两次最新的行,而它应该打印两个不同的行。
@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;
}
@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);
    }

}
@ManagedProperty    
StudentManagedBean bean = new StudentManagedBean();