20.データの受け取り

1.GETパラメータ

getパラメータは、URIに付加されるパラメータです。
requestオブジェクトのgetparameterメソッドで得ることができます。

paramsample1.jsp

<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>受け取った変数</title></head>
<body>
<h1>変数の表示</h1>
<table>
<tr><td>test</td><td>
<%=request.getParameter("test")%>
</td></tr>
<tr><td>TEST</td><td>
<%=request.getParameter("TEST")%>
</td></tr>
<tr><td>test1</td><td>
<%=request.getParameter("test1")%>
</td></tr>
</table>
<a href="paramsample1.jsp?test=15&TEST=32&test1=%7ehoge">テスト</a><br>

</body>
</html>
値が指定してないので最初はnullになっています。
fortejsp03/jspparam001.png
値を指定したリンクを押したので、値が表示されました。
大文字小文字も区別されています。
fortejsp03/jspparam002.png

2.URLエンコード

GETで値をわたすときには、URLに値を付加しました。
このとき、「&」などの特別な文字や、日本語を渡すときには、URLエンコーディングを行う必要があります。
java.net.URLEncoderクラスのencodeメソッドを使います。

paramsample5.jsp

<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>JSP Page</title></head>
<body>
<%@page import="java.net.*"%>
<%
String str;
str = "日本語";
String ustr1 = URLEncoder.encode(str,"Windows-31J");
str = "A&B=5";
String ustr2 = URLEncoder.encode(str,"Windows-31J");
%>
<a href="paramsample1.jsp?test=<%=ustr1%>&TEST=<%=ustr2%>&test1=%7ehoge">テスト</a><br>

</body>
</html>
fortejsp03/bean01.png

日本語や記号も渡せています。
fortejsp03/bean02.png

3.POSTパラメータ

POSTパラメータはHTMLフォームのmethodにpostを指定したときのパラメータです。

「新規」で「JSP&サーブレット」の「HTML」を作成します。

paramsample2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
  <HEAD>
    <TITLE>フォーム</TITLE>
  </HEAD>
  <BODY>
<h1>入力フォーム</h1>
<form method="post" action="paramsample1.jsp">
<table>
<tr><td>test</td><td>
<input type="text" name="test">
</td></tr>
<tr><td>test1</td><td>
<textarea rows=3 cols=30 name="test1"></textarea>
</td></tr>
</table>
<input type="submit" value="送信">
</form>

  </BODY>
</HTML>
フォームに入力して送信ボタンを押します。
fortejsp03/jspparam013.png
表示されています。
JSPでは、GETパラメータとPOSTパラメータを特に区別せずに扱えます。
fortejsp03/jspparam003.png

4.日本語変換

日本語を入力するとどうなるでしょうか?
fortejsp03/jspparam004.png
文字化けしています。
fortejsp03/jspparam005.png
文字コードの変換をする必要があります。
次のようにsetCharacterEncodingメソッドを使うことで、入力文字コードの指定ができます。

paramsample1.jsp

<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>受け取った変数</title></head>
<body>

<% request.setCharacterEncoding("Windows-31J"); %>

<h1>変数の表示</h1> <table> <tr><td>test</td><td> <%=request.getParameter("test")%> </td></tr> <tr><td>TEST</td><td> <%=request.getParameter("TEST")%> </td></tr> <tr><td>test1</td><td> <%=request.getParameter("test1")%> </td></tr> </table> <a href="paramsample1.jsp?test=15&TEST=32&test1=%7ehoge">テスト</a><br> </body> </html>

日本語を入力してみます。
fortejsp03/jspparam011.png
今度はちゃんと表示されます。
fortejsp03/jspparam012.png

5.HTMLフォーム

5.1.sample

<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>HTMLのテスト</title></head>
<body>
<h1>フォーム</h1>
<table border=1>
<tr><td valign="top">
<form method="post" action="formsample.jsp">
テキスト:<input type="text" name="a"><br>
テキストエリア:<br>
<textarea name="b">
</textarea><br>
選択:
<select name="c">
<option value="青山">あ</option>
<option value="伊藤">い</option>
<option value="内田">う</option>
</select><br>
サブミット1:<input type="submit" name="d" value="最初"><br>
サブミット2:<input type="submit" name="d" value="その次"><br>
hidden:<input type="hidden" name="e" value="ひみつ"><br>
</form>
</td><td valign="top">
a:<%=request.getParameter("a")%><br>
b:<%=request.getParameter("b")%><br>
c:<%=request.getParameter("c")%><br>
d:<%=request.getParameter("d")%><br>
e:<%=request.getParameter("e")%><br>
<br>
</td></tr></table>
</body>
</html>
ブラウザで開くとこのように表示されます。
fortejsp03/form01.png

