如何使用 EL、JSP、Servelets 遍历另一个对象列表中的对象列表
How can I iterate through an object list in another object list using EL, JSP, Servelets
我想创建一个 table,其中包含可变数量的跟踪器,这些跟踪器附有可变数量的可跟踪设备。我想在我的 JSP 文件中显示它。
我试过用
<c:forEach items="${tracker.getTrackableDeviceList()}" var="trackableDevice">
,但我收到错误:
"Unknown column 't0.trackableDeviceList_ID' in 'where clause'"。
当我使用 <td> <c:out value="${tracker.getTrackableDeviceList()}"/> </td>
时,它可以工作,但它表示列表未实例化。这很奇怪,因为 trackerList 工作正常。
最后但同样重要的是,我尝试为所有跟踪器创建一个属性 trackerList,并为 trackerList 中的每个跟踪器创建一个属性 trackableDeviceList。我想通过使用 trackerId 将属性与 JSP 匹配,但我收到了错误:
Stacktrace:] 有根本原因
javax.servlet.jsp.JspTagException:不知道如何迭代
中提供的 "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);
}
假设 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。
我想创建一个 table,其中包含可变数量的跟踪器,这些跟踪器附有可变数量的可跟踪设备。我想在我的 JSP 文件中显示它。
我试过用
<c:forEach items="${tracker.getTrackableDeviceList()}" var="trackableDevice">
,但我收到错误:
"Unknown column 't0.trackableDeviceList_ID' in 'where clause'"。
当我使用 <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>
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);
}
假设 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。