我正在使用 JSP 和 JDBC 实现 MVC。我已将数据库类文件导入到 JSP 文件中,并且想显示数据库表的数据。我不知道如何将 ResultSet
从 Java 类返回到 JSP 页面并将其嵌入 HTML 中。
我怎样才能实现这个目标?
最佳答案
在设计良好的 MVC 方法中,JSP 文件不应包含任何 Java 代码行,servlet 类不应包含任何 JDBC 代码行。
假设您要在网上商店中显示产品列表,则需要创建以下代码。
A
Product
代表产品的现实世界实体的类,它应该只是一个 Javabean .public class Product { private Long id; private String name; private String description; private BigDecimal price; // Add/generate getters/setters/c'tors/equals/hashcode boilerplate. }
A DAO类,它完成所有讨厌的 JDBC 工作并返回一个不错的
List<Product>
.public 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; } }
A servlet获取列表并将其放入请求范围的类。
@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); } } }
最后一个 JSP文件在
/WEB-INF/products.jsp
它使用 JSTL<c:forEach>
迭代List<Product>
可在 EL 中找到通过${products}
,并使用 JSTL<c:out>
转义字符串属性以避免 XSS当涉及用户控制的输入时存在漏洞。<%@ 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被注释为@WebServlet("/products")
或映射于 web.xml
与 <url-pattern>/products</url-pattern>
,那么你可以通过 http://example.com/contextname/products
来调用它
另请参阅:
- How to avoid Java code in JSP files?
- doGet and doPost in Servlets
- How should I connect to JDBC database / datasource in a servlet based application?
- Design Patterns web based applications
- RequestDispatcher.forward() vs HttpServletResponse.sendRedirect()
- How to map a ResultSet with unknown amount of columns to a List and display it in a HTML table?
- How do I pass current item to Java method by clicking a hyperlink or button in JSP page?
关于java - 使用 MVC 和 DAO 模式在 JSP 页面中的 HTML 中显示 JDBC 结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58731916/