Struts问题 - s:隐藏

时间:2011-02-27 21:38:15

标签: java jsp struts2 el

我的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 -->

2 个答案:

答案 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}