5.2.タグ

・form
HTMLフォームを使うときはformタグを使います。
属性としてはmethod属性とaction属性を指定します。
method属性には「get」と「post」を指定します。通常は「post」にします。「get」にすると、入力値がURLに埋め込まれる形でサーバーに渡されます。
うまくページが切り替わらないときは、「from(フロム)」になってないか、「action」をスペルミスしていないか確かめてください。

・text
一行入力です。

・textarea
複数行入力です

・select
項目からの指定です。

・submit
送信ボタンです

・hidden
表示されない値です。

5.3.入力値の受け取り

適当に入力を行って、ボタンを押すと、このようになります。
fortejsp03/form02.png
fortejsp03/form03.png

フォームからの入力値の受け取りも、requestへのgetParameterメソッドの呼び出しで行います。
ここで、半角アルファベットはうまく処理できていますが、日本語は文字化けしています。
エンコーディングの指定をする必要があります。
<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>HTMLのテスト</title></head>
<body>

<% request.setCharacterEncoding("Windows-31J"); %>

<h1>フォーム</h1>
fortejsp03/form04.png
fortejsp03/form05.png

5.4.初期値

<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>HTMLのテスト</title></head>
<body>
<%
request.setCharacterEncoding("Windows-31J");

String parama = request.getParameter("a");parama = (parama == null) ? "" : parama; String paramb = request.getParameter("b");paramb = (paramb == null) ? "" : paramb; String paramc = request.getParameter("c");paramc = (paramc == null) ? "" : paramc;

%> <h1>フォーム</h1> <table border=1> <tr><td valign="top"> <form method="post" action="formsample.jsp"> テキスト:<input type="text" name="a" value="<%=parama%>"><br> テキストエリア:<br> <textarea name="b">

<%=paramb%>

</textarea><br> 選択: <select name="c"> <option value="青山" <%="青山".equals(paramc) ? "selected" : ""%>>あ</option> <option value="伊藤" <%="伊藤".equals(paramc) ? "selected" : ""%>>い</option> <option value="内田" <%="内田".equals(paramc) ? "selected" : ""%>>う</option> </select><br> サブミット1:<input type="submit" name="d" value="最初"><br> サブミット2:<input type="submit" name="d" value="その次"><br> hidden:<input type="hidden" name="e" value="ひみつ"><br> </form> </td><td valign="top"> a:<%=request.getParameter("a")%><br> b:<%=request.getParameter("b")%><br> c:<%=request.getParameter("c")%><br> d:<%=request.getParameter("d")%><br> e:<%=request.getParameter("e")%><br> <br> </td></tr></table> </body> </html>

6.クッキー

クッキーはブラウザに保存される値です。

paramsample3get.jsp

<%@page contentType="text/html"%>
<html>
<head><title>クッキーを表示</title></head>
<body>

<h1>クッキーを表示</h1>
<table>
<tr><th>名前</th><th>値</th></tr>
<%
Cookie[] c = request.getCookies();
for (int i = 0; i < c.length; ++i){
out.println("<tr><td>");
out.println(c[i].getName());
out.println("</td><td>");
out.println(c[i].getValue());
out.println("</td></tr>");
}
%>
</body>
</html>
とりあえず、設定されているクッキーを表示します。
fortejsp03/jspparam008.png

paramsample3set.jsp

<%@page contentType="text/html"%>
<html>
<head><title>クッキーの設定</title></head>
<body>

<%
Cookie c = new Cookie("test","value");
response.addCookie(c);
%>
<h1>クッキーの設定</h1>
クッキーを設定しました。

</body>
</html>
クッキーを設定します。
fortejsp03/jspparam009.png
設定されています。
fortejsp03/jspparam010.png
違うブラウザで表示すると、設定されていないはずです。

7.環境変数

CGIで環境変数として受け取るものを、表示してみます。

paramsample4.jsp

<%@ page contentType="text/html; charset=Windows-31J" %>
<html>
<head><title>環境変数表示</title></head>
<body>

<h1>環境変数</h1> <table> <tr><td>ServletPath</td><td> <%=request.getServletPath()%> </td></tr> <tr><td>RealPath</td><td> <%=getServletContext().getRealPath(request.getServletPath())%> </td></tr> <tr><td>RemoteAddr</td><td> <%=request.getRemoteAddr()%> </td></tr> <tr><td>RequestURI</td><td> <%=request.getRequestURI()%> </td></tr> <tr><td>Referer</td><td> <%=request.getHeader("Referer")%> </td></tr> <tr><td>User-Agent</td><td> <%=request.getHeader("User-Agent")%> </td></tr> </table> <a href="<%=request.getRequestURI()%>">再表示</a>

