【问题标题】:How can I iterate through an object list in another object list using EL, JSP, Servelets如何使用 EL、JSP、Servlet 遍历另一个对象列表中的对象列表
【发布时间】:2016-08-10 14:31:38
【问题描述】:

我想创建一个表,其中包含可变数量的跟踪器,这些跟踪器具有可变数量的可跟踪设备。我想在我的 JSP 文件中显示它。 我试过用 <c:forEach items="${tracker.getTrackableDeviceList()}" var="trackableDevice">,但我得到了错误: “‘where 子句’中的未知列‘t0.trackableDeviceList_ID’”。 当我使用<td> <c:out value="${tracker.getTrackableDeviceList()}"/> </td> 时,它可以工作,但它说列表没有被实例化。这很奇怪,因为 trackerList 工作正常。 最后但并非最不重要的一点是,我尝试为所有跟踪器创建一个属性 trackerList,并为 trackerList 中的每个跟踪器创建一个属性 trackableDeviceList。我想通过使用 trackerId 将属性与 JSP 匹配,但我收到了错误: Stacktrace:] 有根本原因 javax.servlet.jsp.JspTagException:不知道如何迭代

中提供的“项目”

我发现了类似的 javax.servlet.ServletException: javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>,但它并没有真正帮助我(或者我就是不明白)。

我怎样才能设法遍历这个?任何形式的建议表示赞赏。 我将错误和代码缩减到相关部分...

JSP

<form method="post" action="TrackerList_Servelet">  

<table>
    <c:forEach items="${trackerList}" var="tracker"> 
        <tr>      
            <td> <c:out value="${tracker.getPiName()}"/> </td>
            <td> <c:out value="${tracker.getTrackableDeviceList()}"/> </td>
            <c:forEach items="${tracker.getTrackerId()}" var="trackableDevice">   <!-- How to iterate through this? --> 
                <td>
                    <td> <c:out value="${trackableDevice.getId()}"/> </td>
                </td>
            </c:forEach>
        </tr>
    </c:forEach>
</table>

<input type="submit" value="Update"/>
</form>  

小服务

  @Override  
  protected void doPost(HttpServletRequest request,  
  HttpServletResponse response) throws ServletException, IOException 
{  

    DataManager dataManager = new DataManager();
    dataManager.startDataManagerSetup();     


    //Prepare the trackerList
    List<Tracker> trackerList = dataManager.getTrackerList();
    request.setAttribute("trackerList", trackerList); // Will be available as ${trackerList} in JSP


    //Prepare the trackableDeviceList for every tracker in trackerList
    for(int i = 0; i < trackerList.size(); i++)
    {
        Tracker t = trackerList.get(i);
        List<TrackableDevice> trackableDeviceList = t.getTrackableDeviceList();
        String trackerId = Integer.toString(t.getTrackerId());

        request.setAttribute(trackerId, trackableDeviceList); // Will be available as ${trackableDeviceList} in JSP
    }


    //Answer the request by sending back the list to status.jsp
    request.getRequestDispatcher("status.jsp").forward(request, response);
}

【问题讨论】:

标签: jsp servlets foreach nested jstl


【解决方案1】:

鉴于Tracker 实体包含List&lt;TrackableDevice&gt; 属性,应该这样做:

List<Tracker> trackerList = dataManager.getTrackerList();
request.setAttribute("trackerList", trackerList);
request.getRequestDispatcher("status.jsp").forward(request, response);

<c:forEach items="${trackerList}" var="tracker">
    <c:out value="${tracker.piName}" />
    <c:forEach items="${tracker.trackableDeviceList}" var="trackableDevice">
        <c:out value="${trackableDevice.id}"/>
    </c:forEach>
</c:forEach>

是的,确实只是直接访问该属性。与您在(不必要的)Java 代码中所做的完全一样。


与具体问题无关,您最好将 JSP 文件放在 /WEB-INF 文件夹中,以防止最终用户在不调用 servlet 的情况下单独请求它。

【讨论】:

  • 感谢您的快速回复。上帝看起来很容易,但在那种情况下,变量需要是公开的,对吗?那不是很糟糕吗?我明天试试,我现在不在家。我的 html 和 jsp 文件当前位于 WebContent 文件夹中。我想我会移动它们,谢谢。 :)
  • EL 只是通过 getter 访问属性。他们已经公开了。此外,不需要财产的存在。它甚至可以有不同的名称。你根本不需要${bean.getProperty()} 符号。另请参阅我们的 EL wiki 页面 stackoverflow.com/tags/el/info 以及相关问题的答案:stackoverflow.com/a/8577719
  • 我终于有时间继续我的工作了。我已经尝试过你的解决方案,但现在我得到:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 't0.trackableDeviceList_ID' in 'where clause' ...我似乎无法发布完整的错误,因为它长...
  • 问题出在数据库连接上。 BalusC 解决方案工作得非常好,谢谢。 :)
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多