0

エンティティのリストを.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:     <%

サーブレットクラスからのクエリは次のとおりです。

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>

構文を間違えていると思いますが、よくわかりません。いくつかの例を確認し、同じ方法(サーブレットからjspにエンティティのリストを送信し、jspファイル内のエンティティに到達するため)を使用しました。このエラーを解決するにはどうすればよいですか?

4

2 に答える 2

3

サーブレットとELを使用するときは、スクリプトレット<% %>Javaコードを使用する古いもの)を使用しないでください。代わりにJSTLのようなtaglibsを使用してください。<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.xmlを完全に無効にして、正しい方法で実行するように強制するために、Webアプリに次のものを追加することをお勧めします。

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

参照:

于 2012-11-09T20:58:40.903 に答える
1

この場合、「${drugtargets}」は文字列であり、渡したリストではありません。ループを使用することをお勧めします。それはずっときれいです。

<c:forEach var="drugtarget " items="${drugtargets}"> 
.... Your code here ...
</c:forEach>
于 2012-11-09T20:55:03.040 に答える