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

2021/01/16 15:11 · java ·  · 0评论

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

我该如何实现?

在设计良好的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工作并返回一个nice 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文件中/WEB-INF/products.jsp,使用JSTL <c:forEach>进行迭代,List<Product>EL by${products}中使之可用,并使用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

也可以看看:

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

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

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

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

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

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

好吧,你没有。

MVC的要点是以这样的方式将模型(在这种情况下M DB信息)与视图(在这种情况下为V jsp 分开,从而可以在不影响应用程序的情况下更改视图。

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

因此,基本上,您有了JSP文件,获取请求参数,然后从DAO调用方法。dao在内部具有连接到db并获取数据的方法,并建立了DTO的集合,这些集合将返回给JSP进行渲染。

像这样的极端简化(和不安全)的代码:

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 > 标签

您可以在以下链接示例使用中找到详细的示例

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

本文地址:http://java.askforanswer.com/shiyongmvchedaomoshizaijspyemiandehtmlzhongxianshijdbc-resultset.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!