見出し画像

職業訓練でJavaを学ぶ!28日目(1/2)「Javaプログラミング実習(JSP/Servlet編)」

職業訓練で、Javaを使ったWebシステム開発・Androidアプリ開発を学ぶことになりました。復習かねて情報発信をします!
これから職業訓練に通うことを検討している方の参考になれば嬉しいです。

↓↓職業訓練に通うことになった経緯はこちら
https://note.mu/yukoro/n/ned8d43b0110d

本日の授業

・リクエスト処理 ←この記事
・状態維持


リクエスト処理

外部入力値の取得に関する用語と概念を見ていきます。

Webシステムは以下のような機能を持っています。

・ユーザーが情報を入力
 - ログイン情報(IDやパスワード)など

・ユーザーが入力したデータを取得/処理
 - 入力データのチェックなど

・処理を出力
 - ログインの処理結果など


処理の流れ:
-----------
クライアント(入力データの送信)
  ↓リクエスト
サーバ(データの受け取りと処理)
  ↓レスポンス
出力
-----------

クライアントから受けるリクエストの構成は、リクエスト行とヘッダ、ボディからなります。
-----------
リクエスト行:
 - メソッド(リクエストの種類:GETまたはPOST)、要求するファイルのURL、HTTPのバージョン
ヘッダ:
 - クライアントからサーバに渡す情報。ブラウザ、COOKIE、言語など
ボディ:
 - メソッドがPOSTの場合、フォームから送信されるデータ
 (POSTパラメータ)
------------


そしてWebクライアント(ブラウザ)はJSPで、Webサーバに対してGETやPOSTなどリクエストを送ることができます。
これらのリクエストを「リクエストメソッド」と言います。

主なリクエストメソッド:
------------
GET
 - URL入力や検索、リンクからのページアクセス時に送信されるリクエストメソッド。閲覧したいページや表示したい画像を取得できる。
POST
 - 送信ボタン(Submit)によるページアクセス時に送信されるリクエストメソッド。フォームからのデータ送信ができる。
------------


クライアントからのページリクエストの際に、「リクエストパラメータ」というパラメータを付けて、Webサーバにリクエストを送ることができます。
GETリクエストに付加するパラメータをGETパラメータ、POSTリクエストに付加するパラメータをPOSTパラメータと呼びます。

これらのパラメータを取り出して利用することのできる機能がJSPやServletには用意されています。


それではこのGETパラメータやPOSTパラメータの値を取得するプログラムの書き方を、詳しく見ていきましょう。


GETパラメータ

URLを通じて送信されるパラメータです。

URL末尾の?以降の文字列がGETパラメータに相当します。この文字列は、クエリストリング(クエリ文字列)とも呼ばれています。


URLの後に ? を付け、パラメータ名とそれに対応する値を = でつなげます。

例)太字部分がGETパラメータ
---------
http://www.example.com/index.jsp?id=1
---------


複数のパラメータがある場合は & で繋げることができます。

例)太字部分がGETパラメータ
---------
http://www.example.com/index.jsp?id=1&color=red
---------


ではこのパラメータをどのような場面で利用するのかというと、主にユーザーが欲しい情報の絞り込みで利用されます。
 - 検索のキーワード
 - ニュースのカテゴリ
 - 表示したいページ番号
 - 表示したい商品のID番号 など

またユーザーはパラメーターで絞り込まれたページを、ブックマークとして保存することもできます。


ユーザーにGETパラメータを送信させるためには、aタグのhrefにパラメータを仕込んでおき、ユーザーにパラメータのついたURLを踏んでもらうか、formタグのmethod属性の値をgetに設定しておく方法があります。

・URL
------------
<a href="detail.jsp?id=2">商品2の詳細</a>
------------

・formタグ
------------
<form action="process.jsp" method="get">
------------


では次に、ユーザーがリクエストとして送ったGETパラメーターを、受け取ってJavaで利用する方法を見ていきましょう。

GETパラメータはJSPの暗黙オブジェクトの一つであるrequestメソッドで、文字列として取り出すことができます。

一つのパラメータしかない場合は、getParameter()メソッドで取り出し、同じ名前の複数のパラメータがある場合は、getParameterValues()メソッドで文字列として取り出します。

例えば 1つのパラメータを取り出す場合、「<a href="detail.jsp?id=2">商品2の詳細</a>」 のようにURLとして送られた値は、このようにパラメータ名を指定することで取得できます。
--------------
String 変数名 = request.getParameter("パラメータ名");
--------------

