我的JSP中有以下代码。我正在使用Struts表单,我正在迭代的List中传递,并且List中的每个项目都有自己独立的表单。列表中的所有字段都是字符串,除了id,它是一个int。我正在尝试在s:hidden标记中呈现int,但Eclipse告诉我,“无效的属性(值)。” Struts文档说该值需要一个String,但是我将bulletins.id包装在$ {...}中,它应该将它转换为String。我已经完成了多次Google搜索以尝试解决此问题,但我什么也没做到。有没有人见过这个?
<%@ page import="java.io.*"%>
<%@ page import="java.util.List"%>
<%@ page language="java" import="model.Bulletin"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!-- Some more code here that's not relevant to this problem -->
<c:forEach var="bulletins" items="${bulletins}">
<c:if test="${bulletins.approved == false}">
<s:form action="ApproveBulletin" method="post">
<table>
<tr>
<td colspan="2"><b>From:</b> <c:out value="${bulletins.name}" /></td>
</tr>
<tr>
<td colspan="2"><b>Subject:</b> <c:out value="${bulletins.subject}" /></td>
</tr>
<tr>
<td colspan="2"><b>Date:</b> <c:out value="${bulletins.date}" /> <br>
</td>
</tr>
<tr>
<td colspan="2"><c:out value="${bulletins.note}" />
<!-- Error here --> <s:hidden name="id" value="${bulletins.id}" /></td>
</tr>
<tr>
<td><s:submit type="button" value="approve" label="Approve"
action="ApproveBuletin" /></td>
<td><s:submit type="button" value="deny" label="Deny"
action="DenyBulletin" /></td>
</tr>
</table>
<br />
</s:form>
</c:if>
</c:forEach>
<!-- Some more code here that's not relevant to this problem -->
答案 0 :(得分:1)
Struts2标签更喜欢OGNL,所以用%{}替换$ {}或者更好地写
<s:hidden name="id" value="bulletins.id" />
这是个人偏好,但是我只用S2标签写这个页面:
<s:iterator value="bulletins">
<s:if test="approved == false">
<s:form action="ApproveBulletin" method="post">
<table>
<tr>
<td colspan="2">
<b>From:</b>
<s:property value="name" />
</td>
</tr>
<tr>
<td colspan="2"><b>Subject:</b> <s:property value="subject" /></td>
</tr>
<tr>
<td colspan="2"><b>Date:</b> <s:property value="date" /></td>
</tr>
<tr>
<td colspan="2">
<s:property value="note"/>
<s:hidden name="id" value="id" />
</td>
</tr>
<tr>
<td><s:submit type="button" value="approve" label="Approve" action="ApproveBuletin" /></td>
<td><s:submit type="button" value="deny" label="Deny" action="DenyBulletin" /></td>
</tr>
</table>
<br/>
</s:form>
</s:if>
</s:iterator>
差别很小。请注意,迭代器堆栈将当前正在迭代的对象推送到堆栈上,因此您不需要在迭代器元素内部使用点表示法(对于更深层次嵌套的对象,您将...)。
答案 1 :(得分:0)
我对Struts2部分一无所知,但以下是绝对错误的:
<c:forEach var="bulletins" items="${bulletins}">
您正在使用当前迭代的项目覆盖列表。用普通的Java术语来说,你基本上都是这样做的:
for (Bulletin bulletins : bulletins) {}
这没有意义,也不会编译(重复本地变量或类似的东西)。
给它一个不同且唯一的名称。 bulletin
最有意义。循环中只有一个公告,对吗?
<c:forEach var="bulletin" items="${bulletins}">
然后用${bulletins.property}
替换循环内的任何${bulletin.property}
。