Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern
我正在使用JSP和JDBC实现MVC。 我已将数据库类文件导入到我的JSP文件中,并且我想显示数据库表的数据。 我不知道如何将
我怎样才能做到这一点?
在设计良好的MVC方法中,JSP文件不应包含任何Java代码行,并且servlet类不应包含任何JDBC代码行。
假设您要在网上商店中显示产品列表,则需要创建以下代码。
-
代表产品的真实世界实体的
Product 类,它应该只是一个Javabean。1
2
3
4
5
6
7
8
9public class Product {
private Long id;
private String name;
private String description;
private BigDecimal price;
// Add/generate getters/setters/c'tors/equals/hashcode boilerplate.
} -
一个DAO类,它执行所有令人讨厌的JDBC工作并返回一个很好的
List 。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30public class ProductDAO {
private DataSource dataSource;
public ProductDAO(DataSource dataSource) {
this.dataSource = dataSource;
}
public List<Product> list() throws SQLException {
List<Product> products = new ArrayList<Product>();
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, name, description, price FROM product");
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
Product product = new Product();
product.setId(resultSet.getLong("id"));
product.setName(resultSet.getString("name"));
product.setDescription(resultSet.getString("description"));
product.setPrice(resultSet.getBigDecimal("price"));
products.add(product);
}
}
return products;
}
} -
一个servlet类,它获取列表并将其放入请求范围。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24@WebServlet("/products")
public class ProductsServlet extends HttpServlet {
@Resource(name="jdbc/YourDB") // For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml.
private DataSource dataSource;
private ProductDAO productDAO;
@Override
public void init() {
productDAO = new ProductDAO(dataSource);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<Product> products = productDAO.list();
request.setAttribute("products", products); // Will be available as ${products} in JSP
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
} catch (SQLException e) {
throw new ServletException("Cannot obtain products from DB", e);
}
}
} -
最后是一个
/WEB-INF/products.jsp 中的JSP文件,它使用JSTL 迭代List ,它在EL中由${products} 提供,并使用JSTL 来转义字符串属性,以避免在涉及时出现XSS漏洞用户控制的输入。1
2
3
4
5
6
7
8
9
10
11
12
13<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/format" prefix="fmt" %>
...
<table>
<c:forEach items="${products}" var="product">
<tr>
<td>${product.id}</td>
<td><c:out value="${product.name}" /></td>
<td><c:out value="${product.description}" /></td>
<td><fmt:formatNumber value="${product.price}" type="currency" currencyCode="USD" /></td>
</tr>
</c:forEach>
</table>
要使其工作,只需通过其URL调用servlet。如果servlet带注释
也可以看看:
- 如何避免JSP文件中的Java代码?
- Servlet中的doGet和doPost
- 我应该如何在基于servlet的应用程序中连接到JDBC数据库/数据源?
- Design Patterns基于Web的应用程序
- RequestDispatcher.forward()vs HttpServletResponse.sendRedirect()
- 如何将具有未知列数的ResultSet映射到List并将其显示在HTML表中?
- 如何通过单击JSP页面中的超链接或按钮将当前项传递给Java方法?
在Web应用程序上下文中,MVC不包括使用JSP中的类。它包括使用以下模型:
由于JSP通常使用JSP标记(例如JSTL)和JSP表达式语言,并且由于JSP标记和EL旨在从JavaBeans获取信息,因此最好以JavaBeans或集合的形式提供数据。 JavaBeans
因此,控制器(操作类)的角色是获取数据,以适当的JSP格式创建包含数据的JavaBean实例,将它们放入请求属性,然后分派到JSP。然后,JSP将遍历JavaBean实例并显示它们包含的内容。
您不应该自己实现MVC框架。使用现有的(Stripes,Struts等)
我不知道如何将ResultSet从类文件返回到JSP页面
好吧,你没有。
MVC的目的是将您的模型(在这种情况下为M DB信息)与您的视图(在本例中为V a jsp)分开,这样您就可以在不制动应用的情况下更改视图。
为此,您可以使用中间对象来表示您的数据(通常称为DTO - 在数据传输对象之后 - ,现在不知道它们如何调用它),以及其他要获取它的对象(通常是DAO)。
所以基本上你有你的JSP文件,获取请求参数,然后从DAO调用一个方法。 dao在内部具有连接到db并获取数据并构建DTO集合的方法,这些DTO集合被返回到JSP进行渲染。
像这样非常简化(和不安全)的代码:
Employee.java
1 2 3 4 |
EmployeeDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class EmployeeDAO { ... method to connect etc. List<Employee> getAllNamed( String name ) { String query ="SELECT name, emplid FROM employee where name like ?"; ResultSet rs = preparedStatement.executeQuery etc etc. List<Employee> results = .... while( rs.hasNext() ) { results.add( new Employee( rs.getString("name"), rs.getInt("emplid"))); } // close resources etc return results; } } |
employee.jsp
1 2 3 4 5 6 7 8 | <% request.setAttribute("employees", dao.getAllNamed( request.getParameter("name") ); %> <table> <c:forEach items="${employees}" var="employee"> <tr><td>${employee.emplid}</td><td>${employee.name}</td></tr> </c:forEach> </table> |
我希望这会给你一个更好的主意。
我认为将表的数据包含到列表等集合中并从Java类返回列表并在JSP中重用此集合会更好。
您可以使用
您可以在以下链接示例中找到详细示例