在JSP中显示数据库结果

时间:2010-11-16 16:06:44

标签: jsp servlets

我有一个控制器servlet,它将请求转发给模型servlet。当模型从数据库获取结果时,我将它转发给jsp.I我不知道在jsp中要写什么,因为它需要显示customerList的表。这是我的模型servlet的一部分:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
{
    Connection connection = getDatabaseConnection();
    request.setAttribute("customerList", getCustomerList(connection));
    closeDatabaseConnection(connection);
}

private Vector<Customer> getCustomerList(Connection con)
{
    String sqlStr =
            "SELECT * " +
            "FROM Customer " +
            "ORDER BY Name";
    PreparedStatement stmt = null;
    ResultSet rs = null;
    Vector<Customer> customers = new Vector<Customer>();

    try
    {
        stmt = con.prepareStatement(sqlStr);
        rs = stmt.executeQuery();

        while (rs.next())
        {
            Customer customer = new Customer();
            customer.setId(rs.getInt("Id"));
            customer.setName(rs.getString("Name"));
            customer.setAddress(rs.getString("Address"));

            customers.add(customer);
        }

        rs.close();
        stmt.close();
    }
    catch (SQLException sqle)
    {
        sqle.printStackTrace();
    }
    finally
    {
        return customers;
    }

1 个答案:

答案 0 :(得分:3)

使用JSTL c:forEach标记。如果您的servletcontainer不支持它(例如Tomcat),那么您需要将jstl-1.2.jar放在/WEB-INF/lib中。然后根据其文档在JSP页面顶部声明JSTL core taglib

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

然后,您可以在JSP中使用任何JSTL核心标记。您已在请求范围中使用属性名称Vector<Customer>放置List<Customer> customers = new ArrayList<Customer>()(eek,遗留类...而非使用customerList)。所以EL ${customerList}可以使用它。将其提供给items的{​​{1}}属性并相应地呈现<c:forEach>

<table>

<table> <c:forEach items="${customerList}" var="customer"> <tr> <td><c:out value="${customer.id}" /></td> <td><c:out value="${customer.name}" /></td> <td><c:out value="${customer.address}" /></td> </tr> </c:forEach> </table> 不是必需的,但如果涉及用户控制的输入则有用,因为它可以防止XSS攻击。

也就是说,你的JDBC部分可以做得更好。在例外的情况下,它仍然对资源泄漏很敏感。

另见: