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 | Webアプリケーションごとに1つ生成され、Webアプリケーション全体に関する情報を保持する。 | ServletConfig#getServletContext() |
ServletConfig | サーブレット単位に生成され、個々のサーブレットに関する情報を保持する。 | Servlet#getServletConfig() |
- GenericServletはServlet、ServletConfigの両方のインターフェースを実装しているため、結局GenericServletからServletConfigもServletContextも取得できることになる。
シグネチャ | 説明 | |
---|---|---|
アプリケーションスコープ関連(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 のログファイルに出力する。 |
フォワード
取得方法 | 説明 | |
---|---|---|
ServletRequest#getRequestDispatcher(path) |
|
|
ServletContext#getRequestDispatcher(path) |
|
- "/"から始まる場合は、どちらも動作は変わらない。(コンテキストルートからの相対パス)
- 同一コンテナ内の他のWebアプリケーションへフォワードしたい場合には、ServletContext#getContext(uripath)で他のWebアプリケーションのコンテキストを取得し、そのコンテキストからgetRequestDispatcher()を取得し、フォワードする。
シグネチャ | 説明 | |
---|---|---|
public void forward(ServletRequest request, ServletResponse response) | Servletからサーバ上の他のリソース (Servlet、JSP ファイル、HTMLファイル) へとリクエストをフォワードする。転送先で処理が完結するため、呼び出し元に制御は返ってこない。 | |
public void include(ServletRequest request, ServletResponse response) | リソース (Servlet、JSP ファイル、HTML ファイル) の内容をレスポンスにインクルードする。インクルード先の処理が終わると、呼び出し元に制御が返ってくる。 |
- インクルードの場合は、インクルード前後でHTMLを書きだすなどの処理を行うことができるが、forwardではできない。
- フォワード元のURL
- http://localhost:8080/sampleApp/SampleServlet1/test1/?key11=value11&key12=value12
- フォワード先のURL
- http://localhost:8080/sampleApp/SampleServlet2/test2/?key21=value21&key22=value22
メソッド | 戻り値 |
---|---|
getRequestURI() | /sampleApp/SampleServlet2/test2 |
getServletPath() | /SampleServlet2 |
getPathInfo() | /test2 |
getQueryString() | key21=value21&key22=value22 |
- フォワード先のパス情報が戻り値として返される。
- フォワード元のパス情報はリクエストスコープに格納される。
- インクルード元のURL
- http://localhost:8080/sampleApp/SampleServlet1/test1/?key11=value11&key12=value12
- インクルード先のURL
- http://localhost:8080/sampleApp/SampleServlet2/test2/?key21=value21&key22=value22
メソッド | 戻り値 |
---|---|
getRequestURI() | /sampleApp/SampleServlet1/test1 |
getServletPath() | /SampleServlet1 |
getPathInfo() | /test1 |
getQueryString() | key11=value11&ke12=value12 |
- インクルード元のパス情報が戻り値として返される。
- インクルード先のパス情報はリクエストスコープに格納される。
属性 | 説明 | |
---|---|---|
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 | フォワード元のクエリストリング(ない場合は属性は追加されない) |
- フォワード元パス情報が格納される
属性 | 説明 | |
---|---|---|
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というイベントはない。
シグネチャ | 説明 | |
---|---|---|
public void contextInitialized(ServletContextEvent sce) | ServletContext生成直後に呼び出される。イベントからはServletContextオブジェクトが取得できる。 | |
public void contextDestroyed(ServletContextEvent sce) | ServletContext破棄直前に呼び出される。イベントからはServletContextオブジェクトが取得できる。 |
シグネチャ | 説明 | |
---|---|---|
public void attributeAdded(ServletContextAttributeEvent scab) | 属性追加直後に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。 | |
public void attributeRemoved(ServletContextAttributeEvent scab) | 属性削除直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている。 | |
public void attributeReplaced(ServletContextAttributeEvent scab) | 属性変更直後に呼び出される。イベントには変更される前の属性の情報(name, value)が格納されている。 |
- リスナは全て属性操作の直後に呼び出される。
- attributeRemovedおよびattributeReplacedの場合は、属性操作前の属性情報がイベントに格納される。
シグネチャ | 説明 | |
---|---|---|
public void sessionCreated(HttpSessionEvent se) | HttpSession生成直後に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。 | |
public void sessionDestroyed(HttpSessionEvent se) | HttpSession破棄直前に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。 |
- セッションのリスナのみ、Initializedではなく、Createdなので注意。
シグネチャ | 説明 | |
---|---|---|
public void attributeAdded(HttpSessionBindingEvent se) | 属性追加直後に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。 | |
public void attributeRemoved(HttpSessionBindingEvent se)) | 属性削除直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている | |
public void attributeReplaced(HttpSessionBindingEvent seb) | 属性変更直後に呼び出される。イベントには変更される前の属性の情報(name, value)が格納されている。 |
シグネチャ | 説明 | |
---|---|---|
public void sessionDidActivate(HttpSessionEvent se) | HttpSessionが活性化した直後に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。 | |
public void sessionWillPassivate(HttpSessionEvent se) | HttpSessionが非活性化する直前に呼び出される。イベントからはHttpSessionオブジェクトが取得できる。 |
シグネチャ | 説明 | |
---|---|---|
public void valueBound(HttpSessionBindingEvent event) | このリスナがHttpSessionの属性として追加される直前に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。 | |
public void valueUnbound(HttpSessionBindingEvent event) | このリスナがHttpSessionの属性から削除された直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている。 |
シグネチャ | 説明 | |
---|---|---|
public void requestInitialized(ServletRequestEvent sre) | ServletRequest生成直後に呼び出される。イベントからはServletRequestおよびServletContextが取得できる。 | |
public void requestDestroyed(ServletRequestEvent sre) | ServletRequest破棄直前に呼び出される。イベントからはServletRequestおよびServletContextが取得できる。 |
シグネチャ | 説明 | |
---|---|---|
public void attributeAdded(ServletRequestAttributeEvent srae) | 属性追加直後に呼び出される。イベントには追加された属性の情報(name, value)が格納されている。 | |
public void attributeRemoved(ServletRequestAttributeEvent srae) | 属性削除直後に呼び出される。イベントには削除された属性の情報(name, value)が格納されている | |
public void attributeReplaced(ServletRequestAttributeEvent srae) | 属性変更直後に呼び出される。イベントには変更される前の属性の情報(name, value)が格納されている。 |
フィルタ
インターフェース名 | 説明 | |
---|---|---|
Filter | フィルタを作成する際に実装するインターフェース。 | |
FilterConfig | フィルタ設定を保持する。フィルタ初期化時にコンテナから渡されるものであり、開発者は実装する必要はない。 | |
FilterChain | 次のフィルタへ処理をつなぐ際に呼び出す。フィルタ実行時にコンテナから渡されるものであり、開発者は実装する必要はない。 |
シグネチャ | 説明 | |
---|---|---|
public void init(FilterConfig filterConfig) | フィルタ初期化時に呼び出される。フィルタは、コンテナ起動時にインスタンス化され、その後同じインスタンスが使いまわされる。 | |
public void destroy() | フィルタ破棄時に呼び出される。 | |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | フィルタ実行時に呼び出される。開発者はフィルタで行いたい処理をこのメソッド内に実装する。また、必要に応じて次のフィルタの呼び出しを行う。 |
シグネチャ | 説明 | |
---|---|---|
public String getFilterName() | web.xmlで指定したフィルタ名を取得する。 | |
public String getInitParameter(String name) | web.xmlで指定したフィルタの初期化パラメータを取得する。 | |
public Enumeration getInitParameterNames() | web.xmlで指定したフィルタの初期化パラメータの、全てのパラメータ名の列挙を取得する。 | |
public ServletContext getServletContext() | 関連しているServletContextを取得する。 |
シグネチャ | 説明 | |
---|---|---|
public void doFilter(ServletRequest request, ServletResponse response) | 次のフィルタを呼び出す。フィルタの最後に到達した場合は、元々要求されていたリソース(サーブレットなど)を呼び出す。 |
要素 | 多重度 | 説明 |
---|---|---|
filter-mapping | * | フィルタのマッピング定義。 |
filter-name | 1 | filterタグ内で定義したフィルタ名。このタグより前にfilterタグで定義されている名前を指定する必要がある。 |
url-pattern | servlet-name | + | フィルタを適用するURLパターン、またはサーブレット名。全てのURLに適用する場合は /* 全てのサーブレット名に適用する場合は * を指定する。 |
dispatcher | 0..4 |
|
あるリクエストに対して複数のフィルタが適用される場合、実行順序はどのように制御されるか。
- url-pattern属性に合致するものをweb.xmlの記述順に上から実行する。
- servlet-name属性に合致するものをweb.xmlの記述順に上から実行する。