如何使用EL,JSP,Servelets迭代另一个对象列表中的对象列表

时间:2016-04-18 17:52:06

标签: jsp servlets foreach nested jstl

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

我找到了类似的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>  

Servelet的

  @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);
}

1 个答案:

答案 0 :(得分:2)

鉴于Tracker实体包含List<TrackableDevice>属性,应执行以下操作:

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的情况下单独请求它。