サーブレットによって転送されるJSPでリクエストURLを取得するにはどうすればよいですか?
JSPで次のコードを実行すると、
System.out.println("servlet path= " + request.getServletPath());
System.out.println("request URL= " + request.getRequestURL());
System.out.println("request URI= " + request.getRequestURI());
次に、JSPへのサーバー側のパスを取得します。ただし、ブラウザのアドレスバーに表示されるURLを取得します。 JSPに転送するサーブレットで取得できますが、JSP内で取得したいです。
RequestDispatcher.forward()
を使用してリクエストをコントローラーからビューにルーティングする場合、リクエストURIはjavax.servlet.forward.request_uri
という名前のリクエスト属性として公開されます。だから、使用することができます
request.getAttribute("javax.servlet.forward.request_uri")
または
${requestScope['javax.servlet.forward.request_uri']}
代わりにこれを試してください:
String scheme = req.getScheme();
String serverName = req.getServerName();
int serverPort = req.getServerPort();
String uri = (String) req.getAttribute("javax.servlet.forward.request_uri");
String prmstr = (String) req.getAttribute("javax.servlet.forward.query_string");
String url = scheme + "://" +serverName + ":" + serverPort + uri + "?" + prmstr;
注: URLからHREFアンカーを取得できません。たとえば、url "toc.html#top"がある場合は、 "toc.html"のみを取得できます
注:req.getAttribute( "javax.servlet.forward.request_uri")はJSPでのみ機能します。 JSPの前にコントローラーでこれを実行すると、結果はnullになります
両方のバリアントにコードを使用できます:
public static String getCurrentUrl(HttpServletRequest req) {
String url = getCurrentUrlWithoutParams(req);
String prmstr = getCurrentUrlParams(req);
url += "?" + prmstr;
return url;
}
public static String getCurrentUrlParams(HttpServletRequest request) {
return StringUtil.safeString(request.getQueryString());
}
public static String getCurrentUrlWithoutParams(HttpServletRequest request) {
String uri = (String) request.getAttribute("javax.servlet.forward.request_uri");
if (uri == null) {
return request.getRequestURL().toString();
}
String scheme = request.getScheme();
String serverName = request.getServerName();
int serverPort = request.getServerPort();
String url = scheme + "://" + serverName + ":" + serverPort + uri;
return url;
}
JSPファイル内から現在のパスを取得するには、次のいずれかを実行します。
<%= request.getContextPath() %>
<%= request.getRequestURI() %>
<%= request.getRequestURL() %>
これを試して、
<c:set var="pageUrl" scope="request">
<c:out value="${pageContext.request.scheme}://${pageContext.request.serverName}"/>
<c:if test="${pageContext.request.serverPort != '80'}">
<c:out value=":${pageContext.request.serverPort}"/>
</c:if>
<c:out value="${requestScope['javax.servlet.forward.request_uri']}"/>
</c:set>
基本テンプレートに入れて、必要なときにいつでもアプリ全体で使用したいと思います。
これらの属性は、サーブレット仕様(2.4、2.5、および3.0)ごとに、もう一度インクルード/転送する場合(またはgetNamedDispatcherを呼び出す場合)にオーバーライドされるため、信頼できません。元のリクエストURI /クエリ文字列を取得する唯一の信頼できる方法は、前にrequest.getRequestURI()/ getQueryString()に基づいて独自のカスタムリクエスト属性を設定するweb.xmlのフィルターチェーンの先頭にフィルターを貼り付けることだと思います転送/組み込みが行われます。
http://www.caucho.com/resin-3.0/webapp/faq.xtp には、これがどのように機能するかについての優れた要約が含まれています(2番目のforward/includeは、これらの属性を使用します)。
Jspでスクリプレットを使用しないようにするには、「divideByZero」のアドバイスに従い、${pageContext.request.requestURI}
これは良い方法です。
また、使用できます
${pageContext.request.requestURI}
@axtavtと同じですが、RequestDispatcher定数も使用できます。
request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);