Section3: Webコンテナモデル

各種初期化パラメータ
名前 説明 設定方法 取得方法
コンテキスト初期化パラメータ Webアプリケーションごとに設定される。 web.xmlのcontext-paramタグ ServletContext#getInitParameter(name)
サーブレット初期化パラメータ サーブレットごとに設定される。 web.xml内のservletタグ内のinit-paramタグ ServletConfig#getInitParameter(name)
フィルタ初期化パラメータ フィルタごとに設定される。 web.xml内のfilterタグ内のinit-paramタグ FilterConfig#getInitParameter(name)
  • GenericServletはServletConfigインターフェースを実装しているので、GenericServletからサーブレット初期化パラメータを取得できる。
ServletContextとServletConfig
ServletContext、ServletConfig それぞれが保持する情報の特徴と、それぞれのインスタンスの取得方法を答えよ。
名前 説明 取得方法
ServletContext Webアプリケーションごとに1つ生成され、Webアプリケーション全体に関する情報を保持する。 ServletConfig#getServletContext()
ServletConfig サーブレット単位に生成され、個々のサーブレットに関する情報を保持する。 Servlet#getServletConfig()
  • GenericServletはServlet、ServletConfigの両方のインターフェースを実装しているため、結局GenericServletからServletConfigもServletContextも取得できることになる。
ServletContextのAPI
シグネチャ 説明
アプリケーションスコープ関連(4種)
public Object getAttribute(String name) アプリケーションスコープから属性値を取得する。対応する値がなければnull。
public Enumeration getAttributeNames() アプリケーションスコープに格納されている全ての属性の名前を列挙として返す。
public void setAttribute(String name, Object object) アプリケーションスコープに属性を追加する。
public void removeAttribute(String name) アプリケーションスコープに格納されている属性を削除する。
コンテキスト初期化パラメータ関連(2種)
public String getInitParameter(String name) コンテキスト初期化パラメータを取得する。対応する値がなければnull。
public Enumeration getInitParameterNames() コンテキスト初期化パラメータの全ての名前を列挙として返す。
その他コンテキスト関連(2種)
public String getServletContextName() この Web アプリケーションの名前を返します。
public ServletContext getContext(String uripath) 指定されたURLに対応する、同じコンテナ上の別Webアプリケーションのコンテキストを取得する。[Tomcat6.0では、server.xmlのContextタグにcrossContext=trueを設定する必要がある]
コンテナ情報の取得(3種)
public int getMajorVersion() この Servlet コンテナがサポートしている Java Servlet API のメジャーバージョンを返す。
public int getMinorVersion() この Servlet コンテナがサポートしている Java Servlet API のマイナーバージョンを返す。
public String getServerInfo() Servlet コンテナの名前やバージョンを返す。[Tomcat6.0の出力: Apache Tomcat/6.0.29]
ディスパッチャ関連(2種)
public RequestDispatcher getRequestDispatcher(String path) 指定されたパスに位置するリソースのラッパーとして動作する RequestDispatcher オブジェクトを返す。
public RequestDispatcher getNamedDispatcher(String name) 指定されたサーブレット名のラッパーとして動作する RequestDispatcher オブジェクトを返す。
リソース情報関連(5種)
public String getRealPath(String path) 与えられた仮想パスに対応する実際のパスを返す。
public URL getResource(String path) 指定されたパスでマッピングされているリソースの URL を返す。
public Set getResourcePaths(String path) 引数で指定されたパスに一致するものが Web アプリケーション内にあると、そのサブパス以下にある全てのリソースのパス名をディレクトリに似た形式のリストにして返す。
public InputStream getResourceAsStream(String path) 指定されたパスに相当するリソースを InputStream オブジェクトで返す。
public String getMimeType(String file) 指定されたファイルの MIME タイプを返す。
ログ関連(2種)
public void log(String msg) Servlet ログファイルに指定されたメッセージを出力する。
public void log(String message, Throwable throwable) 与えられた Throwable 例外の説明となるメッセージとスタックトレースを Servlet のログファイルに出力する。
フォワード
RequestDispatcherの取得方法
取得方法 説明
ServletRequest#getRequestDispatcher(path)
  • "/"から始まる場合。コンテキストルートからの相対パス。
  • "/"から始まらない場合。リクエストを処理したサーブレットのサーブレットパスからの相対パス。
