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になっています。

値を指定したリンクを押したので、値が表示されました。
大文字小文字も区別されています。
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>
日本語や記号も渡せています。
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>
フォームに入力して送信ボタンを押します。

表示されています。
JSPでは、GETパラメータとPOSTパラメータを特に区別せずに扱えます。
日本語を入力するとどうなるでしょうか?

文字化けしています。

文字コードの変換をする必要があります。
次のように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>
日本語を入力してみます。

今度はちゃんと表示されます。
<%@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>
ブラウザで開くとこのように表示されます。
適当に入力を行って、ボタンを押すと、このようになります。
フォームからの入力値の受け取りも、requestへのgetParameterメソッドの呼び出しで行います。
ここで、半角アルファベットはうまく処理できていますが、日本語は文字化けしています。
エンコーディングの指定をする必要があります。
<%@page contentType="text/html; charset=Windows-31J"%>
<html>
<head><title>HTMLのテスト</title></head>
<body>
<%
request.setCharacterEncoding("Windows-31J");
%>
<h1>フォーム</h1>
<%@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>
クッキーはブラウザに保存される値です。
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>
とりあえず、設定されているクッキーを表示します。
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>
クッキーを設定します。

設定されています。

違うブラウザで表示すると、設定されていないはずです。
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>

再表示としてリンクをたどったときにRefererが設定されています。
ユーザーの入力など、外部からの入力をHTMLに出力する際には、HTMLの特殊文字をエスケープする必要があります。
まずわかりやすい問題点として、画面レイアウトが崩れてしまいます。代表的なものは
<plaintext>タグを使った場合などです。
ただ、画面が崩れるだけであれば、気が付けば修正すればよいでしょう。
しかし、深刻な問題として、「JavaScriptが実行できてしまう」というものがあります。
たとえば、「
<script>alert('aa')</script>」という文字列をテキストボックスに入力してみてください。

「次へ」などのボタンを押すと、JavaScriptが実行されて、メッセージボックスが表示されてしまいます。

ここに悪意をもったスクリプトを埋め込むことや、そのようなスクリプトを持ったページを開くスクリプトを書かれてしまえば、ユーザーや別のサイトへの攻撃になってしまいます。
そこで、次のように特殊文字をエスケープする必要があります。
また、改行の出力は
<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は実行されなくなりました。
|
java.text.StringCharacterIterator
|
|
文字列を1文字ずつ処理する
|
コンストラクタ
StringCharacterIterator(String str) |
指定した文字列を扱うオブジェクトを生成する |
|
char current() |
現在の文字を得る |
|
char next() |
次の文字を得る |