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;
}
Use JSTL
c:forEachtag. 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.Then you can use any of the JSTL core tags in the JSP. You’ve put a
Vector<Customer>(eek, a legacy class .. rather useList<Customer> customers = new ArrayList<Customer>()instead) in the request scope with the attribute namecustomerList. So it’s available by${customerList}in EL. Feed it to theitemsattribute of<c:forEach>and render a<table>accordingly.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: