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

Java 使用MVC和DAO模式在JSP页面中以HTML显示JDBC结果集,java,jsp,servlets,model-view-controller,jdbc,Java,Jsp,Servlets,Model View Controller,Jdbc,我正在使用JSP和JDBC实现MVC。我已经将一个数据库类文件导入到我的JSP文件中,我想显示一个DB表的数据。我不知道如何将Java类中的ResultSet返回到JSP页面并将其嵌入HTML中 如何实现这一点?您可以使用标记 您可以在下面的链接中找到一个详细的示例,您可以使用标签 您可以在下面的链接中找到一个详细的示例,MVC在web应用程序上下文中不包括使用JSP中的类。它包括使用以下模型: 浏览器向web服务器发送请求 web服务器的配置使请求由servlet或过滤器(控制器:Java代码

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


如何实现这一点?

您可以使用
标记


您可以在下面的链接中找到一个详细的示例,您可以使用标签


您可以在下面的链接中找到一个详细的示例,MVC在web应用程序上下文中不包括使用JSP中的类。它包括使用以下模型:

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

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


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

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

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

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


    您不应该自己实现MVC框架。使用现有的代码(Stripes、Struts等)

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

    假设您希望在webshop中显示产品列表,则需要创建以下代码

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

    • 一个完成所有讨厌的JDBC工作并返回一个漂亮的
      列表的类

    要让它工作,只需通过其URL调用servlet。如果servlet被注释为
    @WebServlet(“/products”)
    ,或者在
    web.xml
    中映射为
    /products
    ,那么您可以通过
    http://example.com/contextname/products

    另见:

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

        假设您希望在webshop中显示产品列表,则需要创建以下代码

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

        • 一个完成所有讨厌的JDBC工作并返回一个漂亮的
          列表的类

        要让它工作,只需通过其URL调用servlet。如果servlet被注释为
        @WebServlet(“/products”)
        ,或者在
        web.xml
        中映射为
        /products
        ,那么您可以通过
        http://example.com/contextname/products

        另见:
        我不知道如何将结果集从类文件返回到JSP页面

        嗯,你没有

        MVC的目的是将您的模型(在本例中是MDB信息)与您的视图(Vjsp,在本例中)分离开来,这样您就可以在不停止应用程序的情况下更改视图

        为此,您可以使用一个中间对象来表示您的数据(通常称为DTO—在数据传输对象之后—不知道他们现在如何调用它),并使用另一个对象来获取数据(通常是DAO)

        因此,基本上您拥有JSP文件,获取请求参数,然后从DAO调用一个方法。dao内部有连接到db an的方法
        public class Product {
        
            private Long id; 
            private String name;
            private String description;
            private BigDecimal price;
        
            // Add/generate getters/setters/c'tors/equals/hashcode boilerplate.
        }
        
        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;
            }
        
        }
        
        @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);
                }
            }
        
        }
        
        class Employee {
           String name;
           int emplid;
        }
        
        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;
            }
        }
        
        <%
           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>