【问题标题】:JSF wont get data in setters and getters (CRUD App)JSF 不会在 setter 和 getter 中获取数据(CRUD App)
【发布时间】: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


【解决方案1】:

您尝试插入数据库的 Student 实例是空的,因为 StudentManagedBeanDBQueries 中定义为经典 java 类,而不是其他托管 bean,这就是 bean.getId() 和 @ 方法的原因987654324@什么也不回。 我认为问题在于DBQueries 无法通过视图识别您正在使用的其他托管bean。为此,您应该将其注入需要其服务的 bean 中,在 DBQueries bean 中的 Student bean 类之前添加此注释。

@ManagedProperty    
StudentManagedBean bean = new StudentManagedBean();

此外,对于没有问题的注入,您应该渲染 Student bean @SessionScoped

【讨论】:

  • 有了您提供的答案,现在终于可以将数据插入数据库,但 index.xhtml 中的 dataTable 仅显示数据库中的最新插入条目,而当我直接签入数据库时​​,它显示实际数据插入。我哪里错了?
  • 很好,这是另一个问题。您能否通过放置一个 SOP 来检查 while 循环是否“循环”(数据库中的记录不止)或没有?
  • 我有 5 列和 2 行。当我将 SOP 放入带有语句的 while 循环中时,resultset.getString("label") 5 次,我的整个记录​​打印了 3 次。
  • 也许你应该在DBQueries类中指定学生托管bean的数组列表的类型:ArrayList&lt;StudentManagedBean&gt; arrayList = new ArrayList&lt;StudentManagedBean&gt;();
  • 我做了,但没有解决问题。 仍然会打印两次最新的行,而它应该打印 2 个不同的行。
猜你喜欢
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多