サーブレットの1つからWebアプリケーションのルートURLを取得したい。
「www.mydomain.com」にアプリケーションをデプロイする場合、「 http://www.mydomain.com 」のようなルートURLを取得します。
8080ポートのローカルTomcatサーバーにデプロイすると、http://localhost:8080/myapp
サーブレットからWebアプリケーションのルートURLを取得する方法を教えてもらえますか?
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String rootURL="";
//Code to get the URL where this servlet is deployed
}
}
URLクライアントが表示(および/またはブラウザに入力)し、サーブレットがデプロイされているコンテナによって提供されるURLが非常に異なる場合があることを理解していますか?
ただし、後者を取得するには、 HttpServletRequest で使用できるメソッドがいくつかあります。
getScheme()
、getServerName()
、getServerPort()
、およびgetContextPath()
を呼び出し、適切なセパレーターを使用してそれらを組み合わせることができます。getRequestURL()
を呼び出して、getServletPath()
とgetPathInfo()
を削除できます。この関数は、HttpServletRequest
からベースURLを取得するのに役立ちます。
public static String getBaseUrl(HttpServletRequest request) {
String scheme = request.getScheme() + "://";
String serverName = request.getServerName();
String serverPort = (request.getServerPort() == 80) ? "" : ":" + request.getServerPort();
String contextPath = request.getContextPath();
return scheme + serverName + serverPort + contextPath;
}
通常、URLを取得することはできません。ただし、特定の場合には回避策があります。参照: ServletContextのみでアプリケーションのURLを見つける
public static String getBaseUrl(HttpServletRequest request) {
String scheme = request.getScheme();
String Host = request.getServerName();
int port = request.getServerPort();
String contextPath = request.getContextPath();
String baseUrl = scheme + "://" + Host + ((("http".equals(scheme) && port == 80) || ("https".equals(scheme) && port == 443)) ? "" : ":" + port) + contextPath;
return baseUrl;
}
ウェルカムファイルにスクリプトレットを記述して、ルートパスをキャプチャします。 index.jspがデフォルトのファイルであると想定しています。そのため、次のコードをその中に入れます
<% RootContextUtil rootCtx = RootContextUtil.getInstance(); if( rootCtx.getRootURL()==null ){ String url = request.getRequestURL().toString(); String uri = request.getRequestURI(); String root = url.substring( 0, url.indexOf(uri) ); rootCtx.setRootURL( root ); } %>
値を次のように呼び出して、アプリケーション内で必要な場所でこの変数を直接使用します。
String rootUrl = RootContextUtil.getInstance().getRootURL();
注:プロトコル/ポート/などについて心配する必要はありません。これがすべてに役立つことを願っています