<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Javaサーブレット開発入門 &#045; わかりやすい図解解説</title>
	<atom:link href="http://web.javastudy.biz/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://web.javastudy.biz</link>
	<description>Javaサーブレットの概要から開発環境構築手順、プログラミング方法までを図解でわかりやすく解説しています。</description>
	<lastBuildDate>Sat, 06 Nov 2021 01:13:34 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>コメントの記述</title>
		<link>http://web.javastudy.biz/?p=281</link>
		<comments>http://web.javastudy.biz/?p=281#comments</comments>
		<pubDate>Sun, 03 May 2015 05:12:04 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[JSP入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[コメント]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=281</guid>
		<description><![CDATA[JSPページを作成する場合、コメントの記述方法に注意しなければいけません。 普通、他のプログラミング言語では、コメントの内容はともかく、記述方法はそれ程注意することはありませんが、JSPの場合、1つのソースファイルの中に [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>JSPページを作成する場合、コメントの記述方法に注意しなければいけません。</p>
<p>普通、他のプログラミング言語では、コメントの内容はともかく、記述方法はそれ程注意することはありませんが、JSPの場合、1つのソースファイルの中に、HTMLのコメント、JSPのコメント、Javaのコメントの最大3種が混在することになります。</p>
<h3>HTMLのコメント</h3>
<p>HTMLのコメント書式は下記になります。</p>
<pre>&lt;!-- HTMLのコメント --&gt;</pre>
<p>「&lt;- -」から「- -&gt;」の間は、コメントとして扱われ、ブラウザには表示されません。ただし、HTMLのソースには表示されます。<br />
コメントは、複数行にまたがってもかまいませんし、コメント内にHTMLタグを挟むことも可能です。(ただし、コメント文の中に続けてハイフン(- -)は使用しない方が無難です。)</p>
<h3>JSPのコメント</h3>
<p>JSPのコメント書式は下記になります。</p>
<pre>&lt;!%-- JSPのコメント --%&gt;</pre>
<p>「&lt;%- -」から「- -%&gt;」の間は、コメントとして扱われ、ブラウザには表示されません。また、HTMLのソースにも表示されません。<br />
例えば、JSPページをブラウザに表示させた際、IEの場合は、表示された画面を右クリック→「ソースの表示」をクリックし、HTMLソースを開いてみてください。HTMLのコメントは出力されていますが、JSPのコメントは出力されていないことが確認できます。</p>
<h3>Javaのコメント</h3>
<p>Javaのコメント書式は下記になります。</p>
<pre>// Javaのコメント

または

/*
Javaのコメント
*/</pre>
<p>スクリプトレット内はJavaコードになるので、コメント書式はJavaのものになります。</p>
<p>行の先頭に「//」を記述した場合は、その1行だけがコメントになります。または、「/* … */」を記述した場合は、「/*」から「*/」までの間がコメントになります。</p>
<p>JavaのコメントもJSPのコメントと同じで、ブラウザにもHTMLソースにも出力されません。それら各コメントの性質を理解し、使い分けることが重要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=281</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>宣言と式</title>
		<link>http://web.javastudy.biz/?p=278</link>
		<comments>http://web.javastudy.biz/?p=278#comments</comments>
		<pubDate>Sun, 03 May 2015 02:52:25 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[JSP入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[宣言]]></category>
		<category><![CDATA[式]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=278</guid>
		<description><![CDATA[今回は、JSPの構成要素である「宣言」と「式」について見ていきます。 宣言(Declaration) 変数、メソッドは下記のように記述し、宣言します。 &#60;!% 宣言文; %&#62; 宣言文もJavaの文であるため、 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今回は、JSPの構成要素である「宣言」と「式」について見ていきます。</p>
<h3>宣言(Declaration)</h3>
<p>変数、メソッドは下記のように記述し、宣言します。</p>
<pre>&lt;!% 宣言文; %&gt;</pre>
<p>宣言文もJavaの文であるため、最後に「;」が必要です。</p>
<p><strong>変数の宣言</strong></p>
<pre>&lt;!% int cnt = 10; %&gt;</pre>
<p>前回の記事では、下記のようにスクリプトレット内に変数を定義していました。</p>
<pre>&lt;%
    int cnt = 10;
    
    if(cnt < 10) {
        out.println("&lt;h2&gt;10未満です。&lt;/h2&gt;");
    } else {
        out.println("&lt;h2&gt;10以上です。&lt;/h2&gt;");
    }
%&gt;</pre>
<p>スクリプトレットと宣言、両者の違いは、スクリプトレットで定義した変数はローカル変数、宣言で定義した変数はインスタンス変数になる点です。</p>
<p>インスタンス変数の場合、初めてリクエストが合ったときに一度だけ初期化され、その後のリクエストにおいては変数の値は初期化されることなく、JSPコンテナ(Tomcat)を再起動するまで、値が保持されます。 </p>
<p>ローカル変数の場合は、リクエストがある都度、変数が初期化されます。</p>
<p>宣言では変数以外に、メソッドの定義もできます。</p>
<pre>&lt;!%
    public String getText() {
        String str = new String("Sample");
        return str;
    }
%&gt;</pre>
<h3>式(Expression)</h3>
<p>式を記述することで、変数の値や式の結果、メソッドの戻り値をHTML内に埋め込むことができます。</p>
<pre>&lt;=% 式 %&gt;</pre>
<p>宣言では最後に「;」が必要ですが、式はJavaの文ではないので「;」は不要です。</p>
<pre>&lt;%
    String name = new String("まんじゅう");
    int price = 100;
%&gt;
    &lt;p&gt;商品名：<span style="color:#ff0000;">&lt;%= name %&gt;</span>&lt;/p&gt;
    &lt;p&gt;価格：<span style="color:#ff0000;">&lt;%= price %&gt;</span>&lt;/p&gt;
</pre>
<p>JSPページを作成する際、上記のように動的に変化する文字列を表示したい場合は、式を利用することで、簡単に実装できます。もちろん、これまでどおりスクリプトレット内でprint()メソッドを使用しても同じ結果となります。</p>
<p>下記のようにメソッドの戻り値を表示することもできます。</p>
<pre>&lt;!%
    public String getText() {
        String str = new String("Sample");
        return str;
    }
    
    &lt;p&gt;メソッド戻り値：&lt;%= getText() %&gt;&lt;/p&gt;
%&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=278</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>スクリプトレット</title>
		<link>http://web.javastudy.biz/?p=275</link>
		<comments>http://web.javastudy.biz/?p=275#comments</comments>
		<pubDate>Sat, 02 May 2015 17:08:10 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[JSP入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[スクリプトレット]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=275</guid>
		<description><![CDATA[前回の記事でも少し触れましたが、HTML内にJavaコードを記述する記法のことをスクリプトレットと言います。スクリプト(script)の断片(let)という意味です。 構文は下記になります。 &#60;% Javaコード  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://web.javastudy.biz/?p=268" target="_blank">前回の記事</a>でも少し触れましたが、HTML内にJavaコードを記述する記法のことをスクリプトレットと言います。スクリプト(script)の断片(let)という意味です。</p>
<p>構文は下記になります。</p>
<pre>&lt;%
    Javaコード
%&gt;</pre>
<p>簡単なJSPサンプルを見てみましょう。「<%」から「%>」内はJavaのコードと見なされ、それ以外は普通のHTMLです。</p>
<pre><span style="color:#ff0000;">&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%&gt;</span>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
<span style="color:#ff0000;">&lt;%
    String str = new String("HelloWorld!");
    out.print(str);
%&gt;</span>

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>最初の行は、pageディレクティブと呼ばれ、JSP全体の動作を定義します。(ここでは一旦、JSPのおまじないみないなものだと思っていただいても構いません。)</p>
<p>下記のようにスクリプトレットを複数箇所に記述することもできます。</p>
<pre><span style="color:#ff0000;">&lt;%
    int cnt = 10;
    
    if(cnt < 10) {
%&gt;</span>
        &lt;h2&gt;10未満です。&lt;/h2&gt;
<span style="color:#ff0000;">&lt;%
    } else {
%&gt;</span>
        &lt;h2&gt;10以上です。&lt;/h2&gt;
<span style="color:#ff0000;">&lt;%
    }
%&gt;</span></pre>
<p>このようにスクリプトレットを複数箇所に離れて記述しても、つなぎ合わせた際に正しい文法になっていれば、問題ありません。<br />
また、下記のようにスクリプトレット内にまとめて記述することもできます。実行結果はまったく同じになります。</p>
<pre>&lt;%
    int cnt = 10;
    
    if(cnt < 10) {
        out.println("&lt;h2&gt;10未満です。&lt;/h2&gt;");
    } else {
        out.println("&lt;h2&gt;10以上です。&lt;/h2&gt;");
    }
%&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=275</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSPでHelloWorld!</title>
		<link>http://web.javastudy.biz/?p=268</link>
		<comments>http://web.javastudy.biz/?p=268#comments</comments>
		<pubDate>Sat, 02 May 2015 15:57:47 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[JSP入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JSP]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=268</guid>
		<description><![CDATA[JSPで「HelloWorld!」と表示するだけの簡単なプログラムを作成してみましょう。 まずは、Eclipseを起動し、新規プロジェクトを作成します。プロジェクトは、メニューから「ファイル」-「新規」-「プロジェクト」 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>JSPで「HelloWorld!」と表示するだけの簡単なプログラムを作成してみましょう。</p>
<p>まずは、Eclipseを起動し、新規プロジェクトを作成します。プロジェクトは、メニューから「ファイル」-「新規」-「プロジェクト」をクリックすることで作成できます。</p>
<p>プロジェクトを作成したら、続いて、JSPファイルを作成します。<br />
画面左のプロジェクトエクスプローラーからプロジェクト名を選択した状態で、メニューから「ファイル」-「新規」-「その他」をクリックします。</p>
<p>ウィザードを選択ダイアログが表示されます。<br />
<img src="http://web.javastudy.biz/wp-content/uploads/2015/05/jsp_11.png" alt="ウィザードダイアログ" width="640" height="362" class="alignnone size-full wp-image-269" /></p>
<p>「Web」-「JSP ファイル」を選択し、「次へ」ボタンをクリックします。</p>
<p>新規JSPファイルダイアログが表示されます。<br />
<img src="http://web.javastudy.biz/wp-content/uploads/2015/05/jsp_12.png" alt="新規JSPファイルダイアログ" width="640" height="451" class="alignnone size-full wp-image-270" /></p>
<p>任意のファイル名を入力し、「完了」をクリックします。<br />
このサンプルでは、ファイル名を「JSPSample01.jsp」としています。</p>
<p>プロジェクトに「JSPSample01.jsp」が追加されます。<br />
<img src="http://web.javastudy.biz/wp-content/uploads/2015/05/jsp_13.png" alt="JSPサンプル" width="597" height="358" class="alignnone size-full wp-image-271" /></p>
<p>最小限のソースコードが記述された状態で作成されます。JSPページと言っても、基本はHTMLページですので、見慣れたタグが並んでいると思います。動的に変化する部分のみJavaでコーティングしていきます。</p>
<h3>コーディング</h3>
<p>Javaでコーディングする部分はスクリプトレットという記述法を使用する必要があります。</p>
<p>スクリプトレットの構文は下記になります。</p>
<pre>&lt;%
    Javaコード
%&gt;</pre>
<p>「<%」と「%>」で囲むことで、その中はJavaのコードと見なされ、Javaのプログラムを記述することができます。</p>
<p>上記を踏まえて、「HelloWorld!」プログラムをコーディングしてみましょう。</p>
<pre>&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%
    String str = new String("HelloWorld!");
    
    for(int i=0; i&lt;5; i++){
        out.print(str);
        out.println("&lt;br&gt;");
    }
%&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>実行結果は下記のようになります。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/05/jsp_14.png" alt="JSPサンプル実行結果" width="497" height="418" class="alignnone size-full wp-image-272" /></p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=268</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSPとは</title>
		<link>http://web.javastudy.biz/?p=264</link>
		<comments>http://web.javastudy.biz/?p=264#comments</comments>
		<pubDate>Sat, 02 May 2015 06:21:24 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[JSP入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JSP]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=264</guid>
		<description><![CDATA[前回まではサーブレットの基本を見てきましたが、今回からはJSPについて見ていきます。 JSPはJava Server Pagesの略語であり、Javaを利用してサーバーサイドで動的にWebページ(動的コンテンツ)を生成し [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>前回まではサーブレットの基本を見てきましたが、今回からはJSPについて見ていきます。</p>
<p>JSPはJava Server Pagesの略語であり、Javaを利用してサーバーサイドで動的にWebページ(動的コンテンツ)を生成し、クライアントに送信する技術のことです。</p>
<p>サーブレットのソースコードの実体はJavaで書かれたテキストファイルであり、アプリケーションとして利用するためにはコンパイルを行ってクラスファイルを作成する必要があります。(Eclipse上で、「実行」-「1 サーバーで実行」をクリックすることでEclipseがそれらの処理を自動的にやってくれていました。)</p>
<p>これに対し、JSPはHTMLファイルの中に、Javaコードを埋め込んでおき、クライアントからの要求に応じて、プログラムを実行し、その処理結果をクライアントへ返します。クライアントへ返す結果は、通常のHTML形式になるため、Webブラウザに特殊な機能を組みこむことなくWebアプリケーションを構築することができます。</p>
<p>似たような技術に、マイクロソフトのIIS上で動作させることができるASP(Active Server Pages)がありますが、ASPに対応しているWebサーバー、APサーバーはIISぐらいしかないのに対し、JSPはTomcatはもちろん、他の様々なWebサーバー、APサーバーが対応しています。</p>
<h3>JSPページ</h3>
<p>JSPを利用したコンテンツのことをJSPページと言います。JSPページはそのままWebブラウザに送信されるわけではなく、いったんサーバー側でサーブレットにコンパイルされ、その実行結果であるHTMLページがブラウザに送信されます。</p>
<p>JSPページがブラウザに表示されるまでの流れが下図になります。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/05/jsp_01.png" alt="JSP概要" width="691" height="259" class="alignnone size-full wp-image-265" /></p>
<p>①HTMLフォームや直接URLにアクセスすることでJSPページが呼び出される。<br />
②Webサーバーは呼び出されたコンテンツがJSPページであると判断すると、リクエストをAPサーバーにリダイレクトする。<br />
③APサーバーは呼び出されたJSPページをサーブレットに変換するコンパイラに渡す。<br />
④コンパイラにより、JSPページの中に記述されたHTMLタグやJavaコードがすべてサーブレットに変換され、サーブレットにより生成されたHTMLページをブラウザに返す。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=264</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>セッションによるデータ受け渡し(セッションオブジェクトの利用)</title>
		<link>http://web.javastudy.biz/?p=255</link>
		<comments>http://web.javastudy.biz/?p=255#comments</comments>
		<pubDate>Wed, 29 Apr 2015 03:13:57 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[サーブレット]]></category>
		<category><![CDATA[セッション]]></category>
		<category><![CDATA[操作]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=255</guid>
		<description><![CDATA[前回に引き続き、セッション管理に関するサンプルサーブレットを作成していきます。今回は、サーブレット間でのデータ受け渡しを行います。 まずは、作成していくサーブレットの内容を下記します。 適当な質問フォームを表示し、ユーザ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>前回に引き続き、セッション管理に関するサンプルサーブレットを作成していきます。今回は、サーブレット間でのデータ受け渡しを行います。</p>
<p>まずは、作成していくサーブレットの内容を下記します。</p>
<p>適当な質問フォームを表示し、ユーザーに入力させます。</p>
<p><a href="http://web.javastudy.biz/wp-content/uploads/2015/04/sed_01.png"><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/sed_01.png" alt="セッション操作サンプル" width="497" height="418" class="alignnone size-full wp-image-256" /></a></p>
<p>「サーブレット呼び出し」ボタンを押せば、入力されたデータがサーブレット「SampleSessionCtl」に渡されます。</p>
<p>サーブレット「SampleSessionCtl」では、セッションオブジェクトを生成し、生成したセッションオブジェクトに、フォームから受け取ったデータを保存します。さらに、そのデータとセッションIDを表示するHTMLをレスポンスとして返します。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/sed_02.png" alt="セッション操作サンプル" width="497" height="418" class="alignnone size-full wp-image-257" /></p>
<p>「次のサーブレット呼び出し」をクリックすると、サーブレット「SampleSessionGetServlet」を呼び出します。</p>
<p>サーブレット「SampleSessionGetServlet」では、セッションオブジェクトを取得し、セッションオブジェクトからSampleSessionCtlサーブレットで保存したデータとセッションIDを取得します。さらに、それらのデータを表示するHTMLをレスポンスとして返します。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/sed_03.png" alt="セッション操作サンプル" width="497" height="418" class="alignnone size-full wp-image-258" /></p>
<p>サーブレット間でデータが受け渡せていることが確認できます。</p>
<h3>セッション操作メソッド一覧</h3>
<p>セッションを操作するには、主に下記メソッドを使用します。</p>
<dl>
<dt>void setAttribute(String name, Object value)</dt>
<dd>セッションオブジェクト(HttpSessionオブジェクト)に属性を保存するメソッドです。引数にはString型の属性名とObject型の属性値を指定します。</p>
<p>下記例では、属性名を「MyName」、属性値を「TARO YAMADA」としています。<br />
HttpSession session = request.getSession();<br />
session.setAttribute(&#8220;MyName&#8221;, &#8220;TARO YAMADA&#8221;);</p>
</dd>
<dt>Object getAttribute(String name)</dt>
<dd>セッションオブジェクトに保存されている属性値を取得するメソッドです。引数には取得したい属性名を指定します。戻り値として返される属性値の型はObject型になるので、文字列の場合はString型にキャストします。</p>
<p>HttpSession session = request.getSession();<br />
myName = (String) session.getAttribute(&#8220;MyName&#8221;);</p>
</dd>
<dt>void setMaxInactiveInterval(int 有効期限)</dt>
<dd>セッションの有効期限を設定するメソッドです。指定した有効期限を超えるとセッションは無効となり新たなセッションとして管理できます。有効期限はクライアントが最後にアクセスしてからおおよその経過時間を秒単位で指定します。</p>
</dd>
<dt>void invalidate()</dt>
<dd>セッションオブジェクトを明示的に無効にするメソッドです。セッション管理に有効期限が設定されている場合はクライアントからアクセスがないまま一定時間経過すると、自動的にセッションは無効になります。一方、任意のタイミングで明示的に無効にしたい場合は本メソッドを使用します。</p>
</dd>
</dl>
<h3>サンプルサーブレットのソースコード</h3>
<p>以降に各サーブレットのソースコードを記載します。(冗長な部分は省略し、主要な部分のみ記載しています。)</p>
<p>まずは、サーブレット呼び出し用のフォームを作成します。</p>
<pre>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;セッション管理サーブレットサンプル(データ受け渡し)&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;セッション管理サーブレットサンプル(データ受け渡し)&lt;/h1&gt;
&lt;form action="SampleSessionCtl" method="GET"&gt;
&lt;p&gt;あなたの名前は？&lt;/p&gt;
&lt;input type="TEXT" name="UserName" size=40&gt;
&lt;p&gt;好きなゲームは？&lt;/p&gt;
&lt;input type="TEXT" name="GameName" size=40&gt;&lt;br /&gt;&lt;br /&gt;
&lt;input type="submit" value="サーブレットの呼び出し"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>「サーブレットの呼び出し」ボタンをクリックした場合のアクションとして、SampleSessionCtlサーブレットを呼び出してします。その際のリクエストの種類には「GET」を指定しています。</p>
<p>SampleSessionCtlサーブレットのdoGet()メソッドには下記のように記述します。</p>
<pre>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String userName = request.getParameter("UserName");
    String gameName = request.getParameter("GameName");
    
    <span style="color:#ff0000;">HttpSession session = request.getSession();
    session.setAttribute("UserName", userName);
    session.setAttribute("GameName", gameName);</span>

    PrintWriter out = response.getWriter();
    out.println("&lt;html&gt;");
    out.println("&lt;head&gt;");
    out.println("&lt;title&gt;セッションの生成&lt;/title&gt;");
    out.println("&lt;/head&gt;");
    out.println("&lt;body&gt;");
    out.println("&lt;h1&gt;セッションの生成(ページ1)&lt;/h1&gt;");
    out.println("&lt;p&gt;あなたの名前は「" + userName + "」です。&lt;/p&gt;");
    out.println("&lt;p&gt;好きなゲームは「" + gameName + "」です。&lt;/p&gt;");
    out.println("&lt;p&gt;セッションIDは「" + session.getId() + "」です。&lt;/p&gt;");
    out.println("&lt;a href=\"SampleSessionGetServlet\"&gt;次のサーブレット呼び出し&lt;/a&gt;");
    out.println("&lt;/body&gt;");
    out.println("&lt;/html&gt;");
}</pre>
<p>getSession()メソッドでHttpSessionオブジェクト生成し、setAttribute()メソッドでフォームから受け取ったデータをセッションオブジェクトに保存しています。</p>
<p>「次のサーブレット呼び出し」のリンク先として、SampleSessionGetServletサーブレットを指定します。その場合のリクエストの種類には「GET」になります。</p>
<p>SampleSessionGetServletサーブレットのdoGet()メソッドには下記のように記述します。</p>
<pre>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String userName = "";
    String gameName = "";
    
    HttpSession session = request.getSession();
    userName = (String) session.getAttribute("UserName");
    gameName = (String) session.getAttribute("GameName");
    
    PrintWriter out = response.getWriter();
    out.println("&lt;html&gt;");
    out.println("&lt;head&gt;");
    out.println("&lt;title&gt;セッションオブジェクトの取得&lt;/title&gt;");
    out.println("&lt;/head&gt;");
    out.println("&lt;body&gt;");
    out.println("&lt;h1&gt;セッションオブジェクトの取得(ページ2)&lt;/h1&gt;");
    out.println("&lt;p&gt;あなたの名前は「" + userName + "」です。&lt;/p&gt;");
    out.println("&lt;p&gt;好きなゲームは「" + gameName + "」です。&lt;/p&gt;");
    out.println("&lt;p&gt;セッションIDは「" + session.getId() + "」です。&lt;/p&gt;");
    out.println("&lt;a href=\"SampleSessionCtl\"&gt;前のサーブレットに戻る&lt;/a&gt;");
    out.println("&lt;/body&gt;");
    out.println("&lt;/html&gt;");
}</pre>
<p>ここでもgetSession()メソッドを呼び出していますが、今回は、既にセッションが開始されているので、セッション管理の開始時に生成されたHttpSessionオブジェクトが戻り値として返されます。そのため、getAttribute()メソッドにより、SampleSessionCtlサーブレットでセッションオブジェクトに保存したデータを取得できます。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=255</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>セッションIDの発行と受け渡し</title>
		<link>http://web.javastudy.biz/?p=249</link>
		<comments>http://web.javastudy.biz/?p=249#comments</comments>
		<pubDate>Mon, 27 Apr 2015 15:05:18 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[サーブレット]]></category>
		<category><![CDATA[セッション管理]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=249</guid>
		<description><![CDATA[今回は、セッションIDの発行とサーブレット間での受け渡しを行うサンプルサーブレットを作成していきます。 まずは、作成していくサーブレットの内容を下記します。 サーブレットを呼び出すためのフォームを作成します。 「サーブレ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今回は、セッションIDの発行とサーブレット間での受け渡しを行うサンプルサーブレットを作成していきます。</p>
<p>まずは、作成していくサーブレットの内容を下記します。</p>
<p>サーブレットを呼び出すためのフォームを作成します。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/se_10.png" alt="セッション管理サンプルサーブレット" width="497" height="418" class="aligncenter size-full wp-image-250" /></p>
<p>「サーブレットの呼び出し」ボタンをクリックすると、サーブレット「SampleSessionCtl」を呼び出します。</p>
<p>サーブレット「SampleSessionCtl」では、セッションオブジェクトを生成し、生成されたセッションIDを表示するHTMLをレスポンスとして返します。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/se_11.png" alt="セッション管理サーブレットサンプル" width="497" height="418" class="aligncenter size-full wp-image-251" /></p>
<p>「次のサーブレット呼び出し」をクリックすると、サーブレット「SampleSessionGetServlet」を呼び出します。</p>
<p>サーブレット「SampleSessionGetServlet」では、セッションIDを取得し、取得したセッションIDを表示するHTMLをレスポンスとして返します。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/se_12.png" alt="セッション管理サーブレットサンプル" width="497" height="418" class="aligncenter size-full wp-image-252" /></p>
<p>セッションIDがサーブレットが変わっても同じ文字列であることが確認できます。</p>
<h3>セッション生成メソッド一覧</h3>
<p>セッションを生成するには、下記メソッドを使用します。</p>
<dl>
<dt>HttpSession getSession()</dt>
<dd>セッションを開始するメソッドです。セッション管理をはじめるにはHttpServletRequestオブジェクトのgetSession()メソッドを使用します。getSession()メソッドは、既にセッションが開始されているか開始されていないかに従い、引数であるboolean値の指定によって処理が異なります。</p>
<p>①getSession()とgetSession(true)の動作<br />
まだセッションが開始されていないときは、新規に生成したHttpSessionオブジェクトを戻り値として返して、セッション管理を開始します。<br />
既にセッションが開始されているときは、セッション管理の開始時に生成されたHttpSessionオブジェクトを戻り値として返します。</p>
<p>②getSession(false)の動作<br />
まだセッションが開始されていないときは、新規にHttpSessionオブジェクトを生成せずにnullを戻り値として返します。</p>
</dd>
<dt>String getId()</dt>
<dd>セッションIDを取得します。</p>
</dd>
</dl>
<h3>サンプルサーブレットのソースコード</h3>
<p>以降に各サーブレットのソースコードを記載します。(冗長な部分は省略し、主要な部分のみ記載しています。)</p>
<p>まずは、サーブレット呼び出し用のフォームを作成します。フォーム(HTMLファイル)の詳細な作成方法は<a href="http://web.javastudy.biz/?p=210" target="_blank">こちら</a>を参照してください。</p>
<pre>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;セッション管理サーブレットサンプル&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;セッション管理サーブレットサンプル&lt;/h1&gt;
&lt;form action="SampleSessionCtl" method="GET"&gt;
&lt;input type="submit" value="サーブレットの呼び出し"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>「サーブレットの呼び出し」ボタンをクリックした場合のアクションとして、SampleSessionCtlサーブレットを呼び出してします。その際のリクエストの種類には「GET」を指定しています。</p>
<p>SampleSessionCtlサーブレットのdoGet()メソッドには下記のように記述します。</p>
<pre>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    <span style="color:#ff0000;">HttpSession session = request.getSession();</span>

    out.println("&lt;html&gt;");
    out.println("&lt;head&gt;");
    out.println("&lt;title&gt;セッションの生成&lt;/title&gt;");
    out.println("&lt;/head&gt;");
    out.println("&lt;body&gt;");
    out.println("&lt;h1&gt;セッションの生成(ページ1)&lt;/h1&gt;");
    out.println("&lt;p&gt;セッションIDは「" + <span style="color:#ff0000;">session.getId()</span> + "」です。&lt;/p&gt;");
    out.println("&lt;a href=\"SampleSessionGetServlet\"&gt;次のサーブレット呼び出し&lt;/a&gt;");
    out.println("&lt;/body&gt;");
    out.println("&lt;/html&gt;");
}</pre>
<p>getSession()メソッドでHttpSessionオブジェクト生成し、getId()メソッドで取得したセッションIDを出力しています。</p>
<p>「次のサーブレット呼び出し」のリンク先として、SampleSessionGetServletサーブレットを指定します。その場合のリクエストの種類は「GET」になります。また、注意点として、println()メソッドでダブルクォーテーショ(&#8220;)を出力したい場合は、「\」でエスケープしてやる必要があります。</p>
<p>SampleSessionGetServletサーブレットのdoGet()メソッドには下記のように記述します。</p>
<pre>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    <span style="color:#ff0000;">HttpSession session = request.getSession();</span>
    
    out.println("&lt;html&gt;");
    out.println("&lt;head&gt;");
    out.println("&lt;title&gt;セッションIDの取得&lt;/title&gt;");
    out.println("&lt;/head&gt;");
    out.println("&lt;body&gt;");
    out.println("&lt;h1&gt;セッションIDの取得(ページ2)&lt;/h1&gt;");
    out.println("&lt;p&gt;セッションIDは「" + <span style="color:#ff0000;">session.getId()</span> + "」です。&lt;/p&gt;");
    out.println("&lt;a href=\"SampleSessionCtl\"&gt;前のサーブレットに戻る&lt;/a&gt;");
    out.println("&lt;/body&gt;");
    out.println("&lt;/html&gt;");
}</pre>
<p>ここでもgetSession()メソッドを呼び出していますが、今回は、既にセッションが開始されているので、セッション管理の開始時に生成されたHttpSessionオブジェクトが戻り値として返されます。そのため、getId()メソッドで取得するセッションIDは前のページで表示した文字列と同じになります。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=249</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>セッション管理</title>
		<link>http://web.javastudy.biz/?p=246</link>
		<comments>http://web.javastudy.biz/?p=246#comments</comments>
		<pubDate>Sun, 26 Apr 2015 15:10:39 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[サーブレット]]></category>
		<category><![CDATA[セッション管理]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=246</guid>
		<description><![CDATA[ステートフルを実現する方法のひとつとして前回はクッキーの利用について見てきましたが、今回からはセッションを利用した方法について見ていきます。 クッキーの問題点 クッキーを利用すれば、Webページを遷移しても状態を引き継ぐ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>ステートフルを実現する方法のひとつとして前回はクッキーの利用について見てきましたが、今回からはセッションを利用した方法について見ていきます。</p>
<h3>クッキーの問題点</h3>
<p>クッキーを利用すれば、Webページを遷移しても状態を引き継ぐような仕組み(ユーザーを特定できる仕組み)を実現できますが、ある問題が残ります。</p>
<p>クッキーはWebブラウザを通してクライアントのローカルディスクにファイルとして保存することになります。ローカルディスク上に保存される、そのファイルは簡単に探し出すことができ、実体はただのテキストファイルであるため、開けば中身を普通に参照できます。それはつまり、ユーザー名やパスワードも平文のまま保存されてしまうということです。</p>
<p>自分専用のPCであればまだしも、公共施設やカフェなど、不特定多数のユーザーが使用するPCは至る所に存在するので、クッキーを利用するということは、セキュリティ上、非常に危険な要素を含んでいるのです。</p>
<h3>セッション管理</h3>
<p>Webアプリケーションは、決まった順番で実行させなければならないものがほとんどです。(そのように決められた一連の処理のことをトランザクション処理と言います。)</p>
<p>ステートレスなプロトコルであるHTTPを使用する以上、トランザクション処理を行うためには、ユーザーを識別するための仕組みを作る必要があります。その仕組みはJavaでコーディングすれば作成可能ですが、ソースコードが長くなってしまいます。また、そのようなものは大抵のWebアプリケーションで共通して必要なものであり、毎回同じコードを書かなくてはいけません。</p>
<p>そこで考えだされたのが、そのような仕組みは、Webコンテナの機能として組み込んでしまおうという発想です。</p>
<p>セッションとは特定のクライアントとの通信接続状態を管理する情報のことです。Webコンテナはリクエストを送信してきたWebブラウザに対し、複数のユーザーを識別するためのネットワーク上で重複しないユニークな番号を割り振り、それをWebブラウザに渡します。(そのユニークな番号のことを「セッションID」と言います。)</p>
<p>セッションIDはクッキーを利用してユーザーのPC上に保存されます。以降、Webブラウザから送信されるHTTPリクエストにはクッキーによりセッションIDが埋め込まれ、そのHTTPリクエストを受信したWebコンテナは、セッションIDをキーにして、そのユーザーは前回と同一のユーザーであると判断します。</p>
<p>また、Webコンテナは各ユーザー(Webブラウザ)に対して専用のメモリー領域を用意します、そのメモリ領域のことを「セッションオブジェクト」と言います。セッションオブジェクトには、ユーザーとのやり取りで使用する任意のデータを保存してくおくことができます。</p>
<p>Webコンテナはサーブレットを呼び出すとき、サーブレットにそのユーザーのセッションオブジェクトを自動的に教えます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/se_01.png" alt="セッション管理概要" width="683" height="277" class="aligncenter size-full wp-image-247" /></p>
<p>このような仕組みにより、Webコンテナは、不特定多数のユーザーを見分けることができるのです。それをセッション管理と言います。</p>
<h3>クッキーとの違い</h3>
<p>クッキーとの決定的な違いは、クッキーはクライアントのPC上にデータを保存しておくのに対し、上記のWebコンテナによるセッション管理では、セッションID以外のデータはサーバー上に保存されるということです。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=246</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>クッキーの発行と取得</title>
		<link>http://web.javastudy.biz/?p=238</link>
		<comments>http://web.javastudy.biz/?p=238#comments</comments>
		<pubDate>Sat, 25 Apr 2015 16:55:58 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[Cookie]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[クッキー]]></category>
		<category><![CDATA[サーブレット]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=238</guid>
		<description><![CDATA[今回は、クッキーを使用したサンプルサーブレットを作成していきます。 以前に作成したサンプルサーブレットを改良します。 まずは、作成していくサーブレットの内容を下記します。 適当な質問フォームを表示し、ユーザーに入力させま [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今回は、クッキーを使用したサンプルサーブレットを作成していきます。<br />
<a href="http://web.javastudy.biz/?p=210" target="_blank">以前に作成したサンプルサーブレット</a>を改良します。</p>
<p>まずは、作成していくサーブレットの内容を下記します。</p>
<p>適当な質問フォームを表示し、ユーザーに入力させます。<br />
<img src="http://web.javastudy.biz/wp-content/uploads/2015/04/cookie_10.png" alt="クッキーサンプル01" width="497" height="418" class="aligncenter size-full wp-image-239" /></p>
<p>送信ボタンが押されたら、入力されたデータをサーブレット「RequestRecv」に渡します。</p>
<p>「RequestRecv」では、質問フォームで入力されたデータを表示させるとともに追加の質問フォームを表示するHTMLをHTTPレスポンスとして返します。その際、クッキーを発行し、入力データもクライアントへ渡します。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/cookie_11.png" alt="クッキーサンプル02" width="497" height="418" class="aligncenter size-full wp-image-240" /></p>
<p>データ入力後、送信ボタンを押せば、入力されたデータがサーブレット「SampleGetCookie」に渡されるようにします。さらに、送信ボタンを押した際のHTTPリクエストの中に、クッキーにより、前回の入力データを格納し、「SampleGetCookie」に渡します。</p>
<p>「SampleGetCookie」は、質問フォームで入力されたデータを表示させるとともに、クッキーからデータを取得し、そのデータを表示するHTMLをHTTPレスポンスとして返します。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/cookie_12.png" alt="クッキーサンプル03" width="497" height="418" class="aligncenter size-full wp-image-241" /></p>
<h3>クッキー操作メソッド一覧</h3>
<p>クッキーを操作するには、主に下記メソッドを使用します。</p>
<dl>
<dt>void addCookie(Cookie cookie)</dt>
<dd>クライアントにクッキーを保存する場合はHttpServletResponseインターフェースで定義されているaddCookieメソッドを使用します。なお、1つのドメインに対して保存できるCookieの数は20個まで、1つのCookieは名前と値を合わせて4096バイトまで、クライアントに保存できるCookieの数は全体で300個までに制限されます。</p>
<p>addCookieメソッドの引数にはjavax.servlet.http.Cookieオブジェクトを設定します。Cookieクラスの引数はString型の「名前」と「値」の2つです。コンストラクタの定義は以下になります。<br />
Cookie(String name, String value)
</dd>
<dt>void setMaxAge(int 有効期限)</dt>
<dd>クッキーの有効期限を秒単位で指定します。指定した有効期限を超えた場合、クライアントのWebブラウザの保存場所から破棄されます。負の値を指定するとWebブラウザが終了したときに削除されます。また0を指定すると直ちに削除されます。
</dd>
<dt>Cookie[ ] getCookies()</dt>
<dd>クライアントに保存されているクッキーのテキストを取得するにはHttpServletRequestインターフェースに定義されているgetCookiesメソッドを使用します。戻り値にはCookieオブジェクトの配列が返されます。</p>
<p>クッキーの取得は保存したWebサーバーから読み出すことはできますが、他のWebサーバーが保存したクッキーを取得することはできません。</dd>
<p>クライアントに保存したCookieオブジェクトを削除するには、コンストラクタで値を空にしたインスタンスを生成します。もしくは上記したsetMaxAge()メソッドの引数(有効期限)で0を設定します。</p>
<pre>Cookie cookMemberName = new Cookie("MemberName", "");
cookMemberName.setMaxAge(0);</pre>
<h3>サンプルサーブレットのソースコード</h3>
<p>以降に各サーブレットのソースコードを記載します。(冗長な部分は省略し、主要な部分のみ記載しています。)</p>
<p>まずは、フォームを作成します。フォーム(HTMLファイル)の詳細な作成方法は<a href="http://web.javastudy.biz/?p=210" target="_blank">こちら</a>を参照してください。</p>
<pre>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;title&gt;サーブレットへのデータ送信&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;サーブレットへのデータ送信&lt;/h1&gt;
&lt;form action="RequestRecv" method="GET"&gt;
&lt;p&gt;好きなゲームは？&lt;/p&gt;
&lt;input type="TEXT" name="Game" size=40&gt;
&lt;input type="submit" value="送信"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>テキストボックスに入力後、送信ボタンをクリックした場合のアクションとして、RequestRecvサーブレットを呼び出してします。その際のリクエストの種類には「GET」を指定しています。</p>
<p>RequestRecvサーブレットのdoGet()メソッドには下記のように記述します。</p>
<pre>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String gameName = request.getParameter("Game");
    
    <span style="color:#ff0000;">Cookie cookGameTitle = new Cookie("GameTitle", gameName);</span>
    <span style="color:#ff0000;">cookGameTitle.setMaxAge(60*60*24);</span>
    <span style="color:#ff0000;">response.addCookie(cookGameTitle);</span>
    
    PrintWriter out = response.getWriter();
    
    out.println("&lt;html&gt;");
    out.println("&lt;head&gt;");
    out.println("&lt;title&gt;あなたの回答&lt;/title&gt;");
    out.println("&lt;/head&gt;");
    out.println("&lt;body&gt;");
    out.println("&lt;h1&gt;あなたの回答&lt;/h1&gt;");
    out.println("好きなゲームは" + gameName + "です。&lt;br /&gt;&lt;br /&gt;");
    
    out.println("では、そのゲームの好きなナンバリングは？&lt;br /&gt;");
    out.println("&lt;form action=\"SampleGetCookie\" method=\"POST\"&gt;");
    out.println("&lt;input type=\"TEXT\" name=\"GameNumbering\" size=40&gt;");
    out.println("&lt;input type=submit value=\"次のサーブレットを起動\"&gt;");
    out.println("&lt;/form&gt;");
    
    out.println("&lt;/body&gt;");
    out.println("&lt;/html&gt;");
}</pre>
<p>getParameter()メソッドで取得したデータを、addCookie()メソッドでクッキーに保存します。その前の、setMaxAge()メソッドでは、有効期限を1日としています。</p>
<p>「次のサーブレットを起動」ボタンをクリックした場合のアクションとして、SampleGetCookieサーブレットを呼び出してします。その際のリクエストの種類には「POST」を指定しています。また、注意点として、println()メソッドでダブルクォーテーショ(&#8220;)を出力したい場合は、「\」(バックスラッシュもしくは環境によっては円マーク)でエスケープしてやる必要があります。</p>
<p>SampleGetCサーブレットのdoPost()メソッドには下記のように記述します。</p>
<pre>protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    <span style="color:#ff0000;">Cookie[] cookies = request.getCookies();</span>
    String gameTitle = "";
    String gameNumbering = request.getParameter("GameNumbering");
    
    <span style="color:#ff0000;">if (cookies != null) {
        for (Cookie cook : cookies) {
            if (cook.getName().equals("GameTitle")) {
                gameTitle = cook.getValue();
            }
        }
    }</span>
    
    PrintWriter out = response.getWriter();
    
    out.println("&lt;html&gt;");
    out.println("&lt;head&gt;");
    out.println("&lt;title&gt;クッキーサンプル&lt;/title&gt;");
    out.println("&lt;/head&gt;");
    out.println("&lt;body&gt;");
    out.println("&lt;h1&gt;クッキーサンプル&lt;/h1&gt;");
    out.println("好きなゲームは" + gameTitle + "です。&lt;br /&gt;");
    out.println("ナンバリングは" + gameNumbering + "です。&lt;br /&gt;");
    out.println("&lt;/body&gt;");
    out.println("&lt;/html&gt;");
}</pre>
<p>getCookies()メソッドで、クッキーを取得し、さらに、getParameter()メソッドでデータを取得しています。そして、それらを表示するHTMLを生成しています。</p>
<h3>不完全なサーブレット</h3>
<p>上記サンプルは一見、動いたように見えますが、致命的な問題が存在しています。例えば、フォーム画面でテキストボックスに日本語を入力して「送信」ボタンをクリックしたら、HTTPステータス500が返り、サーバー内部エラーとなります。</p>
<p>サーバー内部では「java.lang.IllegalArgumentException: Control character in cookie value or attribute.」という例外が発生しています。</p>
<p>このエラーの発生箇所は下記になります。</p>
<pre>Cookie cookGameTitle = new Cookie("GameTitle", gameName);</span>
cookGameTitle.setMaxAge(60*60*24);
response.addCookie(cookGameTitle);</pre>
<p>実は、Cookieの値として使用できる文字には制限があり、日本語をそのままクッキーに保存しようとしているため、エラーが発生しています。このエラーは回避するにはURLエンコードと呼ばれる処理を行う必要があります。</p>
<p>URLエンコードとデコードはそれぞれ、URLEncoder.encode()メソッド、URLDecoder.decode()メソッドで行えます。<br />
URLEncoder.encodeは、テキストをURLエンコードしたものを返し、URLDecoder.decodeはエンコードされたテキストを元のテキストに戻したものを返します。<br />
これらを利用し、テキストをエンコードしてクッキーに保存し、クッキーから取り出したら再びデコードして利用することで、日本語でも問題なくクッキーに保管しておけるようになります。</p>
<p>但し、今ではこの方法はあまり使われません。クッキーをそのまま使うにはかなり致命的な問題があり、推奨されないからです。では、どのように「ステートフル」を実現すれば良いのでしょう。次回の記事でクッキーの問題点と代替の方法について見ていきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=238</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>クッキー(Cookie)の利用</title>
		<link>http://web.javastudy.biz/?p=234</link>
		<comments>http://web.javastudy.biz/?p=234#comments</comments>
		<pubDate>Wed, 22 Apr 2015 11:29:26 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[Cookie]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[クッキー]]></category>
		<category><![CDATA[サーブレット]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=234</guid>
		<description><![CDATA[通常、ひとつのWebシステムは複数のWebアプリケーションで構成されます。 例として、ショッピングサイトでの商品購入までの流れを考えてみます。 まず、商品を購入するためにはユーザー登録を行い、システムへログインする必要が [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>通常、ひとつのWebシステムは複数のWebアプリケーションで構成されます。</p>
<p>例として、ショッピングサイトでの商品購入までの流れを考えてみます。<br />
まず、商品を購入するためにはユーザー登録を行い、システムへログインする必要があります。その後、商品を検索し、欲しい商品が決まったら、購入ページへ遷移し、決済を行います。</p>
<p>このとき、最初にシステムにログインすると、その後ログオフしない限り、同じシステム内でページを遷移する際、ログイン状態を引き継ぎます。そのような状態を「ステートフル」と言います。</p>
<p>その逆に、ページを遷移する際にログイン状態を引き継がないことを、「ステートレス」と言います。</p>
<p>そのため、上記のようなショッピングサイトを構築するためには、ステートフルな仕組みが必要となります。</p>
<p>ただ、Webアプリケーションで使用するHTTPは、ステートレスなプロトコルであり、1ページごとに1セッションとなってしまいます。<br />
ステートフルを実現するには、ページを遷移しても状態を引き継ぐような仕組みが必要です。</p>
<p>そのための仕組みのひとつにCookie（クッキー）というものがあります。</p>
<h3>クッキー(Cookie)とは</h3>
<p>クッキー(Cookie)とは、Webサイトの提供者が、Webブラウザを通じてクライアントのパソコン上に一時的にデータを書き込んで保存させる仕組みのことです。</p>
<p>本来、セキュリティ上の理由などから、Webサイトの提供者がクライアントのパソコンにデータを保持することはできないのですが、このクッキーという仕組みのみ、それが可能です。</p>
<p>クッキーには、ユーザーIDやパスワードなど、提供側が指定した任意のデータを保存しておくことができ、その仕組みを使用して、複数のページでデータを共有し、結果、ステートフルを実現することができるのです。</p>
<p>ただし、クッキーにはいくつかの制限事項があります。</p>
<ul>
<li>1つのCookieに保存できるサイズは4096バイト以内。</li>
<li>1台のサーバーが同じコンピュータに対して発行できるCookieの数は20個のみ。</li>
<li>Cookieの総数は300個まで。これを超えると古い方から削除される。</li>
<li>個々のCookieには有効期限が設定されており、期限を過ぎたものは破棄される。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=234</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
