Как сделать динамические URL-перенаправления в Struts 2? - PullRequest
26 голосов
/ 06 октября 2008

Я пытаюсь перенаправить мое приложение Struts2 на созданный URL. В этом случае я хочу, чтобы в URL использовалась текущая дата или дата, которую я посмотрел в базе данных. Так /section/document становится /section/document/2008-10-06

Какой лучший способ сделать это?

Ответы [ 6 ]

61 голосов
/ 07 октября 2008

Вот как мы это делаем:

В Struts.xml есть динамический результат, такой как:

<result name="redirect" type="redirect">${url}</result>

В действии:

private String url;

public String getUrl()
{
 return url;
}

public String execute()
{
 [other stuff to setup your date]
 url = "/section/document" + date;
 return "redirect";
}

Вы можете фактически использовать эту же технологию для установки динамических значений для любой переменной в вашем struts.xml, используя OGNL. Мы создали все виды динамических результатов, включая такие, как ссылки RESTful. Классные вещи.

14 голосов
/ 30 марта 2009

Можно также использовать annotations и плагин Convention, чтобы избежать повторяющихся настроек в struts.xml:

@Result(location="${url}", type="redirect")

$ {url} означает «использовать значение метода getUrl»

3 голосов
/ 17 мая 2014

Если кто-то хочет перенаправить напрямую в ActionClass:

public class RedirecActionExample extends ActionSupport {
HttpServletResponse response=(HttpServletResponse) ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE);

    url="http://localhost:8080/SpRoom-1.0-SNAPSHOT/"+date;
    response.sendRedirect(url);
    return super.execute(); 
}

Редактировать: добавлена ​​пропущенная цитата.

2 голосов
/ 06 октября 2008

В итоге я создал подклассы Struts ServletRedirectResult и переопределил его doExecute() метод, чтобы выполнить мою логику перед вызовом super.doExecute(). это выглядит так:

public class AppendRedirectionResult extends ServletRedirectResult {
   private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

  @Override
  protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
    String date = df.format(new Date());
    String loc = "/section/document/"+date;
    super.doExecute(loc, invocation);
  }
}

Я не уверен, что это лучший способ сделать это, но это работает.

1 голос
/ 22 июля 2014

Вы можете перенаправить на другое действие, используя аннотацию -

@Result(
    name = "resultName",
    type = "redirectAction",
    params = { "actionName", "XYZAction" }
)
0 голосов
/ 03 ноября 2016

Можно перенаправить напрямую с перехватчика, независимо от того, какое действие вовлечено.

In struts.xml

    <global-results>
        <result name="redir" type="redirect">${#request.redirUrl}</result>
    </global-results>

In Interceptor

@Override
public String intercept(ActionInvocation ai) throws Exception
{
    final ActionContext context = ai.getInvocationContext();        
    HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST);
    request.setAttribute("redirUrl", "http://the.new.target.org");
    return "redir";
}
...