また複数のパラメータを取り出す場合というのはどういう状況かというと、フォームの複数選択の時などです。同じ名前の項目が複数ある状況でこのように使うことができます。
-------------
String[] 変数名  = request.getParameterValues( ”パラメータ名” );
-------------


URLに含むことのできない「日本語」や「?」や「=」などの、URLの末尾に表記したパラメータ(クエリ文字列)は、URLエンコードという仕組みで変換が行われて送信されます。受け取る際はURLデコードという仕組みで元のデータに変換されて、受け取ることができます。request.getParameterを使う際は、自動的にデコードされるようになっています。


クエリ文字列で日本語を使用する場合、文字化けを防ぐための設定が必要になります。

◇JSPファイル内で、クエリ文字列の文字コードを UTF-8 に設定

例)JSPファイル内に記述
----------
request.setCharacterEncoding("UTF-8");
----------

◇Tomcatの設定ファイル (server.xml) 内で、<Connector>要素に useBodyEncodingForURI="true" を追加

例)server.xmlに記述
-----------
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" />
-----------


POSTパラメータ

GETパラメータと異なり、POSTパラメータはURLの末尾に表示されません。その特性上、個人情報の送信時に使用されることが多いパラメータです。
 - ログイン用ユーザIDとパスワード
 - 問い合わせフォームの内容
 - ユーザ登録の内容


POSTパラメータをユーザーに送信してもらうためには、formタグのmethod属性値をpostに設定します。

書式:
----------
<form action="example.jsp" method="post">
----------


ユーザーがリクエストとして送ったPOSTパラメーター受け取る場合は、 GETぱパラメータと同様にrequestメソッドを使います。

書式:
--------------
String 変数名 = request.getParameter("パラメータ名");
--------------


例)フォーム「input」からの値の送信と取得

//フォーム
<input type="text" name="address">

  ↓ POSTパラメータの送信

//パラメータn値の受け取り
String data = request.getParameter("address");


例)その他のフォーム「input」からの値の送信と取得

<input type="text" name="item">
<input type="password" name="item">

これらは String data = request.getParameter("item"); でユーザが入力した値を取得します

<input type="hidden" name="item" value="abc">

これは String data = request.getParameter("item"); でvalue属性の「abc」を変数dataに格納します。


例)フォーム「select」からの値の送信と取得

<select name="item">
    <option value="1">選択肢1</option>
    <option value="2">選択肢2</option>
    <option value="3">選択肢3</option>
</select>

これは String data = request.getParameter("item"); で選択された項目のvalue属性の値を変数dataに格納します。

もしvalue属性を省略した場合はoption要素内の文字列を取得します。


例)フォーム「radio」からの値の送信と取得

<input type="radio" name="item" value="1">選択肢1
<input type="radio" name="item" value="2">選択肢2

これは String data = request.getParameter("item"); で選択された項目のvalue属性の値を変数dataに格納します。
また「radio」の場合は、value属性を省略してしまうと、どの項目を選んでもONという値が帰ってきてしまい、どの項目が選択されたかが分からないため、基本的にvalue属性は省略せずに入れましょう。


例)フォーム「checkbox」からの値の送信と取得(項目が1つの場合)

<input type="checkbox" name="item">オプション1

これは項目にチェックが入った場合のみ String data = request.getParameter("item"); で「on」を変数dataに格納します。
value属性がある場合は、その属性の値を返します。

チェック項目が複数ある場合は、扱いが変わってくるので注意が必要です。次に説明します。


例)フォーム「checkbox」からの値の送信と取得(項目が複数の場合)

<input type="checkbox" name="item">オプション1
<input type="checkbox" name="item">オプション2
<input type="checkbox" name="item">オプション3

String[] data = request.getParameterValues("item"); で配列データとして変数dataに格納します。。また要素を1つずつ取得する際は、for文などで要素をループで回してショツクします。ループを回すため、1つもチェックが入っていないとエラーになってしまうため、必ず1つ以上はチェックが入っている必要があります


例)フォーム「textarea」からの値の送信と取得

<textarea name="item"></textarea>

String data = request.getParameter("item"); でテキストエリアに入力された内容を変数dataに格納します。

取得したデータは改行が反映されないため、受け取り側の要素を<pre></pre>囲むことで改行まで反映することができます。


自分自身にデータを送信するフォームを作成する場合は、formタグのaction属性をからにします。

書式:
------------
<form action="" method="post">
------------

どのような場面で使うかというと、フォームの動作確認や入力値に問題がないかを確認する際に設定することがあります。


リクエスト処理については以上です。

最後までお読みいただきありがとうございました!


この記事が気に入ったらサポートをしてみませんか?