■JSP構文の基礎を知っておこう

JSPの基本として、ユーザーに文字列を出力したい場合には次のように、出力したい値を「<%="と"%>」で囲った表記を用いる。

<%= 値 %>

すると文字列(String型)に変換された上で、クライアント(Webブラウザ)に返される。リスト2では、次に挙げるよう3行目にあるように、getParameter("productname")を出力していることから、ユーザーがリスト1で入力した商品名がクライアントに返されることになる。

3: 入力された商品名は、
<%= request.getParameter("productname") %>


JSPから文字列を出力するには、他の方法もある。それは、outオブジェクト(javax.Servlet.jsp.JspWriterクラス)のprintメソッドや、printlnメソッドを使うことだ。printメソッドは、引数に指定した値をそのままクライアントに出力し、printlnメソッドは、最後に改行を付けて出力する。次の通りだ。

out.print(値);
または
out.println(値);


そして、JSPにおいて任意のJavaコードを記述する場合には、コード全体を「」で囲む必要がある。

<%
 …Javaコード…
%>


これにより、リスト2で挙げた3行目の指定は、outオブジェクトのprintlnメソッドを使い次のように表記することもできる。

<%
out.println("入力された商品名は、" +
request.getParameter("productname"));
%>


上記の文では、文の最後にセミコロンがあることに注意しよう。「<%= %>」の表記では、Javaにおける構文ではなく、値を示す式しか書けない。このため、最後にセミコロンは付かないのだ。それに対し、「<% %>」内に任意のJavaコードを記述する方法では、複数行を記述することもできるため、各行の最後にはセミコロンが必要となる。

コラム:GETメソッドとPOSTメソッド
入力フォームを使って、入力されたデータをWebサーバーに送信するときには、GETメソッドを使う方法とPOSTメソッドを使う方法の2通りがある。この指定は、<FORM>タグ内のmethodアトリビュートで指定する。

<FORM method="GET または POST" action="呼び出すプログラム名">

■GETとPOSTメソッドの使い分けを理解しておこう

JSPからは、GETメソッドとPOSTメソッドのどちらで送信された場合にも、requestオブジェクトのgetParameterメソッドを使い、入力フィールドに入力された値を取得できる。

GETメソッドの場合には、入力フォームに入力されたデータがURLの後ろに付与されてサーバに送信される。この際、URLの後ろに付与される形式は、「?フィールド名=値&フィールド名=値…」という形式になる。たとえば、productnameというフィールドに「abc」という文字を入力しサーバに送信した際には、次のようなURLがサーバに要求される。

http://サーバー名/プログラム名?productname=abc

このようなURLの後ろに付けられた文字列のことを「クエリー文字列」という。

クエリー文字列は、URLの書式として容認される形式にエンコードされる。このエンコードを「URLエンコード」と呼ぶ。URLエンコードでは、URLに表記する文字として認められていない文字(非英数字)は、「%xx」(xxは文字の16進数表記)に変換される。URLエンコードでは、空白文字は文字コードが16進数で0x20なため、「%20」とも記述できる。しかし、「+」に変換されることが多いのも事実だ。「+」はURLエンコードで空白を示す特別な文字列である。

それに対し、POSTメソッドの場合にはWebサーバへの要求の末尾に入力フィールドのデータが付与され、ユーザーからは参照できない形で送信される。

GETメソッドを使って送信する場合、送信できるデータの量は、URLの長さにより制限される。URLの最大長は、規格で明確に定められているわけではなく、利用しているWebブラウザやWebサーバに依存する。しかし一般には、1Kバイト程度が限界である。それに対して、POSTメソッドでは、送信するデータ量の制限はない。

またGETメソッドとPOSTメソッドでは、<FORM>タグのactionアトリビュートで指定されているプログラムが出力した結果をWebブラウザがキャッシュするかどうかという点も異なる。

GETメソッドの場合にはキャッシュされるが、POSTメソッドの場合にはキャッシュしない。そのため、GETメソッドの場合には、Webブラウザの「戻る」や「進む」のボタンを押してページを行き来できるが、POSTメソッドの場合には、「戻る」や「進む」ボタンを押して、プログラムを呼び出した際の結果を再参照することはできない。

さらに、GETメソッドの場合には、入力フォームに入力されたデータがURLに現れるため、そのページをWebブラウザのブックマーク(お気に入り)に登録することもできるという違いもある。GETメソッドを使うかPOSTメソッドを使うかは、状況により次の指針で判断するとよいだろう。

■GETメソッドを使う場合

・少量のデータ送信であること。数百〜1Kバイト以下でなければ、WebブラウザやWebサーバによっては、URLの最大長の制限の問題から、末尾が切り取られてしまい、正しく送信できないことがある。

・Webブラウザにプログラムを呼び出した際の結果をキャッシュさせたい場合

・プログラムを呼び出した際の結果をブックマーク(お気に入り)として登録許可させたい時

■POSTメソッドを使う場合

・大量のデータを送信する場合。

・Webブラウザにプログラムを呼び出したときの結果をキャッシュさせたくない場合。

・プログラムを呼び出したときの結果をブックマーク(お気に入り)として登録することを許したくない場合。

 この記事内では、おもにPOSTメソッドを使うが、たとえば、何か検索をして、その結果を表示させたい場合ではGETメソッドを利用する方が好ましいこともある。その理由は、検索結果によってヒット件数が多い場合、複数ページに分けて表示するユーザーインターフェイスを採用することが多いためだ。この際、POSTメソッドを使ってしまうと、Webブラウザの「戻る」や「進む」などのボタンを使い、ユーザーが検索結果ページを次々とたどることができなくなる。

次回の第2回目では、リスト2の状態では不備のある、日本語対応のための具体的な手法を解説していこう。