一尘不染

通过使用Java在jsp文件中显示实体列表

jsp

我正在尝试在.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文件中的实体)。如何解决此错误?


阅读 243

收藏
2020-06-08

共1个答案

一尘不染

使用servlet和EL时,您根本不应该使用 scriptlet (那些<% %>带有Java代码的老式东西)。请改用JSTL之类的标记库。它提供<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>内部循环固定了表行的呈现)

简单得多,不是吗?顺便说一下,您也可以只使用<c:out value="${drugtarget.drug}"/>这些功能。

如果可以的话,建议您将以下内容添加到您的Web应用程序web.xml中,以完全禁用 脚本集, 以便您被迫以正确的方式进行操作。

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
</jsp-config>
2020-06-08