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

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

我怎样才能做到这一点?


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

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

  • 代表Product真实世界实体的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.
    }
    
  • 一个执行所有令人讨厌的JDBC工作并返回一个很好的List<Product>的DAO类。

    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("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 <c:forEach>遍历由EL中的${products}提供的List<Product> ,并使用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

    也可以看看:

  • 如何避免JSP文件中的Java代码?
  • Servlet中的doGet和doPost
  • 我应该如何在基于servlet的应用程序中连接到JDBC数据库/数据源?
  • Design Patterns基于Web的应用程序
  • RequestDispatcher.forward()vs HttpServletResponse.sendRedirect()
  • 如何将具有未知数量列的ResultSet映射到List并将其显示在HTML表中?
  • 如何通过单击JSP页面中的超链接或按钮将当前项目传递给Java方法?

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

  • 浏览器向Web服务器发送请求
  • Web服务器被配置为使得请求由servlet或过滤器处理(控制器:Java代码,而不是JSP代码)
  • servlet /过滤器通常根据配置/注释将请求分派到特定的类(称为Action,控制器的特定部分)
  • 该动作执行业务逻辑(即从您的示例中的数据库中获取数据:模型)
  • 该操作将请求转发给JSP。 JSP的作用仅仅是生成HTML代码(即显示数据:视图)
  • 由于JSP通常使用JSP标记(例如JSTL)和JSP表达式语言,并且由于JSP标记和EL旨在从JavaBeans获取信息,因此最好以JavaBeans或集合的形式提供数据的JavaBeans。

    控制器(操作类)的作用是获取数据,创建包含数据的JavaBean实例,并以合适的格式存储在JSP中,将它们放入请求属性中,然后分派给JSP。 JSP将遍历JavaBean实例并显示它们包含的内容。

    你不应该自己实现MVC框架。 使用现有的(Stripes,Struts等)


    我不知道应该如何将ResultSet从类文件返回到JSP页面

    那么,你没有。

    MVC的要点是从你的视图( V a jsp,在这种情况下)中分离你的模型(在这种情况下是M DB信息),以这种方式你可以在不制动的情况下改变视图到应用程序。

    为此,您可以使用中间对象来表示数据(通常称为DTO - 数据传输对象之后,不知道他们如何称呼它),以及其他对象来获取它(通常是DAO)。

    所以基本上你有你的JSP文件,获取请求参数,然后调用DAO中的方法。 dao在内部具有连接到数据库并获取数据的方法,并构建了一组返回到JSP进行呈现的DTO。

    像这样非常简化(和不安全)的代码:

    Employee.java

    class Employee {
       String name;
       int emplid;
    }
    

    EmployeeDAO.java

    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

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

    我希望这给你一个更好的主意。

    链接地址: http://www.djcxy.com/p/13357.html

    上一篇: Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern

    下一篇: What is the difference between JSF, Servlet and JSP?