【问题标题】:Struts problem -- s:hiddenStruts 问题——s:hidden
【发布时间】:2011-02-27 21:38:15
【问题描述】:

我的 JSP 中有以下代码。我正在使用一个 Struts 表单,我在其中传递了一个正在迭代的 List,并且 List 中的每个项目都有自己单独的表单。列表中的所有字段都是字符串,除了 id,它是一个 int。我试图在 s:hidden 标记中呈现 int,但 Eclipse 告诉我“无效的属性(值)”。 Struts 文档说该值需要一个字符串,但我将 bulletins.id 包装在 ${...} 中,这应该将其转换为字符串。我已经进行了多次 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 -->

【问题讨论】:

    标签: java jsp struts2 el


    【解决方案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>
    

    差别很小。请注意,迭代器堆栈将当前正在迭代的对象推入堆栈,因此您不需要在迭代器元素内使用点表示法(对于嵌套更深的对象...)。

    【讨论】:

    • 这个解决方案消除了隐藏字段上的错误,但现在屏幕上什么也没有出现,即使我已经验证列表中有项目批准 == false。在之前的测试中,我硬编码了一个隐藏的字符串值,列表项出现了,但现在重写时它们没有出现。这是我需要一个新线程的东西吗,或者我可以在这里获得帮助吗?
    • 如果您提供带有硬编码数据的 Action 类,我将帮助您使用 JSP 来生成您正在寻找的内容......没关系,我看到您已经开始了另一个问题。我去看看。
    【解决方案2】:

    我对 Struts2 部分一无所知,但以下肯定是错误的:

    <c:forEach var="bulletins" items="${bulletins}">
    

    您正在用当前迭代的项目覆盖列表。用普通的 Java 术语来说,你基本上是在做:

    for (Bulletin bulletins : bulletins) {}
    

    这没有意义,也不会编译(重复的局部变量或类似的东西)。

    给它一个不同且唯一的名称。 bulletin 最有意义。循环内只有一个公告的方法,对吗?

    <c:forEach var="bulletin" items="${bulletins}">
    

    然后将循环内的任何${bulletins.property} 替换为${bulletin.property}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2014-06-11
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多