ServletContext#getRequestDispatcher(path)
  • "/"から始まる場合。コンテキストルートからの相対パス。
  • "/"から始まらない場合はエラー。(必ず"/"から始める必要がある)
  • "/"から始まる場合は、どちらも動作は変わらない。(コンテキストルートからの相対パス)
  • 同一コンテナ内の他のWebアプリケーションへフォワードしたい場合には、ServletContext#getContext(uripath)で他のWebアプリケーションのコンテキストを取得し、そのコンテキストからgetRequestDispatcher()を取得し、フォワードする。
RequestDispatcherのAPI(2種)
シグネチャ 説明
public void forward(ServletRequest request, ServletResponse response) Servletからサーバ上の他のリソース (Servlet、JSP ファイル、HTMLファイル) へとリクエストをフォワードする。転送先で処理が完結するため、呼び出し元に制御は返ってこない。
public void include(ServletRequest request, ServletResponse response) リソース (Servlet、JSP ファイル、HTML ファイル) の内容をレスポンスにインクルードする。インクルード先の処理が終わると、呼び出し元に制御が返ってくる。
  • インクルードの場合は、インクルード前後でHTMLを書きだすなどの処理を行うことができるが、forwardではできない。
forward実行時のHttpServletRequestのパス関連取得メソッド
フォワード元のURL
http://localhost:8080/sampleApp/SampleServlet1/test1/?key11=value11&key12=value12
フォワード先のURL
http://localhost:8080/sampleApp/SampleServlet2/test2/?key21=value21&key22=value22
としたときに、フォワード先のServletでHttpServletRequestの以下のパス関連情報メソッドを実行すると何を返すか?
メソッド 戻り値
getRequestURI() /sampleApp/SampleServlet2/test2
getServletPath() /SampleServlet2
getPathInfo() /test2
getQueryString() key21=value21&key22=value22
  • フォワード先のパス情報が戻り値として返される。
  • フォワード元のパス情報はリクエストスコープに格納される。
include実行時のHttpServletRequestのパス関連取得メソッド
インクルード元のURL
http://localhost:8080/sampleApp/SampleServlet1/test1/?key11=value11&key12=value12
インクルード先のURL
http://localhost:8080/sampleApp/SampleServlet2/test2/?key21=value21&key22=value22
としたときに、インクルード先のServletでHttpServletRequestの以下のパス関連情報メソッドを呼び出すと何を返すか?
メソッド 戻り値
getRequestURI() /sampleApp/SampleServlet1/test1
getServletPath() /SampleServlet1
getPathInfo() /test1
getQueryString() key11=value11&ke12=value12
  • インクルード元のパス情報が戻り値として返される。
  • インクルード先のパス情報はリクエストスコープに格納される。
forward実行時に追加されるリクエストスコープの属性
属性 説明
javax.servlet.forward.request_uri フォワード元のリクエストURI
javax.servlet.forward.context_path フォワード元のコンテキストパス
javax.servlet.forward.servlet_path フォワード元のサーブレットパス
javax.servlet.forward.path_info フォワード元の拡張パス(ない場合は属性は追加されない)
javax.servlet.forward.query_string フォワード元のクエリストリング(ない場合は属性は追加されない)
  • フォワード元パス情報が格納される
include実行時に追加されるリクエストスコープの属性
属性 説明
javax.servlet.include.request_uri インクルード先のリクエストURI
javax.servlet.include.context_path インクルード先のコンテキストパス
javax.servlet.include.servlet_path インクルード先のサーブレットパス
javax.servlet.include.path_info インクルード先の拡張パス(ない場合は属性は追加されない)
javax.servlet.include.query_string インクルード先のクエリストリング(ない場合は属性は追加されない)
  • インクルード先のパス情報が格納される
