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