2008-10-06 58 views
26

我試圖讓我的Struts2應用程序重定向到一個生成的URL。在這種情況下,我希望URL使用當前日期,或者我在數據庫中查找的日期。所以/section/document變成/section/document/2008-10-06如何在Struts 2中做動態URL重定向?

這樣做的最好方法是什麼?

回答

58

下面是我們如何做到這一點:

在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"; 
} 

實際上,你可以使用相同的技術,使用OGNL爲struts.xml中的任何變量設置動態值。我們已經創建了各種各樣的動態結果,包括像RESTful鏈接這樣的東西。很酷的東西。

+1

非常感謝,這很好地工作!有沒有辦法對xml進行更改,以便它不需要應用於我擁有的每一個動作?我理想的情況是適用於我所有的行爲。 – Chris 2009-11-24 04:51:52

+2

你可能會嘗試一個全局結果。我還沒有爲動態變量做過這方面的實驗,但只要該操作返回結果,我就不會看到任何不可行的原因。 – 2009-12-04 18:12:40

+0

這項工作的全球業績很好。 – 2013-05-15 18:05:02

2

我最終在調用super.doExecute()之前完成了Struts的ServletRedirectResult的子類化並覆蓋了它的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); 
    } 
} 

我不確定這是否是最好的方法來做到這一點,但它的工作原理。

14

你也可以使用annotations和公約的插件,以避免重複的struts.xml配置:

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

的$ {url}的意思是「使用getURL方法的價值」

2

如果有人想直接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(); 
} 

編輯:添加缺少的報價。

1

您可以重定向到使用註釋另一個動作 -

​​
0

人們可以直接從一個攔截器重定向到沒有它參與的行動方面。

在struts.xml中

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

在攔截

@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"; 
}