スコープ
スコープの種類
スコープ名 情報を格納するオブジェクト 説明
page JspContext(PageContextの親クラス) JSPのページ内でのみ有効なスコープ。JSPでのみ使用可能。
request ServletRequest 1リクエスト内でのみ有効なスコープ。フォワードした場合は、フォワード元およびフォワード先で情報共有が可能
session HttpSession 1クライアントの複数リクエストをまたいで有効となるスコープ。
application ServletContext Webアプリケーション全体で有効なスコープ。
スコープの属性操作
メソッド 説明
Object getAttribute(String name) 属性を取得する。
void setAttribute(String name, Object value) 属性をセットする。
void removeAttribute(String name) 属性を削除する。
  • 上記メソッドは全てのスコープで使用可能
  • JspContextのみ、他のスコープの属性を操作する専用のメソッドが定義されている。(getAttribute(String name, int scope)など)
  • ServletRequest、HttpSession、ServletContextには、属性名の列挙を取得するgetAttributeNames()メソッドが定義されている。JspContextには、指定スコープから属性名の列挙を取得するgetAttributeNamesInScope(int scope)メソッドが定義されている。
リスナ
リスナとイベント
リスナ web.xmlでリスナの登録 リスナに渡されるイベント 説明
ServletContextListener 必要 ServletContextEvent ServletContextの生成・破棄を監視
ServletContextAttributeListener 必要 ServletContextAttributeEvent ServletContext(アプリケーションスコープ)の属性を監視
HttpSessionListener 必要 HttpSessionEvent HttpSessionの生成・破棄を監視
HttpSessionAttributeListener 必要 HttpSessionBindingEvent HttpSession(セッションスコープ)の属性を監視
HttpSessionActivationListener 不要 HttpSessionEvent HttpSessionの活性・非活性を監視(分散環境でセッションが利用される場合や、セッションをDBやファイルなどで永続的に保持するコンテナなどで利用)。
HttpSessionBindingListener 不要 HttpSessionBindingEvent リスナ自身がHttpSessionの属性に格納・削除されるかを監視。
ServletRequestListener 必要 ServletRequestEvent ServletRequestの生成・破棄を監視。
ServletRequestAttributeListener 必要 ServletRequestAttributeEvent ServletRequest(リクエストスコープ)の属性を監視。
  • HttpSessionのみリスナが多いので注意
  • HttpSessionAttributeListenerはHttpSessionBindingEventを受け取るので注意。HttpSessionAttributeEventというイベントはない。
ServletContextListerのAPI
シグネチャ 説明
public void contextInitialized(ServletContextEvent sce) ServletContext生成直後に呼び出される。イベントからはServletContextオブジェクトが取得できる。
public void contextDestroyed(ServletContextEvent sce) ServletContext破棄直前に呼び出される。イベントからはServletContextオブジェクトが取得できる。
ServletContextAttributeListenerのAPI
シグネチャ 説明
public void attributeAdded(ServletContextAttributeEvent scab) 属性追加直後に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。
public void attributeRemoved(ServletContextAttributeEvent scab) 属性削除直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている。
public void attributeReplaced(ServletContextAttributeEvent scab) 属性変更直後に呼び出される。イベントには変更される前の属性の情報(name, value)が格納されている。
  • リスナは全て属性操作の直後に呼び出される。
  • attributeRemovedおよびattributeReplacedの場合は、属性操作前の属性情報がイベントに格納される。
HttpSessionListenerのAPI
シグネチャ 説明
public void sessionCreated(HttpSessionEvent se) HttpSession生成直後に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。
public void sessionDestroyed(HttpSessionEvent se) HttpSession破棄直前に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。
  • セッションのリスナのみ、Initializedではなく、Createdなので注意。
