Struts2重定向到具有未知数量参数的另一个动作

时间:2014-06-16 10:03:40

标签: java xml redirect struts2 ognl

我有一个登录操作,在成功执行后重定向到上一页(我将上一页存储在我的会话中,以便稍后可以获取)。在Struts2中,我可以找到两种方法来执行此重定向:

    <action name="login" class="com.myapp.login.Login">
        <result name="redirect" type="redirect">${previousAction.requestURL}</result>   
    </action>

在这个例子中,将调用getPreviousAction()。getRequestURL()方法(这是一个自制方法,它不是struts2),这将按预期返回上一页的url,例如:

somenamespace/index.action

还有另一种重定向方式:

<action name="login" class="com.myapp.login.Login">
     <result type="redirectAction">
        <param name="actionName">${previousAction.name}</param>
        <param name="namespace">/${previousAction.namespace}</param>
    </result>   
</action>

我想使用此redirectaction结果类型,因为它更清晰。但是,当查询参数是url的一部分时,我遇到了问题。例如:

somenamespace/index.action?name=john&age=50

我知道我可以在我的struts.xml中添加这些硬编码的参数,但问题是我的登录操作应该重定向到以前调用的任何操作,而且我事先不知道以前的操作有哪些查询参数。这与您确切知道您将重定向到

的操作的典型用例不同

我发现一个非常糟糕的解决方案是添加每个param(我在struts.xml中所有操作的所有参数的集合),然后使用选项:

<param name="suppressEmptyParameters">true</param>

1 个答案:

答案 0 :(得分:3)

您可以从ActionMapping保存操作名称,命名空间和参数。

ActionMapping mapping = ServletActionContext.getActionMapping();

您也可以保存查询字符串而不是参数图。

String params = request.getQueryString();

要动态地向redirectAction结果添加参数,您应该在动态参数中使用OGNL。

<param name="actionName">${previousAction.name +'?'+ parameters}</param>

假设您有一个parameters的getter,并从保存先前查询字符串,操作名称和命名空间的会话中初始化它。