使用 MVC 和 DAO 模式在 JSP 页面中以 HTML 格式显示 JDBC 结果集
我正在使用JSP和JDBC实现MVC。我已将数据库类文件导入到我的 JSP 文件中,并且我想显示数据库表的数据。我不知道我应该如何将 Java 类返回到 JSP 页面并将其嵌入到 HTML 中。ResultSet
我怎样才能做到这一点?
我正在使用JSP和JDBC实现MVC。我已将数据库类文件导入到我的 JSP 文件中,并且我想显示数据库表的数据。我不知道我应该如何将 Java 类返回到 JSP 页面并将其嵌入到 HTML 中。ResultSet
我怎样才能做到这一点?
在设计良好的 MVC 方法中,JSP 文件不应包含任何 Java 代码行,并且 servlet 类不应包含任何 JDBC 代码行。
假设您要在网店中显示产品列表,则需要创建以下代码。
一个表示产品的真实实体的类,它应该只是一个Javabean。Product
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);
}
}
}
最后是一个 JSP 文件,其中使用 JSTL 来循环访问 EL 中可用的 JSP 文件,并使用 JSTL 转义字符串属性,以避免在涉及用户控制的输入时出现 XSS 漏洞。/WEB-INF/products.jsp
<c:forEach>
List<Product>
${products}
<c:out>
<%@ 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 中的类。它包括使用以下模型:
由于 JSP 通常使用 JSP 标记(例如 JSTL)和 JSP 表达式语言,并且由于 JSP 标记和 EL 旨在从 JavaBeans 获取信息,因此您最好以 JavaBeans 或 JavaBean 集合的形式提供数据。
因此,控制器(操作类)的作用是获取数据,以适合 JSP 的格式创建包含数据的 JavaBean 实例,将它们放在请求属性中,然后调度到 JSP。然后,JSP 将循环访问 JavaBean 实例并显示它们包含的内容。
您不应自己实现 MVC 框架。使用现有的(条纹,支柱等)