【发布时间】:2015-11-19 05:31:26
【问题描述】:
我正在通过开发crud App学习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>
下面是我的 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 托管 Bean 类
@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;
}
}
我最后一个用于 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);
}
}
}
当我单击添加新学生并在 add.xhtml 上提供学生 ID 和姓名时,它不会将数据保存到数据库中,在 index.xhtml 中调用的 getAllStudent() 都不会显示该数据。我哪里错了?请帮忙
【问题讨论】:
-
首先,摆脱在 getter 方法中实现业务逻辑。默认情况下,以多个相邻大写字母开头的托管 bean 名称与非限定类名称相同,而不会将第一个字母更改为小写。因此,在这种情况下,您需要像
value="#{DBQueries.allStudents}"、actionListener="#{DBQueries.add}"这样的表达式,或者像这样显式指定托管 bean 名称、@ManagedBean(name = "dBQueries")或任何有意义的东西。
标签: java jsf servlets web-applications crud