web.xmlの扱いでつまづいたのでまとめた
自己紹介
- 22卒、SE1年生。都内IT企業勤務。
- 高校教員免許取得、基本情報技術者(FE)。バイクに乗りたくて最近普通二輪免許を取得。
- プログラミングに関しては未熟者。インプット、アウトプットの場としてzennを利用しています。
こんにちは。noelです。
研修中にサーブレットのパス指定が中々うまくいかず、意図したサーブレットに遷移できなくて戸惑いました。「web.xml」のファイルの構成と処理の流れをまとめ直して理解を深めようと思います。
web.xmlとは
ざっくりいうとServletをどうやって呼び出すかの設定に使われるファイル。プロジェクト配下WEB-INFディレクトリの中に設置します。
仕組み理解のため、「Hello Servlet!」を出力する例で見てみます(APPサーバは起動しているものとします)。
hello
├─WEB-INF/src
│ └─HelloServlet.java
└─WEB-INF
└─web.xml
<web-app>
<servlet>
<servlet-name>HelloServletMapping</servlet-name> //③
<servlet-class>HelloServlet</servlet-class> //④
</servlet>
<servlet-mapping>
<servlet-name>HelloServletMapping</servlet-name> //②
<servlet-class>/HelloServlet</servlet-class> //①
</servlet-mapping>
</web-app>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException IOException{
PrintWriter out = response.getWriter();
out.println("Hello Servlet!");
}
}
ブラウザ上で
http://localhost:8080/hello/HelloServlet
を呼び出すと、まずweb.xmlに飛びます。
ブラウザ上のURLと一致するものを<servlet-mapping>タグ内の<url-pattern>から探します。 ---①
(今回はweb.xmlの構造が単純なのですぐ見つかりますが、実際のアプリケーションはたくさんのサーブレットを作成するため、もっと大量のタグの中から探すことになります)
次に、<url-pattern>とあわせて記述されている<servlet-name>を確認します。 ---②
②と<servlet>タグで囲まれた中にある<servlet-name>と一致するものを探します。 ---③
<servlet-name>とあわせて定義されている<servlet-class>に書かれているサーブレットファイルを呼び出します。 ---④
これで無事サーブレットに遷移でき、「Hello Servlet!」の画面を拝むことができます。
終わりに
実際はこんな安直にサーブレットパスをURLに直接ぶち込んだりはせず、jspファイル内のformで入力値を受け付け、action属性で処理をお願いするサーブレットを指定したりします。その時にも、今回のweb.xmlによるマッピング処理の流れが使われます。
混乱せず、様々なパターンで応用できるようにします。
Discussion