kamweshi
kamweshi

Reputation: 385

Displaying database result in JSP

I have a controller servlet which forward the request to the model servlet.Now when the model gets the results from the database, I am forwarding it to the jsp.I am not sure what to write in the jsp because it need to show a table of customerList.here is part of my model 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;
    }

Upvotes: 1

Views: 2716

Answers (1)

BalusC
BalusC

Reputation: 1108722

Use JSTL c:forEach tag. If your servletcontainer doesn't support it (e.g. Tomcat), then you need to drop jstl-1.2.jar in /WEB-INF/lib. Then declare the JSTL core taglib in top of JSP page as per its documentation.

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

Then you can use any of the JSTL core tags in the JSP. You've put a Vector<Customer> (eek, a legacy class .. rather use List<Customer> customers = new ArrayList<Customer>() instead) in the request scope with the attribute name customerList. So it's available by ${customerList} in EL. Feed it to the items attribute of <c:forEach> and render a <table> accordingly.

<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>
            

The <c:out> is by the way not necessary, but useful if it concerns user-controlled input since it prevents XSS attacks.

That said, your JDBC part can be done better. It's still sensitive to resource leaking in case of exceptions.

See also:

Upvotes: 3

Related Questions