【问题标题】:List value is printing address instead of value列表值是打印地址而不是值
【发布时间】:2016-02-26 13:27:08
【问题描述】:

我有以下 DAO 文件。

package org.DAO;

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

import javax.servlet.RequestDispatcher;

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

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

    public List<UserBean> list() throws Exception {
        List<UserBean> userBeans = new ArrayList<UserBean>();
        try {
            Connection conn = dbConnection.conn;
            Statement stmt = dbConnection.stmt;
            ResultSet rs = dbConnection.rs;
            PreparedStatement ps = dbConnection.ps;
            String excelPath = dbConnection.excelPath;
            String queryString = null;
            dbConnection.createClassForName();
            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 [report1448039568905$] where ([Case Owner] = 'SSHD' or [Case Owner] = 'Hyderabad Operations' or [Case Owner] = 'Customer Service- Core')";
            rs = stmt.executeQuery(queryString);
            ResultSetMetaData rsmd = rs.getMetaData();
            int rowCount = rsmd.getColumnCount();
            System.out.println("bno of cols are " + rsmd.getColumnCount());
            for (int i = 0; i < rowCount; i++) {
                System.out.print(rsmd.getColumnName(i + 1) + "  \t");
                System.out.println(rsmd.getColumnTypeName(i + 1));
            }

            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);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return userBeans;
    }
}

还有下面的Servlet

package org.servlet;

import org.DAO.*;
import org.bean.UserBean;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/GetData")
public class GetData extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public GetData() {
        super();
    }

    GetDataDAO getdatadao = null;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // set content type

        try {
            getdatadao = new GetDataDAO();
            List<UserBean> userBeans = getdatadao.list();
            request.setAttribute("userBeans", userBeans);
            request.getRequestDispatcher("DisplayTable.jsp").forward(request, response);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

在这里,我尝试使用以下代码在 jsp 文本框中打印第一个值 (caseNumber)。

<body>
    <table border=2 width="45%">
        <tr>
            <td colspan="2" align="center"><b>Comedy Movies</b></td>
        </tr>
        <tr>

            <td><b>Title</b></td>
            <td><b>Description</b></td>
        </tr>

        <tr>
            <td>Case Number</td>
            <td><c:out value="${userBeans[0].toString()}" /></td>
        </tr>
    </table>
</body>

但我得到的输出如下。

org.bean.UserBean@16c8f41

但不是这个,我需要那里的确切值。请让我知道我哪里出错了,我该如何解决。

【问题讨论】:

  • 确切的值是什么? UserBean 有 7 个我们知道的属性。您正在调用 toString() 。这将调用... toString()。所以如果你没有重写 toString(),它将默认为 Object 的 toString() 实现。如果要显示 UserBean 的案例编号,请使用...userBeans[0].caseNumber,而不是userBeans[0].toString()
  • 说真的,休息一下,阅读一本不错的 Java 书籍/教程,然后阅读 JSP/JavaEE 书籍/教程。

标签: java jstl


【解决方案1】:

您必须覆盖ÙserBean 中的toString() 方法。否则将调用默认的toString 方法。例如

@Override
public String toString() {
    return this.caseNumber + " " + this.caseOwner;
}

某些 IDE(eclipse、intellij、...)具有创建 toString 方法的快捷方式。例如在 Eclipse 中是

right click -> source -> generate toString()...

【讨论】:

  • 嗨,我的 Bean 课上有这个,你想让我也用那个课更新我的问题吗?
  • 请。但只需提供所需的最少代码(例如,不是 getter 和 setter)
  • 嗯?你为什么不告诉 OP 简单地使用${userBeans[0].caseNumber}
  • 我可能不会推荐这种方法,因为用户 Bean 可能具有某些特定目的,其中可能包含用户特定的详细信息。因此,覆盖 toString 方法只会给出案例编号,可能不适用于未来的增强功能,因为您正在增加对 toString 方法的依赖
  • 如果他只想要 caseNumber 属性,使用 getter 会更好。但toString() 的目的不是返回单个属性,而是返回对象的字符串表示形式。我的例子太简单了,我会编辑它。
【解决方案2】:

您的对象是 List&lt;UserBean&gt; userBeans 类型,并且您正试图从 userBeans[0].toString() 获取值,这显然会为您提供 List 中第一个元素的哈希码。

如果您想从列表中的用户 bean 获取案例编号的值,您可能应该使用 userBeans[0].getCaseNumber(); 我假设您有案例编号的吸气剂。

【讨论】:

  • 嗨,谢谢你,这正是我想要的。再次感谢!
  • @user3872094 如果您觉得有用,请考虑接受答案。
  • 我有一个小问题,有没有一种方法可以让我以数组的形式得到它,即用 userBeans[0].getCaseNumber(); 代替 userBeans[0].get[0]; 之类的东西?
  • 是的,您可以将整个数组设置为属性并使用forEach jsp scriptlet,这个问题会对您有所帮助..stackoverflow.com/questions/15839335/…
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多