Struts2 перенаправляет на другое действие с неизвестным количеством параметров
У меня есть действие при входе в систему, которое после успешного выполнения перенаправляет на предыдущую страницу (я сохраняю предыдущую страницу в своем сеансе, чтобы получить ее позже). В 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>
Я хочу использовать этот тип результата перенаправления, потому что он намного чище. Но у меня есть проблема, когда параметры запроса являются частью URL. Например:
somenamespace/index.action?name=john&age=50
Я знаю, что могу добавить эти параметры жестко закодированными в мой struts.xml, но проблема в том, что мое действие при входе в систему должно перенаправлять на ЛЮБОЕ ранее вызванное действие, и я заранее не знаю, какие параметры запроса были у предыдущих действий. Это отличается от типичного варианта использования, где вы точно знаете, на какое действие вы перенаправляете
Очень плохим решением, которое я нашел, было добавление КАЖДОГО возможного параметра (сбор всех параметров всех моих действий в struts.xml), а затем использование опции:
<param name="suppressEmptyParameters">true</param>
1 ответ
Вы можете сохранить имя действия, пространство имен и параметры из ActionMapping
,
ActionMapping mapping = ServletActionContext.getActionMapping();
Вы также можете сохранить строку запроса вместо карты параметров.
String params = request.getQueryString();
Добавить параметры динамически в redirectAction
В результате вы должны использовать OGNL в динамическом параметре.
<param name="actionName">${previousAction.name +'?'+ parameters}</param>
Предположим, у вас есть добытчик для parameters
и инициализировал его из сеанса, в котором вы сохранили предыдущую строку запроса, имя действия и пространство имен.