Suportes 2:retornar à página de chamada
Pergunta
estou a usar Suportes 2.
Gostaria de retornar de uma ação para a página que a invocou.
Digamos que estou na página x.jsp, invoco a ação visual para alterar as preferências CSS na sessão;Eu quero voltar para x.jsp em vez de para uma página fixa (ou seja, home.jsp)
Aqui está o relevante suportes.xml fragmento:
<action name="Visual" class="it.___.web.actions.VisualizationAction"> <result name="home">/pages/home.jsp</result> </action>
Claro que meu VisualizationAction.execute()
retorna lar.
Existe alguma constante "mágica" (como, digamos, INPUT_PAGE) que eu possa retornar para fazer o truque?
Devo usar um método mais envolvente (ou seja,extraindo a página de solicitação e encaminhando para ela)?
T.I.A.
Solução
Você pode usar um resultado dinâmico em struts.xml.Por exemplo:
<action
name="Visual"
class="it.___.web.actions.VisualizationAction">
<result name="next">${next}</result>
</action>
Então, na sua ação, você cria um campo chamado next.Então para invocar a ação você passará o nome da página que deseja encaminhar a seguir.A ação então retorna "próximo" e o struts saberá para qual página ir.
Há uma explicação melhor neste post: Estouro de pilha
Outras dicas
return INPUT;
fará o truque.A constante INPUT é definida na própria interface Action.Isso indica que a ação precisa de mais informações.
Ao chamar page se você quis dizer a página que o levou à página de entrada da ação, sua página de entrada terá que armazenar o cabeçalho HTTP "Referer" no escopo da solicitação para a ação.
Minha solução envolveria uma interface e um interceptador.Você implementa a seguinte interface para todas as ações ao qual é provável que você queira redirecionar:
public interface TargetAware {
public String getTarget();
public void setTarget(String target);
}
O interceptor simplesmente garante que o alvo esteja definido, se necessário:
public class SetTargetInterceptor extends MethodFilterInterceptor implements Interceptor {
public String doIntercept(ActionInvocation invocation) {
Object action = invocation.getAction();
HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
if (action instanceof TargetAware) {
TargetAware targetAwareAction = (TargetAware) action;
if (targetAwareAction.getTarget() == null)
targetAwareAction.setTarget(getCurrentUri(request));
}
return invocation.invoke();
}
// I'm sure we can find a better implementation of this...
private static String getCurrentUri(HttpServletRequest request) {
String uri = request.getRequestURI();
String queryString = request.getQueryString();
if (queryString != null && !queryString.equals(""))
uri += "?" + queryString;
return uri;
}
public void init() { /* do nothing */ }
public void destroy() { /* do nothing */ }
}
A partir de então, uma vez que esses dois bits estejam em vigor e suas ações implementem o TargetAware
interface (se você espera ter que redirecioná-los), então você terá acesso a um target
parâmetro em seus JSPs sempre que precisar.Passe esse parâmetro para o seu VisualizationAction
(que também poderia implementar também o TargetAware
interface!), e em SUCCESS
, redirecione conforme explicado por Vincent Ramdhanie:
<action name="Visual" class="it.___.web.actions.VisualizationAction">
<result type="redirect">
<param name="location">${target}</param>
<param name="parse">true</param>
</result>
</action>
Não experimentei todos os detalhes desta estratégia.Em particular, tome cuidado com a notação em torno do redirect
tipo de resultado (dependendo da sua versão específica do Struts2:2.0.xe 2.1.x podem diferir nisso...).
Eu prefiro a maneira como você navega pelos usuários por meio de ações específicas.
http://domain.com/myAction.action
Você pode usar algum parâmetro como indicador de que deseja alterar o design atual:ou seja
http://domain.com/myAction.action?changeDesign=silver_theme
Então, você escreve um interceptador struts 2, cuja lógica é verificar a presença do parâmetro 'changeDesign', e esse interceptador fará o trabalho necessário de mudança de design e controlará o fluxo de trabalho.Com o interceptor você dissocia suas ações da lógica transversal.
ok, na sua classe it.___.web.actions.VisualizationAction, você deve retornar um valor de string contendo INPUT, então, no struts.xml você tem que definir algo assim:
<action name="Visual" class="it.___.web.actions.VisualizationAction">
<result name="input">yourJspPage.jsp</result>
</action>
isso o levará à página desejada.Isso deve funcionar, estou trabalhando no struts2 há 2 meses