使用 MVC 和 DAO 模式在 JSP 页面中以 HTML 格式显示 JDBC 结果集

我正在使用JSP和JDBC实现MVC。我已将数据库类文件导入到我的 JSP 文件中,并且我想显示数据库表的数据。我不知道我应该如何将 Java 类返回到 JSP 页面并将其嵌入到 HTML 中。ResultSet

我怎样才能做到这一点?


答案 1

在设计良好的 MVC 方法中,JSP 文件不应包含任何 Java 代码行,并且 servlet 类不应包含任何 JDBC 代码行。

假设您要在网店中显示产品列表,则需要创建以下代码。

  • 一个表示产品的真实实体的类,它应该只是一个JavabeanProduct

    public 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<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;
        }
    
    }
    
  • 一个 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 文件,其中使用 JSTL 来循环访问 EL 中可用的 JSP 文件,并使用 JSTL 转义字符串属性,以避免在涉及用户控制的输入时出现 XSS 漏洞。/WEB-INF/products.jsp<c:forEach>List<Product>${products}<c:out>

    <%@ 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

另请参阅:


答案 2

在 Web 应用程序上下文中,MVC 不包括使用 JSP 中的类。它包括使用以下模型:

  1. 浏览器向 Web 服务器发送请求
  2. Web服务器配置为由servlet或过滤器处理请求(控制器:Java代码,而不是JSP代码)
  3. servlet/filter通常根据配置/注释将请求分派给特定类(称为Action,控制器的特定部分)
  4. 该操作执行业务逻辑(即从示例中的数据库获取数据:模型)
  5. 该操作将请求转发到 JSP。JSP的作用只是生成HTML代码(即显示您的数据:视图)

由于 JSP 通常使用 JSP 标记(例如 JSTL)和 JSP 表达式语言,并且由于 JSP 标记和 EL 旨在从 JavaBeans 获取信息,因此您最好以 JavaBeans 或 JavaBean 集合的形式提供数据。

因此,控制器(操作类)的作用是获取数据,以适合 JSP 的格式创建包含数据的 JavaBean 实例,将它们放在请求属性中,然后调度到 JSP。然后,JSP 将循环访问 JavaBean 实例并显示它们包含的内容。

您不应自己实现 MVC 框架。使用现有的(条纹,支柱等)