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

新手上路,请多包涵

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

我怎样才能做到这一点?

原文由 Ashwani Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 348
1 个回答

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

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

  • 一个 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.
  }

  • 一个 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);
          }
      }

  }

  • Finally a JSP file in /WEB-INF/products.jsp which uses JSTL <c:forEach> to iterate over List<Product> which is made available in EL by ${products} , and uses 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。 Provided that the servlet is annotated @WebServlet("/products") or mapped in web.xml with <url-pattern>/products</url-pattern> , then you can call it by http://example.com/contextname/products

也可以看看:

原文由 BalusC 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题