テスト環境から本番環境へ持っていったり、サーバー環境でURLが変わったりすることは良くあります。
こんなときのために、あらかじめパス情報をAPIで取得して、そのパスから画像ファイルなどのURLを作成しておけば、環境が変わっても大体対応することができます。
サーブレットではHttpServletRequestからいろいろなパス情報を取得できます。
これを利用すると、パス情報を動的に作成することができるようになります。
Youtube版はこちらからどうぞ
Youtubeで動画を公開しました。こちらもぜひぜひ。
こちらでは、もう少し細かく解説してます。
URLのパスを取得するサンプル
ドメイン名や、サーブレット名、等のパス情報を取得するサンプルです。
取得した結果を、とりあえずブラウザに出力してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class UrlTestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String requestUri = request.getRequestURI(); String requestUrl = request.getRequestURL().toString(); String pathInfo = request.getPathInfo(); String queryString = request.getQueryString(); String pathTranslated = request.getPathTranslated(); String scheme = request.getScheme(); String serverName = request.getServerName(); int serverPort = request.getServerPort(); String servletPath = request.getServletPath(); String contextPath = request.getContextPath(); PrintWriter pw = response.getWriter(); pw.println("<html>"); pw.println("<body>"); pw.println("---------------------------------------------------"); pw.println("<br>"); pw.println("requestUrl:"+requestUrl); pw.println("<br>"); pw.println("requestUri:"+requestUri); pw.println("<br>"); pw.println("---------------------------------------------------"); pw.println("<br>"); pw.println("scheme:"+scheme); pw.println("<br>"); pw.println("serverName:"+serverName); pw.println("<br>"); pw.println("serverPort:"+serverPort); pw.println("<br>"); pw.println("contextPath:"+contextPath); pw.println("<br>"); pw.println("servletPath:"+servletPath); pw.println("<br>"); pw.println("pathInfo:"+pathInfo); pw.println("<br>"); pw.println("queryString:"+queryString); pw.println("<br>"); pw.println("pathTranslated:"+pathTranslated); pw.println("<br>"); pw.println("---------------------------------------------------"); pw.println("</body>"); pw.println("</html>"); } } |
実行結果
「http://localhost:8080/TestWeb/urltest/aaa?bbb=ccc」で、サーブレットにアクセスしてみます。
Webアプリケーション(コンテキスト):TestWeb
サーブレット:urltest
1 2 3 4 5 6 7 8 9 10 11 12 13 | --------------------------------------------------- requestUrl:http://localhost:8080/TestWeb/urltest/aaa requestUri:/TestWeb/urltest/aaa --------------------------------------------------- scheme:http serverName:localhost serverPort:8080 contextPath:/TestWeb servletPath:/urltest pathInfo:/aaa queryString:bbb=ccc pathTranslated:C:\(中略)\TestWeb\aaa --------------------------------------------------- |
サンプルの解説
上記サンプルのとおり、アクセスされたURLに関するパス情報を取得することができます。
並べてみると、こんな感じになります。
1 2 | http://localhost:8080/TestWeb/urltest/aaa?bbb=ccc [scheme]://[serverName]:[serverPort][contextPath][servletPath][pathInfo]?[queryString] |
これを組み合わせれば、画像ファイルなどのリソースなども安心ですね。
まあ、さすがにサーバー名あたりまではいらんかもしれないけどw