HttpSessionAttributeListenerのAPI
シグネチャ 説明
public void attributeAdded(HttpSessionBindingEvent se) 属性追加直後に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。
public void attributeRemoved(HttpSessionBindingEvent se)) 属性削除直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている
public void attributeReplaced(HttpSessionBindingEvent seb) 属性変更直後に呼び出される。イベントには変更される前の属性の情報(name, value)が格納されている。
HttpSessionActivationListenerのAPI
シグネチャ 説明
public void sessionDidActivate(HttpSessionEvent se) HttpSessionが活性化した直後に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。
public void sessionWillPassivate(HttpSessionEvent se) HttpSessionが非活性化する直前に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。
HttpSessionBindingListenerのAPI
シグネチャ 説明
public void valueBound(HttpSessionBindingEvent event) このリスナがHttpSessionの属性として追加される直前に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。
public void valueUnbound(HttpSessionBindingEvent event) このリスナがHttpSessionの属性から削除された直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている。
ServletRequestListenerのAPI
シグネチャ 説明
public void requestInitialized(ServletRequestEvent sre) ServletRequest生成直後に呼び出される。イベントからはServletRequestおよびServletContextが取得できる。
public void requestDestroyed(ServletRequestEvent sre) ServletRequest破棄直前に呼び出される。イベントからはServletRequestおよびServletContextが取得できる。
ServletRequestAttributeListenerのAPI
シグネチャ 説明
public void attributeAdded(ServletRequestAttributeEvent srae) 属性追加直後に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。
public void attributeRemoved(ServletRequestAttributeEvent srae) 属性削除直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている
public void attributeReplaced(ServletRequestAttributeEvent srae) 属性変更直後に呼び出される。イベントには変更される前の属性の情報(name, value)が格納されている。
フィルタ
フィルタ関連のインターフェース
インターフェース名 説明
Filter フィルタを作成する際に実装するインターフェース。
FilterConfig フィルタ設定を保持する。フィルタ初期化時にコンテナから渡されるものであり、開発者は実装する必要はない。
FilterChain 次のフィルタへ処理をつなぐ際に呼び出す。フィルタ実行時にコンテナから渡されるものであり、開発者は実装する必要はない。
FilterのAPI
シグネチャ 説明
public void init(FilterConfig filterConfig) フィルタ初期化時に呼び出される。フィルタは、コンテナ起動時にインスタンス化され、その後同じインスタンスが使いまわされる。
public void destroy() フィルタ破棄時に呼び出される。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) フィルタ実行時に呼び出される。開発者はフィルタで行いたい処理をこのメソッド内に実装する。また、必要に応じて次のフィルタの呼び出しを行う。
FilterConfigのAPI
シグネチャ 説明
public String getFilterName() web.xmlで指定したフィルタ名を取得する。
public String getInitParameter(String name) web.xmlで指定したフィルタの初期化パラメータを取得する。
public Enumeration getInitParameterNames() web.xmlで指定したフィルタの初期化パラメータの、全てのパラメータ名の列挙を取得する。
public ServletContext getServletContext() 関連しているServletContextを取得する。
FilterChainのAPI
シグネチャ 説明
public void doFilter(ServletRequest request, ServletResponse response) 次のフィルタを呼び出す。フィルタの最後に到達した場合は、元々要求されていたリソース(サーブレットなど)を呼び出す。
filter-mappingタグでのフィルタの設定方法
要素 多重度 説明
filter-mapping*フィルタのマッピング定義。
filter-name1filterタグ内で定義したフィルタ名。このタグより前にfilterタグで定義されている名前を指定する必要がある。
url-pattern | servlet-name+フィルタを適用するURLパターン、またはサーブレット名。全てのURLに適用する場合は /* 全てのサーブレット名に適用する場合は * を指定する。
dispatcher0..4
REQUEST
通常のクライアントからのリクエストにフィルタを適用。(指定しない場合のデフォルト値)
FORWARD
フォワード時にフィルタを適用。
INCLUDE
インクルード時にフィルタを適用。
ERROR
エラー画面転送時にフィルタを適用。
フィルタの適用順序
あるリクエストに対して複数のフィルタが適用される場合、実行順序はどのように制御されるか。
  1. url-pattern属性に合致するものをweb.xmlの記述順に上から実行する。
  2. servlet-name属性に合致するものをweb.xmlの記述順に上から実行する。
inserted by FC2 system