如何在struts迭代器生成的单个表单中调用多个动作

时间:2013-04-01 05:12:03

标签: java jsp java-ee struts2

我有一个票证对象列表,我使用strut标签在我的jsp中显示。列表工作正常,行正确呈现。我需要做的是两个为每一行提供两个功能 - 详细信息更新

我的JSP的一部分...

<script type="text/javascript">

function details()
{
    document.forms['ticketForm'].action="viewTicket.do";
    document.forms['ticketForm'].submit();
}

</script>

                       <s:iterator value="ticketList" var="tl">
                        <tr>
                        <!-- The problem form which should call 2 actions -->
                        <s:form id="ticketForm" action="updateTicket" theme="simple">
                        <!-- This hidden field is required in both actions -->
                        <s:hidden name="ticketId" value="%{#tl.id}" />
                        <td valign="top" width="5%"><s:property value="id" /></td>
                        <td valign="top"><s:property value="requesterName" /></td>
                        <td valign="top"><s:property value="guestName" /></td>
                        <input type="button" value="Details" onClick="Javascript:details()" />
                        <s:submit value="Update" />
                          </td>
                          </s:form>
                        </tr>

                        <tr>
                          <td colspan="10"><script language="JavaScript">Rule();</script></td>
                        </tr>
                        </s:iterator>

现在问题: 1)UpdateTicket动作工作正常但不是 viewTicket动作(通过javascript呈现的动作)。无论我点击哪一行,它总是调用第2行中的票证的详细信息。如果我使用s:submit而不是第二个动作,则表单的默认操作,即updateTicket一直被调用。我该如何解决这个问题。

2)第1行中的更新票证永远不会有效。它总是重新加载同一页面并做一些奇怪的事情。但是,更新票证操作在所有其他行中正常工作。

2 个答案:

答案 0 :(得分:1)

尝试为每个表单分配不同的ID,然后运行该应用程序。在JSP和Javascript上对代码进行以下更改

JSP更改

 <s:iterator value="ticketList" var="tl" status="stat">
                        <tr>
                        <!-- The problem form which should call 2 actions -->
                        <s:form id="ticketForm%{#stat.index}" action="updateTicket" theme="simple">
                        <!-- This hidden field is required in both actions -->
                        <s:hidden name="ticketId" value="%{#tl.id}" />
                        <td valign="top" width="5%"><s:property value="id" /></td>
                        <td valign="top"><s:property value="requesterName" /></td>
                        <td valign="top"><s:property value="guestName" /></td>
                        <input type="button" value="Details" onClick="Javascript:details(<s:property value='%{#stat.index}' />)" />
                        <s:submit value="Update" />
                          </td>
                          </s:form>
                        </tr>

                        <tr>
                          <td colspan="10"><script language="JavaScript">Rule();</script></td>
                        </tr>
                        </s:iterator>

Javascript更改

function details(index)
{
    document.forms['ticketForm'+index].action="viewTicket.do";
    document.forms['ticketForm'+index].submit();
}

希望这会有所帮助:)

答案 1 :(得分:0)

您从哪里读取您应该显示详细信息的票证ID。

我想这是一个,但请记住你使用的是迭代器,而id是一个常量。所以它只能保存一个值,这将是迭代器的最后一个值。尝试从浏览器查看html生成源以查看此字段的值。

解决方法: 而是转到struts tag(对于更新和查看):

S:URL

S:PARAM

样品,

<s:url action="urlTagAction.action" >
    <s:param name="id">123</s:param>
</s:url>