Java 用空值填充文本框

Java 用空值填充文本框,java,jdbc,dao,Java,Jdbc,Dao,我正在写一个Webapp,其中有一些数据必须从数据库中提取并显示在文本框中。一切正常。但是如果(!rs.next()),我需要在这些文本框中将值显示为无可用数据,目前我正在尝试下面的代码 package org.DAO; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.S

我正在写一个Webapp,其中有一些数据必须从数据库中提取并显示在文本框中。一切正常。但是如果(!rs.next()),我需要在这些文本框中将值显示为
无可用数据
,目前我正在尝试下面的代码

package org.DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.bean.UserBean;
import org.code.general.DBConnection;
import org.code.general.GetTheUserDetails;

public class GetDataDAO {
    DBConnection dbConnection = new DBConnection();
    GetTheUserDetails getTheUserDetails = new GetTheUserDetails();

    public List<UserBean> list(String systemUserName) throws Exception {

        List<UserBean> userBeans = new ArrayList<UserBean>();
        try {

            Connection conn = dbConnection.getConn();
            Statement stmt = dbConnection.getStmt();
            ResultSet rs = dbConnection.getRs();
            String excelPath = dbConnection.getExcelPath();
            String queryString = null;
            dbConnection.createClassForNameForExcel();
            conn = DriverManager.getConnection(
                    "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=" + excelPath + "; READONLY=FALSE;");
            System.out.println("Connecting to database…");
            System.out.println("Oracle JDBC Driver Registered!");
            if (conn != null) {
                System.out.println("You made it, take control your database now!");
            } else {
                System.out.println("Failed to make connection!");
            }
            stmt = conn.createStatement();
            queryString = "Select * from [" + dbConnection.getSheetPath()
                    + "$] where STATE IS NULL and [Case Owner] = '"
                    + getTheUserDetails.getUserNameDetails(systemUserName) + "'";
            System.out.println("Query is " + queryString);
            rs = stmt.executeQuery(queryString);
            ResultSetMetaData rsmd = rs.getMetaData();
            System.out.println("bno of cols are " + rsmd.getColumnCount());
            while (rs.next()) {
                if (rs.next()) {
                    UserBean userBean = new UserBean();
                    userBean.setCaseNumber(rs.getString(1));
                    userBean.setCaseOwner(rs.getString(2));
                    userBean.setStatus(rs.getString(4));
                    userBean.setIssue(rs.getString(5));
                    userBean.setReason(rs.getString(6));
                    userBean.setDateOpened(rs.getString(7));
                    userBean.setAge(rs.getInt(8));
                    userBeans.add(userBean);
                } else {
                    UserBean userBean = new UserBean();
                    userBean.setCaseNumber("None");
                    userBean.setCaseOwner("None");
                    userBean.setStatus("None");
                    userBean.setIssue("None");
                    userBean.setReason("None");
                    userBean.setDateOpened("None");
                    userBean.setAge(Integer.parseInt("None"));
                    userBeans.add(userBean);
                }
            }

            rs.close();
            conn.commit();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return userBeans;
    }
}
请让我知道我哪里出了问题,我怎样才能解决这个问题

谢谢

在jsp中,检查bean是否为空,然后在文本框下检查
没有可用数据。理想情况下,您应该在servlet或控制器中完成,因为jsp应该尽可能轻


在jsp中,检查bean是否为空,然后在文本框下检查
没有可用数据。理想情况下,您应该在servlet或控制器中执行此操作,因为jsp应该尽可能轻

每次迭代代码都会跳过一行:

while (rs.next()) {
    if (rs.next())
如果结果集为0或1行,则只需使用
rs.next()

此外:

  • conn
    上的
    null
    检查是多余的,因为如果失败会抛出异常
  • 使用try with resources确保总是发布
    连接
    语句
    结果集

代码在每次迭代中跳过一行:

while (rs.next()) {
    if (rs.next())
如果结果集为0或1行,则只需使用
rs.next()

此外:

  • conn
    上的
    null
    检查是多余的,因为如果失败会抛出异常
  • 使用try with resources确保总是发布
    连接
    语句
    结果集

公共布尔下一步()

将光标移动到下一行。如果结果集中没有更多行,此方法将返回false

因此,当您两次调用
rs.next()
时,一次在
while
中调用,一次在
if
中调用,每次都会错过一行


尝试删除
如果
条件

公共布尔下一步()

将光标移动到下一行。如果结果集中没有更多行,此方法将返回false

因此,当您两次调用
rs.next()
时,一次在
while
中调用,一次在
if
中调用,每次都会错过一行


尝试删除
如果
条件

如果行为空,则必须具有如下逻辑:

        rs = stmt.executeQuery(queryString);
        ResultSetMetaData rsmd = rs.getMetaData();

        System.out.println("bno of cols are " + rsmd.getColumnCount());

        while (rs.next()) {
                UserBean userBean = new UserBean();
                userBean.setCaseNumber(rs.getString(1));
                userBean.setCaseOwner(rs.getString(2));
                userBean.setStatus(rs.getString(4));
                userBean.setIssue(rs.getString(5));
                userBean.setReason(rs.getString(6));
                userBean.setDateOpened(rs.getString(7));
                userBean.setAge(rs.getInt(8));
                userBeans.add(userBean);
        }
        if(userBeans.size() == 0) {
                UserBean userBean = new UserBean();
                userBean.setCaseNumber("None");
                userBean.setCaseOwner("None");
                userBean.setStatus("None");
                userBean.setIssue("None");
                userBean.setReason("None");
                userBean.setDateOpened("None");
                userBean.setAge(Integer.parseInt("None"));
                userBeans.add(userBean);
        }

        rs.close();
        conn.commit();
        conn.close();
但是如果行不是空的,只是包含空值,那么您可以有如下逻辑:

        rs = stmt.executeQuery(queryString);
        ResultSetMetaData rsmd = rs.getMetaData();
        System.out.println("bno of cols are " + rsmd.getColumnCount());

        while (rs.next()) {
                UserBean userBean = new UserBean();
                String value = rs.getString(1) == null ? "None" : rs.getString(1);
                // you do this for all the columns, from 1 to 8
                userBean.setCaseNumber(rs.getString(1));
                userBean.setCaseOwner(rs.getString(2));
                userBean.setStatus(rs.getString(4));
                userBean.setIssue(rs.getString(5));
                userBean.setReason(rs.getString(6));
                userBean.setDateOpened(rs.getString(7));
                userBean.setAge(rs.getInt(8));
                userBeans.add(userBean);
        }

        rs.close();
        conn.commit();
        conn.close();

如果行为空,则必须具有如下逻辑:

        rs = stmt.executeQuery(queryString);
        ResultSetMetaData rsmd = rs.getMetaData();

        System.out.println("bno of cols are " + rsmd.getColumnCount());

        while (rs.next()) {
                UserBean userBean = new UserBean();
                userBean.setCaseNumber(rs.getString(1));
                userBean.setCaseOwner(rs.getString(2));
                userBean.setStatus(rs.getString(4));
                userBean.setIssue(rs.getString(5));
                userBean.setReason(rs.getString(6));
                userBean.setDateOpened(rs.getString(7));
                userBean.setAge(rs.getInt(8));
                userBeans.add(userBean);
        }
        if(userBeans.size() == 0) {
                UserBean userBean = new UserBean();
                userBean.setCaseNumber("None");
                userBean.setCaseOwner("None");
                userBean.setStatus("None");
                userBean.setIssue("None");
                userBean.setReason("None");
                userBean.setDateOpened("None");
                userBean.setAge(Integer.parseInt("None"));
                userBeans.add(userBean);
        }

        rs.close();
        conn.commit();
        conn.close();
但是如果行不是空的,只是包含空值,那么您可以有如下逻辑:

        rs = stmt.executeQuery(queryString);
        ResultSetMetaData rsmd = rs.getMetaData();
        System.out.println("bno of cols are " + rsmd.getColumnCount());

        while (rs.next()) {
                UserBean userBean = new UserBean();
                String value = rs.getString(1) == null ? "None" : rs.getString(1);
                // you do this for all the columns, from 1 to 8
                userBean.setCaseNumber(rs.getString(1));
                userBean.setCaseOwner(rs.getString(2));
                userBean.setStatus(rs.getString(4));
                userBean.setIssue(rs.getString(5));
                userBean.setReason(rs.getString(6));
                userBean.setDateOpened(rs.getString(7));
                userBean.setAge(rs.getInt(8));
                userBeans.add(userBean);
        }

        rs.close();
        conn.commit();
        conn.close();

我认为调用
rs.next()
两次不是一个好主意。这将导致不显示第一个值,因为您跳过了它。其次,如果数据库不包含任何值,则不应指向新行。您是说这些值只是null,但行存在吗?我只是担心行是空的,然后循环中的逻辑将无法工作。此外,如果
rs.next()
为false,这意味着您无法创建空的UsesrBean。您必须在while循环之外执行此操作。您好@JernejK,我是否应该删除
while(rs.next())
,并保留
,如果不是这样的话
?视情况而定。数据库是否返回一个实例,只是所有行都为空?或者这是否意味着该表根本不包含行?因为如果表不包含任何行,“rs.next()”方法将始终为false。您甚至不会执行if-else,因为它甚至无法进入while循环。我认为调用
rs.next()
两次不是一个好主意。这将导致不显示第一个值,因为您跳过了它。其次,如果数据库不包含任何值,则不应指向新行。您是说这些值只是null,但行存在吗?我只是担心行是空的,然后循环中的逻辑将无法工作。此外,如果
rs.next()
为false,这意味着您无法创建空的UsesrBean。您必须在while循环之外执行此操作。您好@JernejK,我是否应该删除
while(rs.next())
,并保留
,如果不是这样的话
?视情况而定。数据库是否返回一个实例,只是所有行都为空?或者这是否意味着该表根本不包含行?因为如果表不包含任何行,“rs.next()”方法将始终为false。你甚至不会执行if-else,因为它甚至无法进入while循环。很高兴我的第一个代码帮助了你。享受编写更多代码的乐趣:)很高兴我的第一个代码确实帮助了您。享受编码的乐趣更多:)