</body> </html>
fortejsp03/jspparam006.png
再表示としてリンクをたどったときにRefererが設定されています。
fortejsp03/jspparam007.png

8.HTML特殊文字のエスケープ

ユーザーの入力など、外部からの入力をHTMLに出力する際には、HTMLの特殊文字をエスケープする必要があります。
まずわかりやすい問題点として、画面レイアウトが崩れてしまいます。代表的なものは<plaintext>タグを使った場合などです。
fortejsp03/jspparam014.png

ただ、画面が崩れるだけであれば、気が付けば修正すればよいでしょう。
しかし、深刻な問題として、「JavaScriptが実行できてしまう」というものがあります。
たとえば、「<script>alert('aa')</script>」という文字列をテキストボックスに入力してみてください。
fortejsp03/jspparam016.png
「次へ」などのボタンを押すと、JavaScriptが実行されて、メッセージボックスが表示されてしまいます。
fortejsp03/jspparam015.png
ここに悪意をもったスクリプトを埋め込むことや、そのようなスクリプトを持ったページを開くスクリプトを書かれてしまえば、ユーザーや別のサイトへの攻撃になってしまいます。
そこで、次のように特殊文字をエスケープする必要があります。
また、改行の出力は<br>タグに変換する必要があります。
<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>HTMLのテスト</title></head>
<body>

<%@page import="java.text.*"%> <%! /** HTMLの特殊文字をエスケープする */ String escapeXml(String str){ if(str == null) return null; StringBuffer sb = new StringBuffer(); StringCharacterIterator sci = new StringCharacterIterator(str); for(char c = sci.current(); c != StringCharacterIterator.DONE; c = sci.next()){ switch(c){ case '&': sb.append("&"); break; case '"': sb.append("""); break; case '<': sb.append("<"); break; case '>': sb.append(">"); break; default: sb.append(c); } } return sb.toString(); } /** 改行を<br>に変換する */ String newLineToBr(String str){ if(str == null) return null; StringBuffer sb = new StringBuffer(); StringCharacterIterator sci = new StringCharacterIterator(str); for(char c = sci.current(); c != StringCharacterIterator.DONE; c = sci.next()){ if(c == '\n'){ sb.append("<br>"); } else{ sb.append(c); } } return sb.toString(); } %>

<% request.setCharacterEncoding("Windows-31J"); String parama = request.getParameter("a");parama = (parama == null) ? "" : parama; String paramb = request.getParameter("b");paramb = (paramb == null) ? "" : paramb; String paramc = request.getParameter("c");paramc = (paramc == null) ? "" : paramc; %> <h1>フォーム</h1> <table border=1> <tr><td valign="top"> <form method="post" action="formsample.jsp"> テキスト:<input type="text" name="a" value="<%=escapeXml(parama)%>"><br> テキストエリア:<br> <textarea name="b"> <%=escapeXml(paramb)%></textarea><br> 選択: <select name="c"> <option value="青山" <%="青山".equals(paramc) ? "selected" : ""%>>あ</option> <option value="伊藤" <%="伊藤".equals(paramc) ? "selected" : ""%>>い</option> <option value="内田" <%="内田".equals(paramc) ? "selected" : ""%>>う</option> </select><br> サブミット1:<input type="submit" name="d" value="最初"><br> サブミット2:<input type="submit" name="d" value="その次"><br> hidden:<input type="hidden" name="e" value="ひみつ"><br> </form> </td><td valign="top">

a:<%=escapeXml(parama)%><br> b:<%=newLineToBr(escapeXml(paramb))%><br> c:<%=escapeXml(paramc)%><br> d:<%=escapeXml(request.getParameter("d"))%><br> e:<%=escapeXml(request.getParameter("e"))%><br>

<br> </td></tr></table> </body> </html>

これで、JavaScriptは実行されなくなりました。
fortejsp03/jspparam017.png

java.text.StringCharacterIterator
文字列を1文字ずつ処理する
コンストラクタ StringCharacterIterator(String str) 指定した文字列を扱うオブジェクトを生成する
  char current() 現在の文字を得る
  char next() 次の文字を得る

Copyright (c) 2001-2003 Naoki Kishida All Rights Reserved.
http://www.fk.urban.ne.jp/home/kishida/