2009-07-30 6 views
1

Struts 2アクション内からREQUEST_URIにアクセスするにはどうすればよいですか? perl/php/ruby​​ではENV ["REQUEST_URI"]などで簡単に利用できます。 Javaでは、PageContext.getErrorData()。getRequestURI()は私が探しているようですが、悲しいことに、PageContextはアクション内で定義されていないようです。ErrorDocumentリダイレクトによってリクエストがエラー、または後で定義されるためです。前面にはApache(のmod_jk/AJP)指定元のREQUEST_URIをStruts 2の中からどのように得ることができますか?ApacheのErrorDocumentリダイレクトを介して到達したアクション?

特定の例

は、ApacheでのErrorDocument 404の構成を介して到達Tomcatで2アプリストラット。オリジナルリクエストURL(404をトリガー) - -

http://server/totally/bogus/path 

- のhttp.conf -

ErrorDocument 404 /struts2app/lookup.action 

- Strutsアクション -

:次の詳細

public String bogusUrlLookup() { 
    HttpServletRequest request = ServletActionContext.getRequest(); 

    // contains /lookup.action as does request.getRequestURI(); 
    String url = RequestUtils.getServletPath(request); 

    // PageContext is null, so I cannot reach ErrorData from it. 
    log.info("pageContext="+ServletActionContext.getPageContext()); 

    // Not in the ENV 
    // Map env = System.getenv(); 

    // Not in the ATTRIBUTES 
    // request.getAttributeNames() 

    // Not in HEADER 
    // request.getHeaderNames() 

    return ERROR; 
} 

もう一度必要なのは文字列 "/ totally/bogus/path"ですが、上記のアクションでは私が見つけることができる唯一のURL文字列は "/ st ruts2app/lookup.action "と入力します。私はErrorDocumentに縛られています。なぜなら、完全に/偽の/パスが、アプリケーションの名前空間内にない可能性が高いのは、Apacheが他の非​​Tomcatリソースを提供しているからです。

答えて

1

request.getAttribute( "javax.servlet.forward.request_uri")

+0

いいえ。この文脈ではnullです。 – andynu

1

使用:あなたのhttpd.confファイルで

JkEnvVar REDIRECT_URL "" 

。次に、request.getAttribute("REDIRECT_URL");を使用して、JSP /サーブレットで変数を取得します。

1
baseUri = (String)request.getAttribute("struts.request_uri"); 
0

あなたはしたいが、クエリ文字列の一部を見逃していない場合、これは良いです:

final String referrer = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI); 
if(referrer != null) { 
    final String query = (String) request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING); 
    if(query != null && query.length() > 0) { 
     url = referrer+ "?" + query; 
    } 
    else { 
     url = referrer; 
    } 
// do something 

}