java - 使用 MVC 和 DAO 模式在 JSP 页面中的 HTML 中显示 JDBC 结果集

标签 java jsp servlets model-view-controller jdbc

我正在使用 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 来调用它

另请参阅:

关于java - 使用 MVC 和 DAO 模式在 JSP 页面中的 HTML 中显示 JDBC 结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58731916/

相关文章:

Java - 复制 Jar 文件夹

java - JSP父/子参数操作

java - 如何将 JavaScript 数组发送到表单标签内的 Servlet?

java - JSTL - 循环遍历表格行并在每偶数行设置背景颜色

java - spring中的model和session有什么区别

java - ISODateTimeFormat 格式化程序在高并发情况下性能好吗?

java - Java线程和异常?

java - 无法在 intellij 中执行 javaagent - 为我的代理类获取 ClassNotFoundException

java - 检索数据库中插入的最后一行

java - 添加上下文路径后,Servlet 给出 404