无法在JSP中迭代列表

时间:2014-06-05 18:28:33

标签: java jsp java-ee servlets

我试图在JSP中使用表达式语言回答一个问题。我尝试了一些代码,但它无法正常工作。有人可以帮助我吗?

问题 - 来源= How to call servlet on jsp page load

我想打电话给servlet' latest_products'在index.jsp页面的加载。这个servlet在List中有记录。我想将此List传递给index.jsp。但是我不想在url中显示servlet的名称。有什么方法可以做到这一点。

预期输出 - 标题加上三个产品名称的列表。

实际输出 - 仅限标题。

我尝试了什么 -

的Servlet

public class ProductList extends HttpServlet {
    private static final long serialVersionUID = 1L;


    public ProductList() {
        super();
        // TODO Auto-generated constructor stub
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<String> products = new ArrayList<String>();
        products.add("Car");
        products.add("Gun");
        products.add("Shades");

        request.setAttribute("productsList", products);

    }

}

JSP:

<%@ page language="java" contentType="blah..."%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html PUBLIC "blah...">

<html>
<head>
<meta http-equiv="blah...">
</head>
<body>

<c:import url="/ProductList" />

<c:set var="myProducts" scope="request" value="${param.productsList}"/>

<h1>List of products from servlet</h1>
<c:forEach var="product" items= "${myProducts}" varStatus="i">
${product}<br>
</c:forEach>

</body>
</html>

除此之外的一个小问题,当我在Encountered illegal body of tag "c:set" tag, given its attributes标记后面附加</c:set>的c:set标记时,为什么会出现错误</c:foreach>?我认为c:set就像一个带有范围的代码块。但是,它似乎不是。

感谢。

1 个答案:

答案 0 :(得分:2)

尝试

<c:set var="myProducts" value="${requestScope.productsList}" />

<c:set var="myProducts" scope="request" value="${productsList}" />

而不是

<c:set var="myProducts" scope="request" value="${param.productsList}" />

从请求范围获取属性值。只有请求参数在隐式对象param中可用。您无法使用隐式对象param访问请求属性


  

为什么我会收到错误标记c:set标记的非法主体,当我在</c:set>标记后面附加</c:foreach>的c:set标记时,会给出其属性?

因为它已经关闭,如下所示(在末尾看一个斜线),c:set没有开始标记。

<c:set var="myProducts" scope="request" value="${param.productsList}"/>

修改

<c:import url="/ProductList" /><jsp:include page="/ProductList" />是GET请求,它们将调用Servlet的doGet()方法,并且根据您的代码为空,这就是JSP页面上没有显示任何内容的原因。

doPost()方法调用doGet()方法或提供doGet()方法的实现。