我正在尝试创建一个包含不同大小的表的JSP主页。我想使用forEach JSTL标记。 servlet正常工作,并生成两个产品的列表。但是,此信息不会出现在最终的HTML中。
如果我打电话:
http://localhost:8080/JavaIntoJSP/products
输出很好。
如果我打电话:
http://localhost:8080/JavaIntoJSP/default.jsp
输出缺失
代码如下(default.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix= "c" %>
<!DOCTYPE html>
<html>
<head>
<title>default</title>
</head>
<body>
<form action="products" method="get">
<table>
<c:forEach items="${products}" var="product" >
<tr>
<td><c:out value="${product.name}" /></td>
<td><c:out value="${product.price}" /></td>
<td><c:out value="${product.category}" /></td>
<td><c:out value="${product.units}" /></td>
</tr>
</c:forEach>
</table>
</form>
<h1>try again</h1>
</body>
</html>
Servlet具有以下内容
@WebServlet("/products")
public class ProductServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ProductServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Product> products = new ArrayList<Product>();
Product prod1 = new Product();
prod1 = prod1.returnProduct();
products.add(prod1);
Product prod2 = new Product();
prod2 = prod2.returnProduct();
prod2 = prod2.returnProduct();
products.add(prod2);
request.setAttribute("products", products);
request.getRequestDispatcher("default.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
有人可以告诉我为什么在JSP上找不到产品吗?
答案 0 :(得分:2)
http://localhost:8080/JavaIntoJSP/products
它会调用填充ProductServlet
列表的products
并转发到default.jsp
http://localhost:8080/JavaIntoJSP/default.jsp
如果您直接致电default.jsp
,则products
列表将为null
&amp;因为你不能在屏幕上看到任何输出。
通过评论回答你的问题
不要在JSP 中编写scriptlet <% %>
,因为scriptlet不应该在JSP中使用超过十年。学习JSP EL,JSTL,并使用servlet获取Java代码。 How to avoid Java Code in JSP-Files?
使用empty
operator检查products
列表是null
并清空。
EL中没有if-else
,因此您必须使用<c:choose><c:when>...
<c:choose>
<c:when test="${!empty products}">
//print the list
</c:when>
<c:otherwise>
//call the servlet
<jsp:forward page="products"></jsp:forward>
</c:otherwise>
</c:choose>
答案 1 :(得分:0)
http://localhost:8080/JavaIntoJSP/default.jsp
不会调用servlet。因此,您不会将“产品”放入您的请求属性中。
您应该检查“default.jsp”是否“产品”可用。