Struts2动作之间的参数

时间:2011-09-13 13:35:29

标签: jsp struts2 request action

我需要在项目更新后保持同一页面,但我需要项目ID才能知道成功的去向。我尝试了几个例子:

第一个:

    <action
        name="add-item"
        method="addItem"
        class="com.deveto.struts.actions.ItemsAction" >
        <interceptor-ref name="defaultStack"/>
        <result name="success" type="redirectAction">
            <param name="actionName">show-update-item</param>
            <param name="itemId">${itemId}</param>
        </result>
    </action>

第二个:

    With an Action variable and setter & getter methods.

    <action
        name="add-item"
        method="addItem"
        class="com.deveto.struts.actions.ItemsAction" >
        <interceptor-ref name="defaultStack"/>
        <result name="success" type="redirectAction">show-update-item</result>
    </action>

第三个:

    With request.setAttribute("itemId", itemId); and request.getAttribute("itemId");

    <action
        name="add-item"
        method="addItem"
        class="com.deveto.struts.actions.ItemsAction" >
        <interceptor-ref name="defaultStack"/>
        <result name="success" type="redirectAction">show-update-item</result>
    </action>

第四个:

    With an Action variable and setter & getter methods.

和type =“chain”

    <action
        name="add-item"
        method="addItem"
        class="com.deveto.struts.actions.ItemsAction" >
        <interceptor-ref name="defaultStack"/>
        <result name="success" type="chain">show-update-item</result>
    </action>

最终,Action是一个,show-update-item.action。

但所有这些都给了我相同的空结果。

有任何建议吗?

例如:show-update-item.action?itemId = 33(itemId的getParameter) - &gt;编辑一些文本字段 - &gt;提交(请求中itemId = 33) - &gt;关于成功的redirectAction - &gt; show-update-item.action(这里当我尝试getAttribute时它为null)

2 个答案:

答案 0 :(得分:2)

如果我理解正确,在第一个操作选择了一个项目后,您将使用不同的操作停留在同一页面上。如果是这种情况,您的第一个操作定义应该有效:

<action
    name="add-item"
    method="addItem"
    class="com.deveto.struts.actions.ItemsAction" >
    <interceptor-ref name="defaultStack"/>
    <result name="success" type="redirectAction">
        <param name="actionName">show-update-item</param>
        <param name="itemId">${itemId}</param>
    </result>
</action>

现在要说的是,你需要确保在itemId的两个动作中都有访问器方法(我们称之为动作1和动作2)。

在操作1中,$ {itemId}正在通过getter进行检索,并且在操作2中{$ itemId}应该通过setter方法设置。

另一种选择是考虑使用sessionaware。只需在操作1中设置会话变量,并在操作2中检索会话变量,如果您担心开销,则将其从会话中删除。我倾向于经常使用会话。

答案 1 :(得分:1)

与Russel建议一样,使用此操作:

    <action
        name="add-item"
        method="addItem"
        class="com.deveto.struts.actions.ItemsAction" >
        <interceptor-ref name="defaultStack"/>
        <result name="success" type="redirectAction">
            <param name="actionName">show-update-item</param>
            <param name="itemId">${itemId}</param>
        </result>
    </action>

确保在ItemsAction上有访问器方法。确保使用它们来获取“itemId”的值而不是“getAttribute”。

public String getItemId() {
    return itemId;
}

public void setItemId(String itemId) {
    this.itemId = itemId;
}

验证最终重定向实际发生时,您确实在浏览器的地址栏中看到“show-update-item.action?itemId = 33”。如果查询中没有传递“itemId”,那么绝对没有办法获得“itemId”的值。