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

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

我怎样才能做到这一点?

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

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

  • 代表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. } 
  • 一个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("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>转义string属性,以避免在涉及用户控制的input时出现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代码?
  • doGet和doPost在Servlets中
  • 我应该如何在基于servlet的应用程序中连接到JDBC数据库/数据源?
  • devise模式基于Web的应用程序
  • RequestDispatcher.forward()vs HttpServletResponse.sendRedirect()
  • 如何将未知数量的列的ResultSet映射到List并将其显示在HTML表格中?
  • 如何通过单击JSP页面中的超链接或button将当前项传递给Java方法?

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

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

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

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

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

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

那么,你没有。

MVC的意义在于,从您的视图( V a jsp,在这种情况下)中分离您的模型(在这种情况下是M DB信息),以这种方式您可以在不制动的情况下更改视图。

要做到这一点,你可以使用一个中间对象来表示你的数据(通常称为DTO – 在数据传输对象后,不知道他们如何称呼它)和其他对象来获取它(通常是一个DAO)。

所以基本上你有你的JSP文件,获取请求参数,然后从DAO调用一个方法。 dao在内部具有连接到数据库并获取数据的手段,并构build了一组返回到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> 

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

您可以使用 <c:forEach > 标记

您可以在以下链接示例使用中find详细示例

我认为将表的数据包含到列表等集合中会更好,并从Java类返回列表并在JSP中重用此集合。