<?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; わかりやすい図解解説 &#187; Javaサーブレット入門</title>
	<atom:link href="http://web.javastudy.biz/?cat=37&#038;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=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>
		<item>
		<title>GETメソッドとPOSTメソッドの違い</title>
		<link>http://web.javastudy.biz/?p=229</link>
		<comments>http://web.javastudy.biz/?p=229#comments</comments>
		<pubDate>Tue, 21 Apr 2015 08:22:35 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[GET]]></category>
		<category><![CDATA[HTTPリクエスト]]></category>
		<category><![CDATA[POST]]></category>
		<category><![CDATA[メソッド]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=229</guid>
		<description><![CDATA[サーブレットは、WebクライアントからHTTPリクエストを受信したら実行されます。 HTTPリクエストでは、リクエストラインの中でリクエストの種類(メソッド)を指定します。詳細は「HTTPリクエストの構成 」を参照してく [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>サーブレットは、WebクライアントからHTTPリクエストを受信したら実行されます。</p>
<p>HTTPリクエストでは、リクエストラインの中でリクエストの種類(メソッド)を指定します。詳細は「<a href="http://web.javastudy.biz/?p=27" target="_blank">HTTPリクエストの構成</a> 」を参照してください。</p>
<p>サーブレットは、そのリクエストの種類に応じて最初に呼び出されるメソッドが変わってきます。<br />
例えば、リクエストの種類が「GET」であれば、サーブレットではdoGet()メソッドが呼び出され、リクエストの種類が「POST」であれば、doPost()メソッドが呼び出されることになります。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/method_10.png" alt="GETメソッドとPOSTメソッド" width="657" height="383" class="aligncenter size-full wp-image-230" /></p>
<p>リクエストの種類は「GET」「POST」以外にもあり、サーブレットはそれらに対するメソッドが呼び出されます。<br />
どのようなメソッドが存在するのかは「サーブレット作成」ダイアログ等から確認できます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/method_11.png" alt="メソッドの種類" width="640" height="391" class="aligncenter size-full wp-image-231" /></p>
<p>ただし、主に使われるのはdoGet()メソッドかdoPost()メソッドのどちらかになります。</p>
<h3>GETメソッドとPOSTメソッドの違い</h3>
<p>では、GETメソッドとPOSTメソッドの違いは何でしょう。</p>
<p>両者の違いは、パラメータの受け渡し方法にあります。<br />
GETメソッドでは、サーブレットに受け渡すパラメータをURLに組み込んでいます。<br />
対して、POSTメソッドは、HTTPリクエストのメッセージボディの中に組み込んでいます。</p>
<p>例えば、<a href="http://web.javastudy.biz/?p=210" target="_blank">前回の記事</a>で作成したサンプルでは、リクエストの種類に「GET」を指定していたので、サーブレットを呼び出すURLは下記のようになります。</p>
<p>http://localhost:8080/RequestRecvPJ/RequestRecv?Game=%E3%83%A2%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%8F%E3%83%B3%E3%82%BF%E3%83%BC&#038;Hard=%E3%83%95%E3%82%A1%E3%83%9F%E3%82%B3%E3%83%B3</p>
<p>※「%E3」などはURLエンコードされた状態の文字列です。URLデコードしたら元の文字列に戻ります。</p>
<p>GETの場合、URL内部にパラメータが組み込まれるので、ブラウザの履歴やキャッシュが残ります。<br />
POSTは残らないので、機密性が高いと言えなくもありませんが、結局、パケットは平文で流れるので、機密性について考える場合は、どちらにしても別途、暗号化の仕組みを取り入れる必要があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=229</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>クライントからのデータ受け取り</title>
		<link>http://web.javastudy.biz/?p=210</link>
		<comments>http://web.javastudy.biz/?p=210#comments</comments>
		<pubDate>Mon, 20 Apr 2015 03:37:51 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[getParameter]]></category>
		<category><![CDATA[データ受信]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=210</guid>
		<description><![CDATA[クライアントから送信されたデータをサーブレットで受け取る方法について見てきます。 今回は、HTMLのフォームに入力されたデータをサーブレットで受け取り、レスポンスとして、受け取ったデータを出力するサンプルを作成していきま [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>クライアントから送信されたデータをサーブレットで受け取る方法について見てきます。</p>
<p>今回は、HTMLのフォームに入力されたデータをサーブレットで受け取り、レスポンスとして、受け取ったデータを出力するサンプルを作成していきます。</p>
<h3>フォームの作成</h3>
<p>サーブレットを作成する前に、まずはフォームを作成します。フォーム(HTMLファイル)も、Eclipse上から作成できます。</p>
<p>まずは新規プロジェクトを作成します。</p>
<p>Eclipseのメニューから「ファイル」-「新規」-「動的Webプロジェクト」をクリックします。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_01.png" alt="動的Webプロジェクト" width="644" height="306" class="aligncenter size-full wp-image-211" /></p>
<p>「新規動的Webプロジェクト」ダイアログが表示されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_02.png" alt="「新規動的Webプロジェクト」ダイアログ" width="640" height="464" class="aligncenter size-full wp-image-212" /></p>
<p>任意のプロジェクト名を入力して「次へ」をクリックします。このサンプルではプロジェクト名を「RequestRecvPJ」としています。</p>
<p>新規プロジェクトが作成され、プロジェクト・エクスプローラに追加されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_03.png" alt="新規プロジェクト" width="426" height="341" class="aligncenter size-full wp-image-213" /></p>
<p>続いて、今作成したプロジェクトを選択した状態で、メニューの「新規」-「その他」をクリックします。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_04.png" alt="「新規」-「その他」" width="640" height="360" class="aligncenter size-full wp-image-214" /></p>
<p>「ウィザードを選択」ダイアログが表示されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_05.png" alt="ウィザードを選択" width="640" height="351" class="aligncenter size-full wp-image-215" /></p>
<p>「Web」-「HTMLファイル」を選択し、「次へ」ボタンをクリックします。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_06.png" alt="HTMLファイル" width="640" height="448" class="aligncenter size-full wp-image-216" /></p>
<p>任意のHTMLファイル名を入力し、「完了」ボタンをクリックします。このサンプルではHTMLファイル名を「FormSample.html」としています。</p>
<p>プロジェクト・エクスプローラに「FormSample.html」が追加されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_07.png" alt="FormSample.html" width="429" height="408" class="aligncenter size-full wp-image-217" /></p>
<p>「FormSample.html」を開いて、下記のようなHTMLを入力します。</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;p&gt;初めて購入したハードは？&lt;/p&gt;
&lt;input type="checkbox" name="Hard" value="ファミコン"&gt;ファミコン&lt;br /&gt;
&lt;input type="checkbox" name="Hard" value="スーパーファミコン"&gt;スーパーファミコン&lt;br /&gt;
&lt;input type="checkbox" name="Hard" value="セガサターン"&gt;セガサターン&lt;br /&gt;
&lt;input type="checkbox" name="Hard" value="プレーステーション"&gt;プレイステーション&lt;br /&gt;&lt;br /&gt;
&lt;input type="submit" value="送信"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>以上でフォームは完成です。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_10.png" alt="サンプルフォーム" width="497" height="418" class="aligncenter size-full wp-image-218" /></p>
<h3>サーブレットの作成</h3>
<p>続いて、サーブレットを作成します。</p>
<p>プロジェクトを選択した状態で、メニューの「新規」-「サーブレット」をクリックします。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_20.png" alt="「新規」-「サーブレット」" width="640" height="336" class="aligncenter size-full wp-image-223" /></p>
<p>「サーブレット作成」ダイアログが表示されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_21.png" alt="サーブレット作成" width="640" height="371" class="aligncenter size-full wp-image-224" /></p>
<p>「Javaパッケージ」と「クラス名」に任意の名前を入力します。<br />
ここでは、それぞれ「sample_pkg02」、「RequestRecv」と入力します。<br />
入力後、「完了」をクリックします。</p>
<p>プロジェクト・エクスプローラに「sample_pkg02」パッケージと「RequestRecv.java」が追加されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_22.png" alt="プロジェクト・エクスプローラ" width="422" height="386" class="aligncenter size-full wp-image-219" /></p>
<p>「RequestRecv.java」をダブルクリックして開いてください。</p>
<p>RequestRecv.javaを開くと、いくつか警告が表示されています。<br />
まずはこの警告を消してください。警告の消し方は<a href="http://web.javastudy.biz/?p=160" target="_blank">こちら</a>を参照してください。</p>
<p>フォーム作成時、method属性に&#8221;Get&#8221;を指定したので、doGet()メソッドに、フォームから受け取ったデータを出力するコードを記述します。</p>
<pre>@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String gameName = request.getParameter("Game");
    String hardName = request.getParameter("Hard");
    
    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 + "です。");
    out.println("初めて購入したハードは" + hardName + "です。");
    out.println("&lt;/body&gt;");
    out.println("&lt;/html&gt;");
}</pre>
<p>データの取得にはHttpServletRequestクラスのgetParameter()メソッドを使用します。<br />
メソッドの引数には、フォームHTMLで記述したinputタグのname属性の値を指定します。</p>
<p>クライアントから送信されるデータの取得は、主に下記メソッドを使用します。</p>
<dl>
<dt>public String getParameter(String)</dt>
<dd>引数にパラメータの名前を指定し、そのパラメータの値を取得します。パラメータが存在しない場合はNullが返されます。</dd>
<dt>public String[ ] getParameterValues(String)</dt>
<dd>ひとつのパラメータに対し、複数の値が指定された場合にこのメソッドを使用します。値はString型の配列で返されます。パラメータが存在しない場合はNullが返されます。</dd>
<dt>public Enumeration getParameterNames( )</dt>
<dd>クライアントから送信されるすべてのパラメータの名前を取得します。</dd>
</dl>
<h3>文字エンコーディング</h3>
<p>ここまででひととおり完成ですが、このままではサーブレットで文字化けを起こし、Webブラウザ上に正しく日本語が表示されません。</p>
<p>「<a href="http://web.javastudy.biz/?p=194" target="_blank">サーブレットでの文字化け対策</a>」に記載したように文字エンコーディング用のフィルタを作成してください。</p>
<p>もしくは、フィルタで記述する内容をdoGet()メソッド内で記述しても構いません。</p>
<pre>@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    <span style="color:#ff0000;">request.setCharacterEncoding("UTF-8");</span>
    <span style="color:#ff0000;">response.setContentType("text/html; charset=UTF-8");</span>
    
    String gameName = request.getParameter("Game");
    String hardName = request.getParameter("Hard");
    
    ：
</pre>
<p>setCharacterEncoding()メソッドでパラメータデータのエンコード方式を指定します。<br />
このメソッドは、必ず、値を取得する前(上記サンプルではgetParameterメソッドを呼び出す前)に指定してください。</p>
<h3>動作確認</h3>
<p>以上でサンプルサーブレットは完成です。早速、動作確認をしてみましょう。<br />
まず、フォームのWebページを開きます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_30.png" alt="データ送信" width="497" height="418" class="aligncenter size-full wp-image-220" /></p>
<p>適当に入力し、「送信」をクリックします。</p>
<p>すると、サーブレットに入力したデータが渡され、レスポンスとして下記のように返されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/input_31.png" alt="データ受信" width="497" height="418" class="aligncenter size-full wp-image-221" /></p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=210</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>サーブレットでの文字化け対策</title>
		<link>http://web.javastudy.biz/?p=194</link>
		<comments>http://web.javastudy.biz/?p=194#comments</comments>
		<pubDate>Sun, 19 Apr 2015 16:46:18 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[エンコーディング]]></category>
		<category><![CDATA[サーブレット]]></category>
		<category><![CDATA[フィルタ]]></category>
		<category><![CDATA[文字化け]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=194</guid>
		<description><![CDATA[サーブレットで日本語を表示させるにはどうしたら良いのでしょうか。 まず、前回の記事で作成したサーブレットの一部を変更して、日本語を出力できるか試してみます。 doGet()メソッドを下記のように変更します。 @Overr [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>サーブレットで日本語を表示させるにはどうしたら良いのでしょうか。</p>
<p>まず、<a href="http://web.javastudy.biz/?p=160" target="_blank">前回の記事</a>で作成したサーブレットの一部を変更して、日本語を出力できるか試してみます。</p>
<p>doGet()メソッドを下記のように変更します。</p>
<pre>
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    PrintWriter out = response.getWriter();
    out.println("&lt;html&gt;");
    out.println("&lt;head&gt;");
    out.println("&lt;title>Encoding Sample&lt;/title&gt;");
    out.println("&lt;/head&gt;");
    out.println("&lt;body&gt;");
    out.println("&lt;h1>Encoding Sample&lt;/h1&gt;");
    out.println("&lt;p>こんにちは。&lt;/p&gt;");
    out.println("&lt;/body&gt;&lt;/html&gt;");
}</pre>
<p>これをWebブラウザで表示すると、下記のように文字化けしてしまいます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_01.png" alt="文字化けサンプル" width="496" height="405" class="aligncenter size-full wp-image-195" /></p>
<p>これは、Webブラウザ側の問題ではなく、サーブレットが日本語に対応していないためです。</p>
<h3>文字エンコーディング</h3>
<p>日本語が文字化けしてしまうのは、サーブレットが日本語の文字コードに対応していないためです。<br />
文字コードに対応させるためには、文字エンコーディングと呼ばれる処理を行う必要があります。</p>
<p>文字コードとは文字に割り当てられた「数字」のことで、エンコードは文字と数字をマッピングする方式のことです。</p>
<p>では、その文字エンコーディングはどのように実現すれば良いのでしょうか。</p>
<h3>フィルタ</h3>
<p>文字エンコーディングを行うには、フィルタを使用します。</p>
<p>フィルタとはWebクライアントとサーバー間のリクエスト・レスポンス時に何らかの処理を行う機能のことです。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_07.png" alt="フィルタ" width="570" height="190" class="aligncenter size-full wp-image-197" /></p>
<p>このフィルタ機能を利用して文字エンコーディングを実現します。<br />
フィルタは、文字エンコーディングの他にも、ログの生成や認証などの処理にも使用されます。</p>
<h3>フィルタの作成手順</h3>
<p>フィルタには、Webアプリケーションへリクエストが渡される前、または、Webクライアントへレスポンスを返した後に実行する処理を実装します。</p>
<p>現在のプロジェクトを選択した状態で、メニューから「ファイル」-「新規」-「その他」をクリックします。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_00.png" alt="プロジェクト選択" width="385" height="314" class="aligncenter size-full wp-image-203" /></p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_02.png" alt="「ファイル」-「新規」-「その他」" width="640" height="374" class="aligncenter size-full wp-image-196" /></p>
<p>「ウィザードを選択」では、「Web」から「フィルター」を選択して、「次へ」をクリックします。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_03_001.png" alt="ウィザード選択" width="640" height="380" class="aligncenter size-full wp-image-205" /></p>
<p>「フィルターの作成」画面に遷移します。</p>
<p><a href="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_03.png"><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_03.png" alt="フィルタの作成" width="640" height="359" class="aligncenter size-full wp-image-198" /></a></p>
<p>「Javaパッケージ」欄には「filter」、「クラス名」欄には「SampleFilter」と入力し、「次へ」をクリックします。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_04.png" alt="フィルター・マッピング" width="877" height="590" class="aligncenter size-full wp-image-200" /></p>
<p>「フィルター・マッピング」-「URLパターン/サーブレット名」欄には、「/SampleFilter」と入力されています。「編集」をクリックして、「/*」に変更します。これにより、このEclipseプロジェクトの全サーブレットがフィルタ対象になります。</p>
<p>最後に「完了」をクリックします。</p>
<p>すると、プロジェクトに「filter」パッケージと「SampleFilter.java」が作成されます。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_05.png" alt="フィルタサンプル" width="640" height="459" class="aligncenter size-full wp-image-199" /></p>
<p>「SampleFilter.java」をダブルクリックして開いてください。</p>
<p>SampleFilter.javaを開くと、いくつか警告が表示されています。<br />
まずはこの警告を消してください。警告の消し方は<a href="http://web.javastudy.biz/?p=160" target="_blank">こちら</a>を参照してください。</p>
<p>doFilter()メソッドにリクエスト・レスポンス時のエンコード処理を記述します。</p>
<pre>
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // TODO Auto-generated method stub
    // place your code here
    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html; charset=UTF-8");
    // pass the request along the filter chain
    chain.doFilter(request, response);
}</pre>
<p>これでWebブラウザ上に日本語が表示されるようになります。</p>
<p><img src="http://web.javastudy.biz/wp-content/uploads/2015/04/encoding_06.png" alt="サーブレットで日本語表示" width="496" height="405" class="aligncenter size-full wp-image-201" /></p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=194</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>@WebServletアノテーション</title>
		<link>http://web.javastudy.biz/?p=183</link>
		<comments>http://web.javastudy.biz/?p=183#comments</comments>
		<pubDate>Fri, 17 Apr 2015 14:59:38 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[@WebServlet]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[アノテーション]]></category>
		<category><![CDATA[サーブレット]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=183</guid>
		<description><![CDATA[前回の記事で作成したサーブレットはWebブラウザから下記URLにアクセスすることで実行されました。 http://localhost:8080/HelloWorld_PJ01/HelloWorldServlet このよう [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://web.javastudy.biz/?p=160" target="_blank">前回の記事</a>で作成したサーブレットはWebブラウザから下記URLにアクセスすることで実行されました。</p>
<p>http://localhost:8080/HelloWorld_PJ01/HelloWorldServlet</p>
<p>このようにサーブレットは、WebブラウザからURLや、Webページの中のリンクにURLを指定して呼び出します。</p>
<p>そのURLは、Eclipseのプロジェクト名とサーブレットの@WebServletというアノテーションと関連付きます。</p>
<p><b>URLで指定して呼び出す場合</b></p>
<pre>http://サーバホスト名:ポート番号/Eclipseプロジェクト名/@WebServletアノテーション</pre>
<p>　　※ポート番号は省略できます。省略した場合はポート番号は80となります。</p>
<p><b>Webページの中のリンクから呼び出す場合</b></p>
<pre>&lt;a href="Eclipseプロジェクト名/@WebServletアノテーション"&gt;Click Here&lt;/a&gt;</pre>
<p><b>フォームから呼び出す場合</b></p>
<pre>&lt;form action="Eclipseプロジェクト名/@WebServletアノテーション" method=post&gt;</pre>
<p>@WebServletアノテーションはServlet3.0から利用できるようになった機能です。</p>
<p>それまでのServlet2.5以前は、web.xmlに&lt;url-parttern&gt;を記述することで指定していましたが、<br />
Servletは3.0になってからアノテーションを利用することでServletの設定が単純になりました。</p>
<h3>@WebServlet使用例</h3>
<p>前回は@WebServletを以下のように設定しました。</p>
<pre>@WebServlet("/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {</pre>
<p>@WebServletには以下のような属性を設定できます。</p>
<p><strong>@WebServletの属性</strong></p>
<table>
<tr>
<th>属性名</th>
<th>説明</th>
</tr>
<tr>
<td>name</td>
<td>サーブレット名を設定する</td>
</tr>
<tr>
<td>description</td>
<td>サーブレットの説明を設定する</td>
</tr>
<tr>
<td>displayName</td>
<td>表示名を設定する</td>
</tr>
<tr>
<td>initParams</td>
<td>サーブレットの初期パラメタを設定する</td>
</tr>
<tr>
<td>smallIcon</td>
<td>GUIツールで使用する小アイコンを設定する</td>
</tr>
<tr>
<td>largeIcon</td>
<td>GUIツールで使用する大アイコンを設定する</td>
</tr>
<tr>
<td>loadOnStartup</td>
<td>サーブレットの開始順序を設定する</td>
</tr>
<tr>
<td>urlPatterns</td>
<td>マッピングするURLパターンを設定する</td>
</tr>
<tr>
<td>value</td>
<td>マッピングするURLパターンを設定する(urlPatternsと同時に設定した場合は無効)</td>
</tr>
</table>
<p>例えば、URLを複数指定したい場合は、下記のように記述します。</p>
<pre>@WebServlet(urlPatterns = {"/HelloWorldServlet", "/HelloServlet", "/HELLO"})
public class HelloWorldServlet extends HttpServlet {</pre>
<p>このようにweb.xmlにサーブレットマッピングを書く必要があったServlet2.5以前と比べ、設定は単純になりました。<br />
ただ、アノテーションはソースコード上に記述することになるので、各種設定は外出しして記述したいというケースも多く、ソースコード管理等の理由で、今でもweb.xmlを利用しているところも多いです。</p>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=183</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>サーブレットの基本</title>
		<link>http://web.javastudy.biz/?p=178</link>
		<comments>http://web.javastudy.biz/?p=178#comments</comments>
		<pubDate>Fri, 03 Apr 2015 13:18:20 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Javaサーブレット入門]]></category>
		<category><![CDATA[HttpServlet]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[サーブレット]]></category>

		<guid isPermaLink="false">http://web.javastudy.biz/?p=178</guid>
		<description><![CDATA[今回は前回作成した「HelloWorldServlet」を基にし、サーブレットの作成方法について詳しく見ていきます。 サーブレットを動作させるためにはそのための実行環境、すなわちTomcatというWebコンテナが必要です [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今回は前回作成した「HelloWorldServlet」を基にし、サーブレットの作成方法について詳しく見ていきます。</p>
<p>サーブレットを動作させるためにはそのための実行環境、すなわちTomcatというWebコンテナが必要です。そして、Webコンテナからサーブレットを呼び出すためにはHttpServletクラスを継承する必要があります。</p>
<p>また、Webクライアント(ここではブラウザ)がWebサーバーへのHTTPリクエストにメソッド種類「Get」を指定した場合、、そのリクエストを受けると、最初にdoGetメソッドが呼び出されます。</p>
<p>サーブレットからWebクライアントへ結果を送信する場合は、PrintWriterクラスのprintlnメソッドで行います。</p>
<p>これらを前提に、もう一度前回作成した「HelloWorldServlet」のJavaソースファイルを見ていきます。</p>
<pre>package sample_pkg01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloWorldServlet
 */
@WebServlet("/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloWorldServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter out = response.getWriter();
        out.println("&lt;html&gt;");
        out.println("&lt;head&gt;");
        out.println("&lt;title&gt;Hello World!&lt;/title&gt;");
        out.println("&lt;/head&gt;");
        out.println("&lt;body&gt;");
        out.println("&lt;h1&gt;Hello World!&lt;/h1&gt;");
        out.println("&lt;p&gt;First Servlet&lt;/p&gt;");
        out.println("&lt;/body&gt;&lt;/html&gt;");
    }
}
</pre>
<h3>パッケージのインポート</h3>
<p>サーブレットを作成する上で必要となるクラスは「javax.servlet.http」に含まれています。<br />
インポート部分は基本的にEclipseにより自動生成されるため実際に記述する必要はないところではありますが、サーブレットを作成していく上で、何をインポートする必要があるのかを理解しておく必要があります。</p>
<pre>
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
</pre>
<p>まずサーブレットを作成する上で大前提となるのがHttpServletクラスとなります。<br />
前述しましたが、作成するクラスをサーブレットとして定義するためには、HttpServletクラスを継承する必要があります。</p>
<p>HttpServletRequestクラスとHttpServletResponseクラスは、doGetメソッドの引数として受け渡されます。上記サンプルではそれぞれ「request」と「response」という変数名で定義しています。(Javaではそれらの変数のことをインスタンスと呼びます。)<br />
HttpServletRequestクラスのインスタンス(オブジェクト)にはサーブレットに対して送られてきたリクエストに含まれる、フォームなどで設定されたパラメータやクッキーなどの情報が格納されています。今回の例では特に使用していませんが、必要に応じて使用します。</p>
<p>HttpServletResponseクラスのインスタンスは、サーブレットからWebクライアントへデータを返信するために使用します。</p>
<p>HttpServletクラスの例外処理準備として、ServletExceptionクラスとIOExceptionクラスをインポートします。</p>
<p>PrintWriterクラスは、Webクライアントへデータを返信する際に、HttpServletResponseクラスとともに使用します。</p>
<h3>doGetメソッドの実装</h3>
<p>これも前述しましたが、WebクライアントがWebサーバーへのHTTPリクエストのメソッド種類が「Get」であれば、リクエストを受けると、最初にdoGetメソッドが呼び出されます。もし、メソッド種類が「Post」であれば、doPostメソッドが呼び出されます。</p>
<pre>
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        PrintWriter out = response.getWriter();
        out.println("&lt;html&gt;");
        out.println("&lt;head&gt;");
        out.println("&lt;title&gt;Hello World!&lt;/title&gt;");
        out.println("&lt;/head&gt;");
        out.println("&lt;body&gt;");
        out.println("&lt;h1&gt;Hello World!&lt;/h1&gt;");
        out.println("&lt;p&gt;First Servlet&lt;/p&gt;");
        out.println("&lt;/body&gt;&lt;/html&gt;");
    }
</pre>
<p>本サンプルでは、doGetメソッド内で、「HelloWorld!」文字列を含んだHTML文を出力しています。<br />
そのHTML文がWebクライアント(ブラウザ)に返され、クライアントの画面上に「HelloWorld!」文字列が表示されます。</p>
<pre>PrintWriter out = response.getWriter();</pre>
<p>上記のように、doGetメソッドの引数で受け取ったHttpServletResponseクラスのインスタンス(response)をPrintWriterクラスに委譲※することで、Webクライアントへ送信できるようになります。</p>
<p>※委譲とは、ある処理を別のオブジェクトに委ねることで別のオブジェクトの処理を再利用する手法のことです。</p>
<p>あとは、printlnメソッドの引数に出力したい文字列を指定します。</p>
<pre>out.println("&lt;html&gt;");</pre>
<p>本サンプルでは、HTMLタグを順番に出力しており、Webクライアントには下記HTMLが返されます。</p>
<pre>
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Hello World!&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Hello World!&lt;/h1&gt;
&lt;p>First Servlet&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://web.javastudy.biz/?feed=rss2&#038;p=178</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
