cf.

はじめに(試験範囲とJ2EEシステムの全体像)

AllAboutJ2EE.png
  1. HTTP ( RFC-2616 http://www.ietf.org/rfc/rfc2616 )
  2. J2EE 1.4
    • Java Servlet 2.4 (JSR-154)
    • JSP*1 2.0 (JSR-152)

Webアプリの構成

war.png
  1. Webアプリのみの場合には、WARファイルのみで配備(deploy)する
  2. EJBアプリと一緒に配備(deploy)するときには、EARファイルにまとめる

メモリ領域のスコープ

Scope.png
  1. Page
    • JSPプログラム内で有効なメモリ領域
  2. Request
    • クライアントからのRequestを受け取り、Responseを返すまで有効なメモリ領域
  3. Session
    • ユーザがログインしてから、ログアウトするまで有効なメモリ領域
  4. ServletConfig
    • 各Servletに共通するメモリ領域
    • web.xmlの記述事項を読み取ることができる cf.付録
  5. ServletContext
    • アプリケーション全体に共通するメモリ領域
    • web.xmlの記述事項を読み取ることができる cf.付録

HTTP REQUSETとRESPONSE

  1. HTTP REQUEST
    httpRequest.png
    1. Method
      1. GET ファイル要求
      2. POST クエリとファイル要求
      3. HEAD ヘッダのみ要求
      4. DELETE ファイル削除
      5. PUT ファイル上書き
      6. TRACE 通信経路(Proxy)の照会
      7. OPTIONS サポートされるMethodの照会
      8. CONNECT Proxyへのトンネリング要求
    2. GET
      1. POSTからRequest Body を省いたもの(CR+LFまで同じ)
      2. クエリ要求を送るときには、File Nameに Request Body の形式で追記
        http://foo.com/register.do?user=taro&mail=taro@foo.com&pass=PASS
  2. HTTP RESPONSE
    httpResponse.png
    1. Status Codes
      1. 200 OK
      2. 301 Moved Permanently
      3. 307 Temporary Redirect
      4. 401 Unauthorized
      5. 404 Not Found
      6. 500 Internal Server Error
    2. Status Code 301/307
      • ブラウザに、指定したURLを読み込むよう要求(実際のシステムでは使わないが試験に出る)
      • Response Header に Location を記述
      • ServletのdoGet() / doPost()でやるには
        res.setStatus( HttpServletResponse.SC_MOVED_PERMANENTLY);
        res.setHeader( “Location” , “http://backup1.foo.com/” );
        eq.
        res.sendRedirect(“http://backup1.foo.com/” );

javax.servlet.http.HttpServletRequest extends ServletRequest

実装メソッド解説
REQUEST LINEにアクセス(ex. "GET http://localhost:8080/SJCWC/index.jsp?key1=value1&key2=1 HTTP/1.1")
StringgetMethod()(ex. "GET")
StringgetContextPath?()(ex. "/SJCWC" )
StringgetQueryString?()(ex. "key1=value1&key2=value2")
StringgetRequestURI()(ex. "/SJCWC/index.jsp")
StringBuffer?getRequestURL()(ex. "http://localhost:8080/SJCWC/index.jsp")
StringgetServletPath?()(ex. "/index.jsp")
StringgetPathInfo?()本来はコンテキストルートのフルパス(ex. "/srv/www/htdocs/") Tomcat 5.5では null が返る
StringgetPathTranslated?()本来はリクエストされたファイルのフルパス (ex. "/srv/www/htdocs/SJCWC/index.jsp") Tomcat 5.5では null が返る
StringgetProtocol()(ex. "HTTP/1.1")
HTTP REQUEST HEADER にアクセス
EnumerationgetHeaderNames?()
StringgetHeader(String name)
intgetIntHeader?(String name)
longgetDateHeader?(String name)
EnumerationgetHeaders(String name)
intgetContentLength?()
StringgetContentType?()
LocalegetLocale()
EnumerationgetLocales()
HTTP REQUEST BODY にアクセス
ServletInputStream?getInputStream?()
BufferedReader?getReader()getReader() を使うと、getParameter()は使えなくなる。逆にgetParameter()で一つでもパラメータを取り出すと getReader()は使えなくなる。
StringgetParameter(String name)
MapgetParameterMap?()
EnumerationgetParameterNames?()
String[]getParameterValues?(String name)
User情報にアクセス
StringgetAuthType?()null(認証されていない)、BASIC_AUTH、CLIENT_CERT_AUTH、DIGEST_AUTH、FORM_AUTH
StringgetRemoteUser?()
PrincipalgetUserPrincipal?()ユーザ名は java.security.Principal#getName() で得られる
booleanisUserInRole?(String role)ユーザは指定されたロールに属すか?(ユーザがどのロールに属すかを返すメソッドはJ2EEでは未定義)
Cookie情報にアクセス
Cookie[]getCookies()
Session領域を取得
HttpSessiongetSession(boolean create)create=true : Sessionオブジェクトが無いときには新たに作る。create=false : Sessionオブジェクトが無いときには null が返る
HttpSessiongetSession()getSession(true) と同じ
Session管理(コンテナやフレームワークが使う)
StringgetRequestedSessionId?()
booleanisRequestedSessionIdFromCookie?()
booleanisRequestedSessionIdFromURL()
booleanisRequestedSessionIdValid?()
Request領域の操作
EnumerationgetAttributeNames?()
ObjectgetAttribute(String name)
voidremoveAttribute(String name)
voidsetAttribute(String name, Object o)
その他
StringgetCharacterEncoding?()
voidsetCharacterEncoding?(String env)
StringgetRemoteAddr?()
StringgetRemoteHost?()
StringgetScheme()ftp、http、httpsなどを返す
StringgetServerName?()
intgetServerPort?()
booleanisSecure()https のとき true 、http のとき false
RequestDispatchergetRequestDispatcher?(String path)web.xmlで、pathに割り付けた、RequestDispatcher を返す

javax.servlet.http.HttpServletResponse extends ServletResponse

実装メソッド解説
HTTP RESPONSE STATUS LINE にアクセス
voidsetStatus(int sc)
voidsendError(int sc)
voidsendError(int sc, String msg)
voidsendRedirect(String location)
StringencodeRedirectURL(String url)sendRedirect メソッドの引数を作る。リダイレクト先 url に "&jsessionid=${Session ID}" を埋目込む
HTTP RESPONSE HEADER にアクセス
voidaddHeader(String name, String value)
voidaddIntHeader?(String name, int value)
voidaddDateHeader?(String name, long date)
voidsetHeader(String name, String value)
voidsetDateHeader?(String name, long date)
voidsetIntHeader?(String name, int value)
booleancontainsHeader(String name)
voidsetContentLength?(int len)
voidsetContentType?(String type)"Content-Type: text/html; charset=EUC-JP"
StringgetCharacterEncoding?()"Content-Type: text/html; charset=EUC-JP" の charset を得る
voidsetLocale(Locale loc)
LocalegetLocale()
HTTP RESPONSE MESSAGE BODY にアクセス
StringencodeURL(String url)HTTP文書の加工。url に "&jsessionid=${Session ID}" を埋目込む
ServletOutputStream?getOutputStream?()バイナリを MESSAGE BODY として出力( jpeg など )
PrintWriter?getWriter()テキストを MESSAGE BODY として出力( html など )
voidsetBufferSize?(int size)
intgetBufferSize?()
voidflushBuffer()
booleanisCommitted()
voidreset()HTTP RESPONSE HEADER( Status Code )をクリアして、バッファの内容をクリア。STATUS , HEADER を書き換えるときには、まずこのメソッドを実行 (J2EEコンテナが規定値を設定しているから)
voidresetBuffer()HTTP RESPONSE HEADER( Status Code )をクリアせずに、バッファの内容をクリア。Content-Type を書き換えて HTML文書 以外をクライアントに返信するときに使う
Cookie にアクセス
voidaddCookie(Cookie cookie)

javax.servlet.http.HttpSession

実装メソッド解説
Session領域を操作
EnumerationgetAttributeNames?()
ObjectgetAttribute(String name)
voidremoveAttribute(String name)
voidsetAttribute(String name, Object o)
タイムアウト処理
longgetCreationTime?()Session開始時刻
longgetLastAccessedTime?()最終アクセス時刻
intgetMaxInactiveInterval?()タイムアウト間隔(web.xml の <session-config><session-timeout></session-timeout></session-config>で指定したものの秒数)
voidsetMaxInactiveInterval?(int interval)タイムアウト間隔(秒数指定)
Session管理
voidinvalidate()セッションの無効化。→ HttpSessionBindingListener#valueUnbound()
booleanisNew()
StringgetId()
ServletContext領域取得
ServletContextgetServletContext()

Servlet

httpServlet.png

javax.servlet.http.HttpServlet? extends GenericServlet?

  1. void service(ServletRequest? req, ServletResponse? res)
    • protected void service(HttpServletRequest? req, HttpServletResponse? resp) を呼び出すだけ
  2. protected void service(HttpServletRequest? req, HttpServletResponse? resp)
    • HTTP REQUEST LINE の REQUEST METHOD にしたがって doXXX() を呼び出す
    • 必要が有れば、User Program で service(req,res) を overwrite する。
  3. protected void doXXX(HttpServletRequest? req, HttpServletResponse? resp)
    • HttpServlet?では、エラー(400 Bad Request(HTTP1.0) / 405 Method Not Allowed(HTTP1.1))を返すように実装されている。
    • XXX メソッドに対応する処理を実装したい場合は、User Program で doXXX() を overwrite する。
    • HttpServlet? では、以下の7つのメソッドが用意されている。
      1. protected void doDelete(HttpServletRequest? req, HttpServletResponse? resp)
      2. protected void doGet(HttpServletRequest? req, HttpServletResponse? resp)
      3. protected void doHead(HttpServletRequest? req, HttpServletResponse? resp)
      4. protected void doOptions(HttpServletRequest? req, HttpServletResponse? resp)
      5. protected void doPost(HttpServletRequest? req, HttpServletResponse? resp)
      6. protected void doPut(HttpServletRequest? req, HttpServletResponse? resp)
      7. protected void doTrace(HttpServletRequest? req, HttpServletResponse? resp)
  4. protected long getLastModified?(HttpServletRequest? req)
    • この Servlet が最後に更新された時刻を、GMT 1970 年 1 月 1 日 0 時からのミリ秒数で返す

javax.servlet.GenericServlet? implements Servlet,ServletConfig?

  1. Servletインタフェースの実装メソッド
    1. void init(ServletConfig? config)
      • 内部フィールドに引数の ServletConfig? を格納して、init() を呼び出すだけ
        this.config = config
        init();
    2. void destroy()
      • GenericServlet? の実装では何もしていない
      • 必要が有れば、User Program で destroy() を overwrite する。
    3. ServletConfig? getServletConfig?()
  2. ServletConfigインタフェースの実装メソッド
    1. web.xmlの定義を取得
      • Enumeration getInitParameterNames?()
      • String getInitParameter?(String name)
    2. J2EEコンテナ情報
      • String getServletName?()
    3. ServletContextを取得
  3. GenericServlet?独自の実装
    1. void init()
      • GenericServlet? の実装では何もしていない
      • 必要が有れば、User Program で init() を overwrite する。
    2. void log(String msg)
    3. void log(String message, Throwable t)
    4. String getServletInfo?()
      • GenericServlet? の実装では何もしていない
      • 必要が有れば、User Program で getServletInfo?() を overwrite する。
    5. abstract void service(ServletRequest? req, ServletResponse? res)
      • HttpServlet?で実装

javax.servlet.ServletContext

実装メソッド解説
J2EEコンテナ情報
StringgetServerInfo?()
intgetMajorVersion?()
intgetMinorVersion?()
アプリケーション共有メモリ領域
EnumerationgetAttributeNames?()
voidsetAttribute(String name, Object object)
ObjectgetAttribute(String name)
voidremoveAttribute(String name)
アプリケーション初期化情報(cf.付録)
ServletContext?getContext(String uripath)他のServletContext?を得る
StringgetInitParameter?(String name)web.xmlの<context-param>に記述された設定値を得る
EnumerationgetInitParameterNames?()web.xmlの<context-param>に記述された設定値を得る
StringgetServletContextName?()web.xmlの<display-name>で定義された名前
Webアプリケーション情報・ユーティリティ
StringgetRealPath?(String path)相対パスpathの絶対パス(URL)を得る
URLgetResource(String path)相対パスpathの絶対パス(URL)を得る
SetgetResourcePaths?(String path)相対パスpath以下の相対パス(URL)を得る
InputStream?getResourceAsStream?(String path)webアプリ内のファイルを得る
StringgetMimeType?(String file)ファイル名fileのMIME型。web.xmlの<mime-mapping> で定義されたMIMEタイプ。不明の場合はnull。
voidlog(String msg)
voidlog(String message, Throwable throwable)
RequestDispatcher?getNamedDispatcher?(String name)
RequestDispatcher?getRequestDispatcher?(String path)

フィルタ

filter.png

イベントリスナ処理

web.xml(<listener>)に登録するもの

リスナイベント処理メソッドイベントの属性
ServletContext?変更時
ServletContextListener?void contextInitialized(ServletContextEvent? event)event#getServletContext?()
void contextDestroyed(ServletContextEvent? event)
ServletContextAttributeListener?void attributeAdded(ServletContextAttributeEvent? event)event#getName() , event#getValue()
void attributeRemoved(ServletContextAttributeEvent? event)
void attributeReplaced(ServletContextAttributeEvent? event)
ServletRequest?変更時
ServletRequestListener?void RequestInitialized?(ServletRequestEvent? event)event#getServletContext?() , event#getServletRequest?()
void RequestDestroyed?(ServletRequestEvent? event)
ServletRequestAttributeListener?void attributeAdded(ServletRequestAttributeEvent? event)event#getName() , event#getValue()
void attributeRemoved(ServletRequestAttributeEvent? event)
void attributeReplaced(ServletRequestAttributeEvent? event)
HttpSession?変更時
HttpSessionListener?void sessionCreated(HttpSessionEvent? event)event#getSession()
void sessionDestroyed(HttpSessionEvent? event)
HttpSessionAttributeListener?void attributeAdded(HttpSessionBindingEvent? event)event#getName() , event#getValue() , event#getSession()
void attributeRemoved(HttpSessionBindingEvent? event)
void attributeReplaced(HttpSessionBindingEvent? event)

web.xml(<listener>)に登録しないもの(HttpSession?に登録するクラスにimplementする)

リスナイベント処理メソッドイベントの属性
HttpSession?変更時
HttpSessionActivationListener?void sessionDidActivate?(HttpSessionEvent? event)event#getSession()
void sessionWillPassivate?(HttpSessionEvent? event)
HttpSessionBindingListenervoid valueBound(HttpSessionBindingEvent? event)event#getName() , event#getValue() , event#getSession()
void valueUnbound(HttpSessionBindingEvent? event)

RequestDispatcher

  1. RequestDispatcher?は、J2EEコンテナによって作られる
    • ユーザプログラムから要求があると、J2EEコンテナは、JSP/Servlet を Wrap した RequestDispatcher?を生成する。
    • アプリケーションプログラムで作ったり、web.xmlに登録したりしない
  2. 取得方法
    メソッド引数(例)
    ServletContext?#getRequestDispatcher?(String url)/hello(URL)
    ServletContext?#getRequestNamedDispatcher?(String path)helloServlet(web.xmlの<servlet-mapping>への登録名)
    ServletRequest?#getRequestDispatcher?(String path)helloServlet(web.xmlの<servlet-mapping>への登録名
  3. 使い方
    1. RequestDispatcher?の処理結果をincludeする
      RequestDispatcher#include(req,res);
    2. RequestDispatcher?に処理を委譲する
      RequestDispatcher#forward(req,res);
  4. ServletからJSPに遷移するときの定石コード
    // JSPに描画するデータの格納
    req.setAttribute("Order", orderBean);
    req.setAttribute("Customer", customerBean);
    req.setAttribute("Bill", billBean);
    // JSP呼び出し
    req.getRequestDispatcher("/pages/hoge.jsp").forward(req,res);

ServletRequestWrapper?

  1. ServletRequestWrapper? implements ServletRequest?
    • コンストラクタ
      ServletRequestWrapper(ServletRequest request)
    • ServletRequestWrapper?自体は、コンストラクタで指定したServletRequest?のメソッドを呼び出す
    • 必要な機能を override する
  2. Filterで使う
    Filter#doFilter(req,res,chain){
      ServletRequest reqW = new MyServlerRequestWrapper( req );
      chain.doFileter( reqW , res ) 
    }

参考文献

  1. JSR 154 JavaTM Servlet 2.4 仕様書, http://jcp.org/en/jsr/detail?id=154 (こちらを主に勉強)
  2. SUN教科書 Webコンポーネントデベロッパ(SJC-WC 310-81) 翔栄社 米山学 2006 (補足資料、練習問題)
    AMAZON

Java


*1 Java Server Page

添付ファイル: filehttpServlet.png 1440件 [詳細] filewar.png 1543件 [詳細] fileAllAboutJ2EE.png 1929件 [詳細] filefilter.png 1427件 [詳細] filehttpRequest.png 1463件 [詳細] filehttpResponse.png 1420件 [詳細] fileScope.png 1367件 [詳細] fileSJCWC.war 2323件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2007-01-21 (日) 19:59:05 (3604d)
ISBN10
ISBN13
9784061426061