在JSP页面上创建JSTL表 - 在JSP中没有数据

时间:2014-01-27 13:56:51

标签: jsp servlets foreach jstl

我正在尝试创建一个包含不同大小的表的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上找不到产品吗?

2 个答案:

答案 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 ELJSTL,并使用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”是否“产品”可用。