そのため、Javaのリクエストオブジェクトを使用して、ページの現在のURLを取得しようとしています。 request.getRequestURI()を使用してこれを実行しましたが、Javaクラスがサーブレットリクエストから別のページにリダイレクトすると、getRequestURIはそのアドレスをブラウザーに入力され、ブラウザーにまだ表示されている元のURL。
例:\ AdvancedSearch:getRequestURI()
は「\ subdir\search\search.jsp」を返します
ブラウザがURLとして認識しているものを取得する方法を探していますが、そのページがサーブレットラッパーにすぎないことを認識しているのではありません。
現在のリクエストがフォワードまたはインクルードの「アプリサーバー内部」から来ている場合、アプリサーバーはリクエスト属性としてリクエスト情報を保持することが期待されます。特定の属性、およびそれらに含まれる内容は、転送を行うか含めるかによって異なります。
_<jsp:include>
_の場合、元の親URLはrequest.getRequestURL()
によって返され、含まれているページに関する情報は次のリクエスト属性にあります。
_ javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string
_
_<jsp:forward>
_の場合、新しいURLはrequest.getRequestURL()
によって返され、元のリクエストの情報は次のリクエスト属性にあります。
_ javax.servlet.forward.request_uri
javax.servlet.forward.context_path
javax.servlet.forward.servlet_path
javax.servlet.forward.path_info
javax.servlet.forward.query_string
_
これらは、Servlet 2.4仕様のセクション8.3および8.4に記載されています。
ただし、この情報は内部で送信されたリクエストに対してのみ保持されることに注意してください。フロントエンドWebサーバーがある場合、または現在のコンテナーの外部にディスパッチする場合、これらの値はnullになります。つまり、元のリクエストURLを見つける方法がない場合があります。
Ballsacian1による解決策をわずかに整理しました
String currentURL = null;
if( request.getAttribute("javax.servlet.forward.request_uri") != null ){
currentURL = (String)request.getAttribute("javax.servlet.forward.request_uri");
}
if( currentURL != null && request.getAttribute("javax.servlet.include.query_string") != null ){
currentURL += "?" + request.getQueryString();
}
Nullチェックは、文字列比較よりもはるかに効率的に実行されます。
String activePage = "";
// using getAttribute allows us to get the orginal url out of the page when a forward has taken place.
String queryString = "?"+request.getAttribute("javax.servlet.forward.query_string");
String requestURI = ""+request.getAttribute("javax.servlet.forward.request_uri");
if(requestURI == "null") {
// using getAttribute allows us to get the orginal url out of the page when a include has taken place.
queryString = "?"+request.getAttribute("javax.servlet.include.query_string");
requestURI = ""+request.getAttribute("javax.servlet.include.request_uri");
}
if(requestURI == "null") {
queryString = "?"+request.getQueryString();
requestURI = request.getRequestURI();
}
if(queryString.equals("?null")) queryString = "";
activePage = requestURI+queryString;
$ {requestScope ['javax.servlet.forward.query_string']}-Expression Languageを使用してjspからアクセスする場合
要求の内部フローの状態を知らずにHTTP要求パスを取得するには、次のメソッドを使用します。
public String getUri(HttpServletRequest request) {
String r = (String) request.getAttribute("javax.servlet.forward.request_uri");
return r == null ? request.getRequestURI() : r;
}
これを試してもらえますか
<%=request.getRequestURL().toString()%>
@kdgregoryと同じ答えですが、むしろRequest Dispatcher定数を使用できます。
javax.servlet.include.request_uri RequestDispatcher.FORWARD_REQUEST_URI
javax.servlet.include.context_path RequestDispatcher.FORWARD_CONTEXT_PATH
javax.servlet.include.servlet_path RequestDispatcher.FORWARD_SERVLET_PATH
javax.servlet.include.path_info RequestDispatcher.FORWARD_PATH_INFO
javax.servlet.include.query_string RequestDispatcher.FORWARD_QUERY_STRING