gpt4 book ai didi

java - 使用java显示jsp文件中的实体列表

转载 作者:行者123 更新时间:2023-12-01 18:57:59 26 4
gpt4 key购买 nike

我正在尝试显示 .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);

这就是我将 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> 标记来迭代集合。

例如,

<%@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 中为了完全禁用scriptlet,以便您被迫以正确的方式做事。

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

另请参阅:

关于java - 使用java显示jsp文件中的实体列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13315767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com