Reputation: 385
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
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.
Upvotes: 3