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 实例为空,因为 StudentManagedBean
在 DBQueries
中定义为 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
。
我正在通过开发 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 实例为空,因为 StudentManagedBean
在 DBQueries
中定义为 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
。