【问题标题】:Cannot iterate list inside JSP无法在 JSP 中迭代列表
【发布时间】:2014-07-26 21:10:20
【问题描述】:

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

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

我想在加载 index.jsp 页面时调用一个 servlet 'latest_products'。这个 servlet 在 List 中有记录。我想将此列表传递给 index.jsp。但我不想在 url 中显示 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>

除此之外还有一个小问题,当我在&lt;/c:foreach&gt; 标记之后用&lt;/c:set&gt; 括起c:set 标记时,为什么会出现错误Encountered illegal body of tag "c:set" tag, given its attributes?我认为 c:set 就像一个具有范围的代码块。但是,好像没有。

谢谢。

【问题讨论】:

    标签: java jsp jakarta-ee servlets


    【解决方案1】:

    试试

    <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 访问请求属性


    当我在&lt;/c:foreach&gt; 标记之后用&lt;/c:set&gt; 括起c:set 标记时,为什么我会收到错误遇到非法标记体c:set 标记?

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

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

    编辑

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

    要么从doGet()方法调用doPost()方法,要么提供doGet()方法的实现。

    【讨论】:

    • 谢谢。抱歉,我忘了提,即使 c:set 的开始标记末尾没有斜杠,我仍然收到该错误。我想知道为什么。所以,这个 c:set 东西不像是一个具有可变范围的代码块?
    • 因为c:set 不支持任何body。它说Validation error messages from TagLibraryValidator - illegal body of tag "c:set" tag
    • 谢谢。是的,param 来自一个 html 表单。我的错。但是,我使用了您提供的两种方法,但我仍然没有得到我的产品清单。请帮我解决它。
    • 对我来说工作正常。让我把代码分享给你。
    • 有时,我的输出甚至在重新发布到 tomcat、重新启动和清理后都没有改变。为了安全起见,我将关闭并重新启动 Eclipse。有时,事情会在那之后开始发挥作用。
    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多