我有一个登录操作,在成功执行后重定向到上一页(我将上一页存储在我的会话中,以便稍后可以获取)。在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>
答案 0 :(得分:3)
您可以从ActionMapping
保存操作名称,命名空间和参数。
ActionMapping mapping = ServletActionContext.getActionMapping();
您也可以保存查询字符串而不是参数图。
String params = request.getQueryString();
要动态地向redirectAction
结果添加参数,您应该在动态参数中使用OGNL。
<param name="actionName">${previousAction.name +'?'+ parameters}</param>
假设您有一个parameters
的getter,并从保存先前查询字符串,操作名称和命名空间的会话中初始化它。