我正在尝试在.jsp文件中显示实体列表,但出现此错误:
Unable to compile class for JSP: An error occurred at line: 28 in the jsp file: /guestbook.jsp Can only iterate over an array or an instance of java.lang.Iterable 25: </tr> 26: <tr> 27: <% 28: for (Entity drugtarget : "${drugtargets}") { 29: %> 30: <td> 31: <%
这是我对servlet类的查询:
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); Query query = new Query("DrugTarget").addSort("drug", Query.SortDirection.DESCENDING); List<Entity> drugtargets = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10)); req.setAttribute("drugtargets", drugtargets);
这就是我将药物靶标发送到jsp文件的方式:
String url = "/guestbook.jsp"; ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(url); try { rd.forward(req, resp); } catch (ServletException e) { e.printStackTrace(); }
最后这是我写jsp部分的方法:
<table border="1"> <tr> <th>Drug Names</th> <th>Target Names</th> </tr> <tr> <% for (Entity drugtarget : "${drugtargets}") { %> <td> <% pageContext.setAttribute("drug_content", drugtarget.getProperty("drug")); %> ${fn:escapeXml(drug_content)} </td> <td> <% pageContext.setAttribute("target_content", drugtarget.getProperty("target")); %> ${fn:escapeXml(target_content)} </td> <% } %> </tr> </table>
我认为我在犯语法错误,但不确定。我检查了一些示例,并使用了相同的方式(将实体列表从servlet发送到jsp并到达jsp文件中的实体)。如何解决此错误?
使用servlet和EL时,您根本不应该使用 scriptlet (那些<% %>带有Java代码的老式东西)。请改用JSTL之类的标记库。它提供<c:forEach>标签以遍历集合。
<% %>
<c:forEach>
例如,
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ... <table border="1"> <tr> <th>Drug Names</th> <th>Target Names</th> </tr> <c:forEach items="${drugtargets}" var="drugtarget"> <tr> <td>${fn:escapeXml(drugtarget.drug)}</td> <td>${fn:escapeXml(drugtarget.target)}</td> </tr> </c:forEach> </table>
(请注意,我还通过将<tr>内部循环固定了表行的呈现)
<tr>
简单得多,不是吗?顺便说一下,您也可以只使用<c:out value="${drugtarget.drug}"/>这些功能。
<c:out value="${drugtarget.drug}"/>
如果可以的话,建议您将以下内容添加到您的Web应用程序web.xml中,以完全禁用 脚本集, 以便您被迫以正确的方式进行操作。
web.xml
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> </jsp-property-group> </jsp-config>