このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
なかなか Struts が出てこないが、
まだ少し Serlvet について調べることがある。
Servlet API については大体分かったので、
次は Web アプリケーションのディレクトリ構造を調べよう。
Servlet コンテナに Web アプリケーションを導入することを
「Deployment」(配置・配備)と呼ぶが、
Servlet 規格では、この作業を単純化するため、
Web アプリケーションのディレクトリ構造を定めている。
原則として Web アプリケーションディレクトリ内には、
自由にファイルやサブディレクトリを作成して構わないが、
ルート直下にある META-INF と WEB-INF ディレクトリは、
Servlet コンテナによって特別な扱いを受け、
外部には直接公開されないようになっている。
そのため、直接公開したくない設定ファイルや、
アプリケーションの設定ファイルは、
このディレクトリ配下に格納すると良い。
また、以下のパスには明確な役割が決められている。
/WEB-INF/web.xml
/WEB-INF/classes/(ディレクトリ)
/WEB-INF/lib/*.jar
/WEB-INF/web.xml は配備記述子と呼ばれ、
Servlet の割り当て等の Web アプリケーションに関する
各種設定情報を記述したファイルである。
Servlet コンテナはこのファイルを読み取って
Web アプリケーションをコンテキストにロードする。
この内容についてはまた後で調べることにしよう。
/WEB-INF/classes/ ディレクトリ配下には、
Java の CLASS ファイルやリソース等を格納する。
このディレクトリは Servlet コンテナによって、
実行時に CLASSPATH の先頭に追加される。
つまり、Web アプリケーション用のコードやリソースは、
ビルドしてこのディレクトリに出力すれば良い。
/WEB-INF/lib/ ディレクトリ直下には、
ライブラリ(JAR ファイル)を格納する。
これら *.jar ファイルも全て、
実行時に CLASSPATH に追加される。
Web アプリケーションが依存する、
ライブラリやフレームワークなどは、
このディレクトリに配置すれば良い。
このような特性があるため、classes や lib 配下には、
関係ないファイルを格納すべきではない。
上記レイアウトに沿ってファイルを配置した場合、
Servlet コンテナによっては、決められたディレクトリに、
上記を丸ごとコピーするだけで配備が完了する。
また、上記レイアウトのディレクトリを圧縮し、
WAR ファイルを作成した場合、
WAR ファイル単独で持ち運べるようになる。
さて、例として、JSP と 自前の Servlet を使った
Web アプリケーションのレイアウトを考えてみよう。
(環境)
・サーバは example.com 待機ポートは HTTP (80)
・アプリの配備されたコンテキストのパスは、/mysys
・自前の Servlet 実装クラスは jp.loafer.MyServlet
・*.jsp には JSP を割り当てるとする
・*.my には MyServlet を割り当てるとする
・ファイル
/index.jsp(ホームページ)
/login.jsp(ログインページ等)
/menu.js(外部からアクセス可能なファイル)
/res/default.css(上に同じ。パスを切っても良い)
/WEB-INF/web.xml(配備記述子)
/WEB-INF/lib/commons-lang-2.3.jar(ライブラリ等)
/WEB-INF/classes/jp/loafer/MyServlet.class
/WEB-INF/mysys-config.xml(アプリ固有の設定等)
上記の場合、menu.js や default.css は、
http://example.com/mysys/menu.js のようにアクセス可能。
*.js や *.css には Servlet を割り当てていないが、
Servlet コンテナの既定の処理(default servlet)により、
Web サーバと同じように直接ファイルが公開される。
しかし、mysys-config.xml はWEB-INF 内にあるため、
http://example.com/mysys/WEB-INF/mysys-config.xml では、
404 Not Found となりアクセスできない。