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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top