【问题标题】:How to iterate list of lists using jstl?如何使用 jstl 迭代列表列表?
【发布时间】:2023-06-07 03:22:02
【问题描述】:

我的控制器中有 4 个列表。产品、价格和数量。我将这些列表放在结果列表中,并通过模型对象将结果列表传递给 jsp 页面。 我想要输出如下。

产品1

价格1

数量1

产品2

价格2

数量2

这里是代码。

控制器代码

@RequestMapping(value="/demo1")
    public ModelAndView demo1(){
        List productName=new ArrayList();
        List price=new ArrayList();
        List qty=new ArrayList();
        List result=new ArrayList();
        productName.add("iphone");
        productName.add("nokia");
                price.add("70000");
                price.add(2000);
                qty.add(1);
                qty.add(3);
                result.add(productName);
                result.add(price);
                result.add(qty);
                ModelAndView model=new ModelAndView("demo");
                model.addObject("result", result);
                return model;
    }

我正在尝试在 jsp 中关注,但没有得到想要的输出。

JSP 代码

<c:set var="i" value="0" scope="page" />
 <c:forEach var="s" items="${result}" varStatus="ctr">
    <ul>
        <li>${s[i]}
            <%-- <ul>
                <c:forEach var="s1" items="${s}">
                    <li>${s1}</li>
                </c:forEach>
            </ul> --%>
        </li>
    </ul>
      <c:set var="i" value="${i+1}" scope="page" />
</c:forEach>

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java spring jsp spring-mvc jstl


    【解决方案1】:

    Java 是一种面向对象的语言。你应该使用它

    不要为对象的每个属性创建多个相同大小的列表。为具有 3 个字段(例如,名为 namepriceqty)的对象(例如名为 Product)创建一个类,并使用这些对象的单个列表。

    另外,不要使用 raw 泛型。始终指定泛型类型参数,例如List&lt;String&gt; productName 而不是 List productName

    public class Product {
        private String name;
        private double price;
        private int    qty;
        public Product(String name, double price, int qty) {
            this.name = name;
            this.price = price;
            this.qty = qty;
        }
        public String getName() {
            return this.name;
        }
        public double getPrice() {
            return this.price;
        }
        public int getQty() {
            return this.qty;
        }
    }
    
    List<Product> products = new ArrayList<>();
    products.add(new Product("iphone", 70000, 1));
    products.add(new Product("nokia", 2000, 3));
    ModelAndView model = new ModelAndView("demo");
    model.addObject("products", products);
    return model;
    
    <c:forEach var="product" items="${products}">
      <ul>
        <li><c:out value="${product.name}"/></li>
        <li><fmt:formatNumber value="${product.price}" type="CURRENCY"/></li>
        <li>${product.qty}</li>
      </ul>
    </c:forEach>
    

    【讨论】:

    • 非常感谢。有效。实际上我正在创建一个项目,所有这些细节都将来自数据库。我有很多产品,不仅是移动设备。这只是一个演示代码,这就是为什么存在原始泛型,抱歉。你能告诉我如此多的反对票的原因对于像我们这样的新人来说是令人沮丧的。再次感谢。
    【解决方案2】:

    你可以只使用变量s

     <c:forEach var="s" items="${result}" varStatus="ctr">
           ${s}
     </c:forEach>
    

    【讨论】:

    • 试过但没有完全满足我的要求。它的输出为•[iphone, nokia] •[70000, 2000] •[1, 3]
    • 我想输出为 iphone 70000 1, nokia 2000 3
    • 您最好创建包含您的数据的对象,然后通过 ArrayList&lt;YourObjectType&gt; 调用 ${s.name} ${s.price}
    • 见上面的@Andreas 评论
    • 我决定把我的评论变成answer