ディレクテック株式会社
Novice Class Seminar JAVA Programmer
1.Servlet の開発... 1
1-1.Servlet の開発 / 配置 / 実行手順...1 1-2.ライブラリと環境変数 (CLASSPATH) の設定...2 1-3.最初の Servlet...3 1-4.Servlet の配置...7 1-5.Servlet の呼び出し(実行)...82.クライアントとの対話... 9
2-1.HTTP を意識したクライアントとの対話...9 2-2.GET でのクライアントとの対話...16 2-3.POST でのクライアントとの対話...19 2-4.MIME タイプとキャラクタセットの指定...233.クッキーの利用方法...25
3-1.クッキーの概要...25 3-2.クッキーを扱うクラス...27 3-3.クッキーの作成方法...31 3-4.クッキーの属性...32 3-5.クッキーの読み込み...344.セッション...35
4-1.セッションの概要...35 4-2.セッション管理のためのクラス...36 4-3.セッションオブジェクトの作成(セッションの開始)...37 4-4.セッションへの情報の設定...38 4-5.セッションの情報の取得...39 4-6.セッションの終了...405.ファイルアップロード...42
5-1.サーブレットでのファイルアップロード...42 5-2.ファイルアップロードを行うフォーム...43 5-3.ファイルアップロードを受け付けるサーブレット...446-2.クライアント側の準備...50 6-3.サーバー側プログラム...51
1-1.Servlet の開発 / 配置 / 実行手順 1.Servlet プログラムの開発 .java ソースプログラム .class 実行プログラム 2.Servlet 実行環境上への配置 Servlet 対応サーバーへの配置 配置はサーバー製品毎に異なる 3.HTTP 経由での Servlet の呼び出し(実行) HTML などから、Servlet を呼び出す GET / POST にて呼び出す
Servlet はサーバー上にて生成・初期化され実行される Java のプログラムである。コンパイル時に Servlet のク ラスライブラリ(J2EE に含まれている)が必要になるので CLASSPATH を設定する必要はあるが、Servlet を開発 する手順は、 常の Java アプリケーションの場合と変わらない。 Servlet のプログラムは Servlet 対応のアプリケーションサーバーから起動・実行されるので、実行するために はアプリケーションサーバー環境にて適切なディレクトリにプログラムは配置しなければならない。 サーバーに配置された Servlet は自ら動くものではない。Servlet は HTTP 経由の要求をトリガーとして、サーバー 上にて実行される。したがって、Servlet はブラウザ-などのクライアントから「要求」をサーバーに送信して、起動・ 実行していかなければならない。
1-2.ライブラリと環境変数 (CLASSPATH) の設定
Servlet の開発に必要なクラスライブラリは、J2EE(Java2 Enterprise Edition) に含まれている。J2EE は「http:// java.sun.com/」からダウンロードすることができる。 J2EE をダウンロードしインストールした後に、CLASSPATH のエントリにライブラリが含まれているファイル (j2ee.jar)へのパスを追加する。 例) CLASSPATH=.;C:\j2sdkee1.2.1\lib\j2ee.jar 上記の環境変数を設定したならば、 常の javac コマンドで Servlet プログラムのコンパイルまでは行うことがで きる。
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Hello extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // response の content type を設定 response.setContentType("text/html"); // クライアントへのプリントストリームを生成 PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println("<H1>Hello,JavaServlet</H1>"); out.println("</BODY>"); out.println("</HTML>"); // ストリームのフラッシュ out.flush(); } } Hello.java
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Hello extends HttpServlet{ } HTTP にて呼び出される Servlet は、「javax.servlet.HttpServ-let」を継承して作られる。
public abstract class HttpServlet extends javax.servlet.GenericServlet implements java.io.Serializable { public javax.servlet.http.HttpServlet(); protected void doDelete(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletRe-sponse) throws javax.servlet.ServletException, java.io.IOException; protected void doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; protected void doOptions(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; protected void doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; protected void doPut(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; protected void doTrace(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; protected long getLastModified(javax.servlet.http.HttpServletRequest);
public void service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) throws javax.servlet.ServletException, java.io.IOException; protected void service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; }
Servlet は Servlet を実行するサーバーから起動される。したがって Servlet を実行す るには、Servlet 対応のサーバー(Apache Tomcat など)をインストールした後に、サー バー・インスタンスがアクセスできるディレクトリに Servlet のプログラムを配置する。 以下では Apache Tomcat7.0.x(7.0.x はバージョン番号)を Mac OS X または Linux にインストールした例を解説している。
「/usr/local」に Tomcat をインストールした場合、”myapps”という名称のアプリケー ション(コンテクスト)名で Servlet を配置するデフォルトのパスは以下のとおり。
/usr/local/apache-tomcat-7.0.x/webapps/myapps/WEB-INF/classes
上記のディレクトリに Servlet のプログラム(.class)ファイルを配置する。配置し た Servlet を利用可能にするには、WEB-INF ディレクトリ内にある web.xml ファイル にて、Servlet クラスの登録を行う必要がある。以下は、HelloServlet.class(配置する Servlet クラス)を、Hello という名称で呼び出し可能とするための設定である。 途中省略 <servlet> <servlet-name>Hello</servlet-name> <servlet-class>HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name> <url-pattern>/Hello</url-pattern> </servlet-mapping>
1-5.Servlet の呼び出し(実行)
Servlet の呼び出しは、URL を指定して行う。以下のように URL を指定することで 呼び出すことができる。
http:// ホスト名 : ポート番号 /servlet/ サーブレット名
例)サーブレット「Hello」を myapps のディレクトリに配置している場合 http://localhost:8080/myapps/Hello
2-1.HTTP を意識したクライアントとの対話
H T T P では基本的にクライアントからサーバーに要求が送信されることで、クライア ント・サーバー間の対話が開始される。このときクライアントからサーバーに情報を送 信するタイプには「GET」と「POST」がある。
HttpServlet ではそれぞれに対応するメソッドとして、「doGet」「doPost」を用意し ている。 doGet GET を処理する場合のメソッド。 常の HTTP 接続要求は GET である。 doPost POST を処理する場合のメソッド。 HTML 文書内のフォームを送信する場合は POST が用いられる。
public abstract class HttpServlet extends javax.servlet.GenericServlet implements java.io.Serializable { protected void doGet(javax.servlet .http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; protected void doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) throws javax.servlet.ServletException, java.io.IOException; } 「d o G e t」メソッドと「d o P o s t」メソッドでは、クライアントと対話する ためのインターフェースとして、 「javax.servlet .http.HttpServletRe-quest」と「javax.servlet.http.HttpServletResponse」を用意している。 「javax.servlet .http.HttpServletRequest」は、クライアントから送信さ れてくる情報へのインターフェースである。サーブレットはこのインター フェースを利用してサーブレットに送信された情報にアクセスすることが できる。 「javax.servlet.http.HttpServletResponse」は、クライアントへ送信する 情報へのインターフェースである。サーブレットからクライアントに情報 を送信するには、このインターフェースを利用する。
package javax.servlet.http; public interface HttpServletRequest extends javax.servlet.ServletRequest { public abstract java.lang.String getAuthType(); public abstract java.lang.String getContextPath(); public abstract javax.servlet.http.Cookie getCookies()[]; public abstract long getDateHeader(java.lang.String); public abstract java.lang.String getHeader(java.lang.String); public abstract java.util.Enumeration getHeaderNames(); public abstract java.util.Enumeration getHeaders(java.lang.String); public abstract int getIntHeader(java.lang.String); public abstract java.lang.String getMethod(); public abstract java.lang.String getPathInfo(); public abstract java.lang.String getPathTranslated(); public abstract java.lang.String getQueryString(); public abstract java.lang.String getRemoteUser(); public abstract java.lang.String getRequestURI(); public abstract java.lang.String getRequestedSessionId(); public abstract java.lang.String getServletPath(); public abstract javax.servlet.http.HttpSession getSession(); public abstract javax.servlet.http.HttpSession getSession(boolean); public abstract java.security.Principal getUserPrincipal(); public abstract boolean isRequestedSessionIdFromCookie(); public abstract boolean isRequestedSessionIdFromURL(); public abstract boolean isRequestedSessionIdFromUrl(); public abstract boolean isRequestedSessionIdValid(); public abstract boolean isUserInRole(java.lang.String); }
package javax.servlet; public interface ServletRequest { public abstract java.lang.Object getAttribute(java.lang.String); public abstract java.util.Enumeration getAttributeNames(); public abstract java.lang.String getCharacterEncoding(); public abstract int getContentLength(); public abstract java.lang.String getContentType(); public abstract javax.servlet.ServletInputStream getInputStream() t h r o w s j a v a . io.IOException; public abstract java.util.Locale getLocale(); public abstract java.util.Enumeration getLocales(); public abstract java.lang.String getParameter(java.lang.String); public abstract java.util.Enumeration getParameterNames(); public abstract java.lang.String getParameterValues(java.lang.String)[]; public abstract java.lang.String getProtocol(); public abstract java.io.BufferedReader getReader() throws java.io.IOException; public abstract java.lang.String getRealPath(java.lang.String); public abstract java.lang.String getRemoteAddr(); public abstract java.lang.String getRemoteHost(); public abstract javax.servlet.RequestDispatcher getRequestDispatcher(java.lang.String); public abstract java.lang.String getScheme(); public abstract java.lang.String getServerName(); public abstract int getServerPort(); public abstract boolean isSecure(); public abstract void removeAttribute(java.lang.String); public abstract void setAttribute(java.lang.String, java.lang.Object); }
package javax.servlet.http; public interface HttpServletResponse extends javax.servlet.ServletResponse { public static final int SC_CONTINUE; public static final int SC_SWITCHING_PROTOCOLS; public static final int SC_OK; public static final int SC_CREATED; public static final int SC_ACCEPTED; public static final int SC_NON_AUTHORITATIVE_INFORMATION; public static final int SC_NO_CONTENT; public static final int SC_RESET_CONTENT; public static final int SC_PARTIAL_CONTENT; public static final int SC_MULTIPLE_CHOICES; public static final int SC_MOVED_PERMANENTLY; public static final int SC_MOVED_TEMPORARILY; public static final int SC_SEE_OTHER; public static final int SC_NOT_MODIFIED; public static final int SC_USE_PROXY; public static final int SC_BAD_REQUEST; public static final int SC_UNAUTHORIZED; public static final int SC_PAYMENT_REQUIRED; public static final int SC_FORBIDDEN; public static final int SC_NOT_FOUND; public static final int SC_METHOD_NOT_ALLOWED; public static final int SC_NOT_ACCEPTABLE; public static final int SC_PROXY_AUTHENTICATION_REQUIRED; public static final int SC_REQUEST_TIMEOUT; public static final int SC_CONFLICT; public static final int SC_GONE; public static final int SC_LENGTH_REQUIRED; public static final int SC_PRECONDITION_FAILED; public static final int SC_REQUEST_ENTITY_TOO_LARGE;
public static final int SC_REQUEST_URI_TOO_LONG; public static final int SC_UNSUPPORTED_MEDIA_TYPE; public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE; public static final int SC_EXPECTATION_FAILED; public static final int SC_INTERNAL_SERVER_ERROR; public static final int SC_NOT_IMPLEMENTED; public static final int SC_BAD_GATEWAY; public static final int SC_SERVICE_UNAVAILABLE; public static final int SC_GATEWAY_TIMEOUT; public static final int SC_HTTP_VERSION_NOT_SUPPORTED; public abstract void addCookie(javax.servlet.http.Cookie); public abstract void addDateHeader(java.lang.String, long); public abstract void addHeader(java.lang.String, java.lang.String); public abstract void addIntHeader(java.lang.String, int); public abstract boolean containsHeader(java.lang.String); public abstract java.lang.String encodeRedirectURL(java.lang.String); public abstract java.lang.String encodeRedirectUrl(java.lang.String); public abstract java.lang.String encodeURL(java.lang.String); public abstract java.lang.String encodeUrl(java.lang.String); public abstract void sendError(int) throws java.io.IOException; public abstract void sendError(int, java.lang.String) throws java.io.IOException; public abstract void sendRedirect(java.lang.String) throws java.io.IOException; public abstract void setDateHeader(java.lang.String, long); public abstract void setHeader(java.lang.String, java.lang.String); public abstract void setIntHeader(java.lang.String, int); public abstract void setStatus(int); public abstract void setStatus(int, java.lang.String); }
package javax.servlet; public interface ServletResponse { public abstract void flushBuffer() throws java.io.IOException; public abstract int getBufferSize(); public abstract java.lang.String getCharacterEncoding(); public abstract java.util.Locale getLocale(); public abstract javax.servlet.ServletOutputStream getOutputStream() t h r o w s j a v a . io.IOException; public abstract java.io.PrintWriter getWriter() t h r o w s j a v a . io.IOException; public abstract boolean isCommitted(); public abstract void reset(); public abstract void setBufferSize(int); public abstract void setContentLength(int); public abstract void setContentType(java.lang.String); public abstract void setLocale(java.util.Locale); }
2-2.GET でのクライアントとの対話 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SampleServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { // Specify content type. res.setContentType("text/html"); // Access the output stream. PrintWriter out = res.getWriter(); // Return HTML. out.println("<html><head><title>My First Servlet"); out.println("</title></head><body>"); out.println("<h1>My First Servlet</h1>"); out.println("<p>This text came from a servlet.</p>"); out.println("</body></html>"); } } クライアントへ情報(HTML)を送信するには、「HttpServletResponse」から 「PrintWriter」オブジェクトを取得し、「PrintWriter」のメソッドを利用し ておこなう。
http://localhost:8080/myapps/SampleServlet?id=0001&name=BILL サーブレットの名前 GET にて送信する情報 (id=0001 / name=BILL) HTTP クライアントからサーブレットへ GET にて情報を送信することができる。この時、 サーブレット側では「doGet」メソッドのパラメーター、「HttpServletRequest」インター フェースを利用して送信された情報を取り出すことができる。
import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class MyFirstServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { // Specify content type. res.setContentType("text/html"); // Access the output stream. PrintWriter out = res.getWriter(); // Return HTML. out.println("<html><head><title>My First Servlet"); out.println("</title></head><body>"); out.println("<h1>My First Servlet</h1>"); out.println("<HR>"); Enumeration enum = req.getParameterNames(); while( enum.hasMoreElements() ){ String name = (String)enum.nextElement(); String value = req.getParameter( name ); out.println(name + " : " + value + "<BR>"); } out.println("</body></html>"); } } 「HttpServletRequest」の「getParameterNames」メソッドでは、送信された 情報の名前を取得することができる。送信された情報の値を取得するには、
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; public class FormSampleServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { // キーの取得 Enumeration en = req.getParameterNames(); // Specify content type. res.setContentType("text/html; charset=iso-2022-jp"); PrintWriter out = res.getWriter(); // Access the output stream. out.println("<html><head><title>My First Servlet"); out.println("</title></head><body>"); out.println("<h1>Sample Servlet</h1>"); out.println("<p>This text came from a servlet.</p>"); // データの取り出し while(en.hasMoreElements()){ String key = (String)en.nextElement(); String [] values = req.getParameterValues(key); out.println(key + ":"); for(int i=0; i<values.length; i++){ out.println(values[i] + " " ); } out.println("<HR>");
} out.println("</body></html>"); } } サーブレットの「doPost」メソッドにおいても、「HttpServletRequest」の 「getParameterNames」メソッドでは、送信された情報の名前を取得することが できる。送信された情報の値を取得するには、「getParameter」メソッドを利 用する。
<HTML> <BODY> <FORM method=”POST” action=”http://localhost:8080/myapps/FormSampleServlet”> 氏名:<INPUT name=”name”><BR> 住所:<INPUT name=”addr”><BR> 電話:<INPUT name=”tel”><BR> FAX :<INPUT name=”fax”><BR> MAIL:<INPUT name=”mail”><BR> <INPUT type=”submit”> <INPUT type=”reset”> </FORM>
package java.util;
public interface Enumeration{
public abstract boolean hasMoreElements(); public abstract java.lang.Object nextElement(); }
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Hello extends HttpServlet{ public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{ // response の content type を設定 res.setContentType("text/html"); // クライアントへのプリントストリームを生成 PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println("<H1>Hello,JavaServlet</H1>"); out.println("</BODY>"); out.println("</HTML>"); // ストリームのフラッシュ out.flush(); } } ここでは、「setContentType」メソッドを用いて MIME タイプを設定している。 このメソッドは「getWriter」よりも先に行われなければならない。 res.setContentType("text/html; charset=iso-2022-jp"); 上記の様に、キャラクタセットを指定することもできる。
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class FormSampleServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { // Specify content type. res.setContentType("text/html; charset=iso-2022-jp"); PrintWriter out = res.getWriter(); // Access the output stream. out.println("<html><head><title>My First Servlet"); out.println("</title></head><body>"); out.println("<h1>Sample Servlet</h1>"); out.println("<HR>"); while(en.hasMoreElements()){ String key = (String)en.nextElement(); String str = req.getParameter(key); String value = new String(str.getBytes(“8859_1”),”JISAutoDetect”); out.println(key + “ : “ + value); } out.println(“</body><html>”); } W e b ブラウザ-から送信される文字列と、J a v a の内部で処理する文字列と は異なるので、文字化けすることがある。そこでブラウザから送信された 文字列の文字コードを自動判定(”JISAutoDetect”)し、デフォルトの文 字コード(ISO-8859-1)へ変換する必要がある。
3-1.クッキーの概要 HTTP クッキーは、WEB サーバー側からクライアントへ送信する情報である。クライアントに送信されたクッ キーのデータは、クライアント側にて保存される。クライアント、つまりブラウザーによっては、クッキーを受 け付けないものも考えられる。 サーブレットからは、レスポンス(HttpResponse)にて、クッキーを追加する(addCookie)ことで、クッキー が送信される。 ブラウザーにて補完されるクッキーは、クッキーを生成したサーバーへ次のリクエストを送信するときに、同 時に送信される。サーバー側で、このクッキーが存在するかどうかは、HTTP リクエスト(HttpRequest)にてクッ キーが取得(getCookies)できるかどうかで判断することができる。 クッキーを利用することで、ステートレスな HTTP の通信において、ステートフルな情報の記憶を行うことが 可能となる。
HTTP クッキーの主な用途 HTTP クッキーは、主に以下のような用途に利用される。 (1)セッション管理 サーバーとクライアントのセッションを管理する機能。 ログイン情報や、複数のページにまたがる情報の管理など。 (2)パーソナライゼーション ページのカスタマイズやユーザー属性に基づくページデザインを実現するなど。 (3)トラッキング ユーサーのサイト内での行動履歴や、閲覧回数などの情報収拾など。 Web のマーケティングではよく利用される。
かつて、クッキーを汎用的なデータ保存手段として利用することがあった。しかし、今では Web Strage API など、 ブラウザー側にてデータを保管する技術が開発されているので、クッキーをクライアント側のためのデータ保管 に利用することは基本的にはありえなくなった。
package javax.servlet.http; public class Cookie extends java.lang.Object implements java.lang.Cloneable { public javax.servlet.http.Cookie(java.lang.String,java.lang.String); public void setComment(java.lang.String); public java.lang.String getComment(); public void setDomain(java.lang.String); public java.lang.String getDomain(); public void setMaxAge(int); public int getMaxAge(); public void setPath(java.lang.String); public java.lang.String getPath(); public void setSecure(boolean); public boolean getSecure(); public java.lang.String getName(); public void setValue(java.lang.String); public java.lang.String getValue(); public int getVersion(); public void setVersion(int); public java.lang.Object clone(); }
public interface javax.servlet.http.HttpServletResponse extends javax.servlet.ServletResponse { public abstract void addCookie(javax.servlet.http.Cookie); public abstract boolean containsHeader(java.lang.String); public abstract java.lang.String encodeURL(java.lang.String); public abstract java.lang.String encodeRedirectURL(java.lang.String); public abstract java.lang.String encodeUrl(java.lang.String); public abstract java.lang.String encodeRedirectUrl(java.lang.String); public abstract void sendError(int, java.lang.String) t h r o w s j a v a . io.IOException; public abstract void sendError(int) throws java.io.IOException; public abstract void sendRedirect(java.lang.String) t h r o w s j a v a . io.IOException; public abstract void setDateHeader(java.lang.String, long); public abstract void addDateHeader(java.lang.String, long); public abstract void setHeader(java.lang.String, java.lang.String); public abstract void addHeader(java.lang.String, java.lang.String); public abstract void setIntHeader(java.lang.String, int); public abstract void addIntHeader(java.lang.String, int); public abstract void setStatus(int); public abstract void setStatus(int, java.lang.String); }
extends javax.servlet.ServletRequest { public abstract java.lang.String getAuthType(); public abstract javax.servlet.http.Cookie getCookies()[]; public abstract long getDateHeader(java.lang.String); public abstract java.lang.String getHeader(java.lang.String); public abstract java.util.Enumeration getHeaders(java.lang.String); public abstract java.util.Enumeration getHeaderNames(); public abstract int getIntHeader(java.lang.String); public abstract java.lang.String getMethod(); public abstract java.lang.String getPathInfo(); public abstract java.lang.String getPathTranslated(); public abstract java.lang.String getContextPath(); public abstract java.lang.String getQueryString(); public abstract java.lang.String getRemoteUser(); public abstract boolean isUserInRole(java.lang.String); public abstract java.security.Principal getUserPrincipal(); public abstract java.lang.String getRequestedSessionId(); public abstract java.lang.String getRequestURI(); public abstract java.lang.String getServletPath(); public abstract javax.servlet.http.HttpSession getSession(boolean); public abstract javax.servlet.http.HttpSession getSession(); public abstract boolean isRequestedSessionIdValid(); public abstract boolean isRequestedSessionIdFromCookie(); public abstract boolean isRequestedSessionIdFromURL(); public abstract boolean isRequestedSessionIdFromUrl(); }
Cookie HttpServletResponse HttpServlet ブラウザ-
↓
↓
Cookie HttpServletRequest↑
Cookie↑
addCookie getCookiespublic void doGet(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ Cookie cookie = new Cookie(“クッキー名”,”クッキーの値”); // 途中省略 res.addCookie(cookie); } (1)クッキーの生成 Cookie cookie = new Cookie(“クッキー名”,”クッキーの値”); クッキーを生成するには、コンストラクターにて、クッキーの名称とクッキーの値を 文字列にて指定する。 (2)クッキーの登録 res.addCookie(cookie); クッキーを登録するには、HttpServletResponse の addCokie メソッドを用いて、レ スポンスに登録する。
3-4.クッキーの属性 (1)コメント(Comment) public void setComment(java.lang.String); public java.lang.String getComment(); (2)ドメイン名(Domain) public void setDomain(java.lang.String); public java.lang.String getDomain(); (3)クッキーの余命(MaxAge) public void setMaxAge(int); public int getMaxAge(); (4)クッキーのパス(Path) public void setPath(java.lang.String); public java.lang.String getPath(); (5)セキュリティ・オプション(Secure) public void setSecure(boolean); public boolean getSecure(); (6)クッキーの値(Value) public void setValue(java.lang.String); public java.lang.String getValue(); (7)バージョン(Version) public int getVersion(); public void setVersion(int);
public void doGet(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ Cookie cookie = new Cookie(“クッキー名”,”クッキーの値”); // クッキーの寿命を 300 秒間に設定 cookie.setMaxAge( 300 ); res.addCookie(cookie); } (1)クッキーの生成 Cookie cookie = new Cookie(“クッキー名”,”クッキーの値”); クッキーを生成するには、コンストラクターにて、クッキーの名称とクッキーの値を 文字列にて指定する。 (2)クッキーの属性の設定 cookie.setMaxAge(300); クッキーの属性(ここでは MaxAge)をクッキーの登録前に設定する。 (3)クッキーの登録 res.addCookie(cookie); クッキーを登録するには、HttpServletResponse の addCokie メソッドを用いて、レ スポンスに登録する。
3-5.クッキーの読み込み public void doGet(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ // 途中省略 Cookie [] cookies = req.getCookies(); for(int i=0; i<cookies.length; i++){ String name = cookies[i].getName(); String value = cookies[i].getValue(name); out.println(name + “:” + value); } } (1)クッキーの取得 Cookie [] cookies = req.getCookies(); クッキーは、リクエストから配列として取得できる。 (2)クッキー名の取得 String name = cookies[i].getName(); (3)クッキーの値の取得 String value = cookies[i].getValue(name);
4-1.セッションの概要
1.クッキーによるセッション
2.URL書き換えによるセッション
3.フォームのフィールド(Hidden)を利用するセッション
4-2.セッション管理のためのクラス public interface javax.servlet.http.HttpSession { public long getCreationTime(); public java.lang.String getId(); public long getLastAccessedTime(); public void setMaxInactiveInterval(int); public int getMaxInactiveInterval(); public javax.servlet.http.HttpSessionContext getSessionContext(); public java.lang.Object getAttribute(java.lang.String); public java.lang.Object getValue(java.lang.String); public java.util.Enumeration getAttributeNames(); public java.lang.String getValueNames()[]; public void setAttribute(java.lang.String, java.lang.Object); public void putValue(java.lang.String, java.lang.Object); public void removeAttribute(java.lang.String); public void removeValue(java.lang.String); public void invalidate(); public boolean isNew(); }
public void service(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ HttpSession session = req.getSession(true); if(session.isNew()){ // セッションが新規作成されたときに実行される } } (1)セッションの開始/取得 HttpSession session = req.getSession(true); (2)セッションが新規のものか確認 session.isNew()
4-4.セッションへの情報の設定 public void service(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ HttpSession session = req.getSession(true); if(session.isNew()){ // セッションへの情報の登録 session.putValue(“キーの名称”,”登録する値”); } } (1)セッションの開始/取得 HttpSession session = req.getSession(true); (2)セッションが新規のものか確認 session.isNew() (3)セッションへの情報の登録 session.putValue(“キーの名称”,”登録する値”);
public void service(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ HttpSession session = req.getSession(true); if(session.isNew()){ // セッションへの情報の登録 session.putValue(“キーの名称”,”登録する値”); } else{ // セッションの情報を取得する String value = (String)session.getValue(“キーの名称”); } } (1)セッションの開始/取得 HttpSession session = req.getSession(true); (2)セッションが新規のものか確認 session.isNew() (3)セッションからの情報の取得 session.getValue(“キーの名称”);
4-6.セッションの終了 public void service(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ HttpSession session = req.getSession(true); // セッションを終了させる session.invalidate(); } (1)セッションの開始/取得 HttpSession session = req.getSession(true); (2)セッションを終了 session.invalidate();
public void service(HttpServletRequets req, HttpServletResponse res) throws ServletException, IOException{ HttpSession session = req.getSession(true); if(session.isNew()){ // セッションへの情報の登録 session.setMaxInactivateInterval( 300 ); } } (1)セッションの開始/取得 HttpSession session = req.getSession(true); (2)セッションが新規のものか確認 session.isNew() (3)セッションの寿命を設定 session.setMaxInactivateInterval( 300 );
5-1.サーブレットでのファイルアップロード
HTML の form にて、input 要素の属性に "file" を指定することで、ブラウザが動作しているコンピュータのロー カルファイルを、サーブレットが動作するリモートのコンピューターへ送信することができる。これは RFC1867 の "Form-based File Upload in HTML" を実装したものである。
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp"> </head>
<body>
<form method="POST" action="/t/fupx" enctype="multipart/form-data"> アップロードするファイルの選択 <br>
<input type="file" name="upfile" accept="image/*"><br> <input type="submit" value=" アップロード ">
</form> </body> </html> ファイルアップロード用のフォーム(fup.html) 上記の例(fup.html)では、ファイルアップロードを実現するフォームを記述している。フォームを実現する form タグでは、method、action、enctype の属性を指定している。 form タグの属性
method : POST ファイルアップロードでは基本的に "POST" action : /t/fupx サーブレットの指定 enctype : multipart/form-data ファイルを含むデータの場合 フォーム中で記述している2つの input 要素のうち、1つ目がその属性にて "file" を指定している。この要素で、 アップロードするローカルファイルを指定することになる。name 属性で指定する文字列が、サーブレット側に てアップロードされたファイルのデータを取り出す時の名前(キー)となる。accept 属性は、ファイルの種類を 規定するための指定。ここでは "image/*" を指定して、画像ファイルのみを選択するようにしている。2つ目の input 要素は、アップロードを行うサブミット・ボタン。クリックすると、form タグの action 属性で指定されて いるサーブレットへファイルが送信される。この時のエンコードは、同じく form タグの enctype 属性で指定され ているものとなる。
5-3.ファイルアップロードを受け付けるサーブレット
ファイルを受け取る側のサーブレットも、基本的にはサーブレットの枠組みの中で作られる。すなわち、 HttpServlet を継承(extends)したクラスで、doPost メソッドをオーバーライドする。この doPost メソッド内で、 アップロードされたファイルを処理することとなる。ここでデータを保存しなければ、アップロードされたファ イルは保管されないので、注意が必要。
ファイルを取り出して、保存するコードは以下のようになる。
doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException{ // ここでアップロードされたファイルのデータを取り出す。
// 引数は <input type="file" name="upfile" ...> で指定した name 属性。 Part part = req.getPart("upfile");
// アップロードしたファイルの元々の名前を取り出す。 String fname = part.getSubmittedFileName();
// 引数で指定した名前で、指定された場所に保管される。 part.write(fname);
}
上記のコードでは、ファイルを保管する場所については指定していない。保管場所については後述するサーブ レットの設定(web.xml またはアノテーションによる設定)にて指定することになる。
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; @WebServlet(name="FUPX",urlPatterns={"/fupx"}) @MultipartConfig(fileSizeThreshold=10000000,maxFileSize=2000000,location="/usr/local/apache-tomcat-8.5.6/ webapps/t/img")
public class FupServlet extends HttpServlet{ @Override
public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException,ServletException{ res.setContentType("text/html");
PrintWriter out = res.getWriter(); out.println("<html>");
out.println("<body>");
out.println("<h1>File Upload ...</h1>"); try{
Part part = req.getPart("upfile");
String fname = part.getSubmittedFileName(); part.write(fname); out.println("Success!<br>"); } catch(Exception e){ out.println("Fail...<br>"); out.println(e.toString()); } out.println("</body>"); out.println("</html>"); } }
public interface javax.servlet.http.Part {
public abstract java.io.InputStream getInputStream() throws java.io.IOException; public abstract java.lang.String getContentType();
public abstract java.lang.String getName();
public abstract java.lang.String getSubmittedFileName(); public abstract long getSize();
public abstract void write(java.lang.String) throws java.io.IOException; public abstract void delete() throws java.io.IOException;
public abstract java.lang.String getHeader(java.lang.String);
public abstract java.util.Collection<java.lang.String> getHeaders(java.lang.String); public abstract java.util.Collection<java.lang.String> getHeaderNames();
ファイルアップロードを受け付けるサーブレットは、ファイルの保管場所(ディレクトリ・パス)の設定が 可能である。設定には web.xml ファイルまたはアノテーションを用いる。前掲のソースコードで示されている FupServlet では、アノテーションにてファイルの保管場所を指定している。 @WebServlet(name="FUPX",urlPatterns={"/fupx"}) @MultipartConfig( fileSizeThreshold=10000000, <-- 1ファイルの最大値 maxFileSize=2000000, <-- 一時ファイルのサイズ location="/usr/local/apache-tomcat-8.5.6/webapps/t/img") <-- 保管するディレクトリ public class FupServlet extends HttpServlet{
中略 } 上記のコードで、ファイルの保管場所は @MultipartConfig アノテーションの引数 "location" で指定している。 上記の設定を、web.xml で行う場合には、以下のようになる。 <servlet> <servlet-name>FUPX</servlet-name> <servlet-class>FupServlet</servlet-class> <multipart-config> <location>/usr/local/apache-tomcat-8.5.6/webapps/t/img</location> <file-size-threshold>10000000</file-size-threshold> <max-file-size>2000000</max-file-size> <max-request-size>-1</max-request-size> <-- -1 の場合、制限なし </multipart-config> </servlet>
ファイルアップロードに関係する設定項目 設定は web.xml にて行う。 <multipart-config> <location>/usr/local/apache-tomcat-8.5.6/webapps/t/img</location> <file-size-threshold>10000000</file-size-threshold> <max-file-size>2000000</max-file-size> <max-request-size>-1</max-request-size> </multipart-config> <multipart-config> 〜 </multipart-config> <servlet> 〜 </servlet> 内に記述する。この中に、ファイルアップロードに関する設定を記述する。 <location> タグ ファイルを保管する場所に関する設定。保管するディレクトリの PATH を記述する。省略可。 <max-file-size> アップロードするファイルの最大値(バイト) <max-request-size> リクエストの最大値(バイト)の設定。Content-Length と同じ。 <file-size-threshold> 一時ファイルのサイズ(バイト)
6-1.クライアントとの非同期通信
Ajax とは、Asynchronous Javascript + XML の略称である。名前からもわかる通り、元々はブラウザーの非同期 通信の機能を、JavaScript と XML とを用いて使用する技術である。 HTTP のクライアントであるブラウザからは、JavaScript のコードにて主に XMLHttpRequest を使用し、リモー トのウェブサーバーと非同期に通信を行う。より具体的には、ページ全体をリロードすることなく、ウェブサーバー へリクエストを投げ、その結果を、DOM を使用してページ内の特定の更新に使用する。ユーザーからすると、ブ ラウザに表示される情報を更新するために、いちいちページ全体の再読み込みを必要としない。1つのページに て情報を色々と更新することができるので、利便性の高いページをデザインすることが可能になる技術である。 ウェブサーバー側、すなわちサーブレット側からすると、リクエストは HTTP 通信のリクエストつまり HttpServletRequest であり、レスポンスも HttpServletResponse である。ただし相手が HTML ドキュメント全体 を要求しているわけではないので、レスポンスを通じて返すデータはその点を考慮したものである必要がある。 ブラウザー HTML WEBサーバー XMLH(pRequest リクエスト(GET / POST) HTTP通信 レスポンス <div id=“xyz”> コンテンツ </div> 更新
6-2.クライアント側の準備
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp"> <script type="text/javascript">
function getProperty(name){ var value = "";
// TITLE
var req = new XMLHttpRequest(); req.onreadystatechange = function(){ if(req.readyState == 4){ if(req.status == 200){ value = req.responseText; } } }
var url = 'prop?name=' + name; req.open('GET', url, false);
req.setRequestHeader('Pragma','no-cache'); req.setRequestHeader('Cache-Control','no-cache'); req.setRequestHeader('If-Modified-Since','Thu, 01 Jun 1970 00:00:00 GMT'); req.send(null); return value; } </script> </head> <body> 中略 </body> </html>
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*;
@WebServlet(name="PROP",urlPatterns={"/prop"}) public class PropServlet extends HttpServlet{ @Override
public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException,ServletException{ res.setContentType("text/plain");
PrintWriter out = res.getWriter(); out.print("0");
out.flush(); }
@Override
public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException,ServletException{ // Ajax で送信されてきたデータを処理するコードを記述する。
String v = req.getParameter("prop"); 中略
res.setContentType("text/plain"); PrintWriter out = res.getWriter(); out.print("success");
out.flush(); }