とりあえずのところ、プラグラミング言語っぽくなってきたので、次はJSP間でデータを連携する方法について復習。やりたいことは、『あるページで入力されたデータを、次のページでも利用する』みたいな感じ。
リンクによる連携
もっとも基本的な方法。
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<span style="font-size:<% out.print((int)(Math.random()*50)); %>pt">文字サイズ変更テスト </span><br>
<a href ="2.jsp?var1=hoge&var2=foo">リンク</a><br>
<a href ="2.jsp?var1=ほげ&var2=ふー">リンク2</a>
</body>
</html>2.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>2</title>
</head>
<body>
var1=<%=request.getParameter("var1")%><br>
var2=<%=request.getParameter("var2")%><br>
</body>
</html>まずは、こんな感じで2ファイル作成する。この状態で、上のリンクをクリックすると、http://localhost:8080/SampleJSP/2.jsp?var1=hoge&var2=fooというURLにアクセスされる。作成したファイルは、
といったことを行う内容になる。
問題は、2つ目のリンクである。こちら側は全角文字を使っているため、文字化けする可能性がある。これは、Glassfish上で利用する文字コードが適切に指定されていない場合生じる可能性がある。
もし、文字化けが発生した場合は、作成したプロジェクトをビルドし、ProjectHome/build/web/WEB-INF/glassfish-web.xmlに
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class' java code.</description>
</property>
</jsp-config>
<parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>なお、ファイル名は環境によって違う可能性があるが、同じ位置にあるxmlで似たような内容であれば、同じように書き換えれば多分大丈夫。
フォームによる連携
次は、フォームから取得した値を連携する方法について確認する。が、特に何も難しいことはない。以下のようにindex.jspのみを修正する。
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<span style="font-size:<% out.print((int)(Math.random()*50)); %>pt">文字サイズ変更テスト </span><br>
<a href ="2.jsp?var1=hoge&var2=foo">リンク</a><br>
<a href ="2.jsp?var1=ほげ&var2=ふー">リンク2</a>
<form action="2.jsp" method="post">
<input type="text" name="var1">
<input type="text" name="var2">
<input type="submit" name="command" value="リンク3">
</form>
</body>
</html>なお、methodを"get"にすれば、先ほどのURL渡しと同じ方法で連携をとることが出来る。
セッションによる連携
最後に、最も重要なセッションによる連携のメモ。今までの方法だと、文字列でしか連携が取れない。しかし、せっかくjavaだし、クラスを連携したい場合もある。jspでは、『同じ一連の操作かどうか(同じ端末の同じブラウザから、同じ人が操作しているのかどうか)』を、初回のデータ送信時にブラウザ側に送信したcookieで識別することが出来る。JSP(に限らないが)では、同じ一連の操作のことをセッションという。それぞれ以下のとおり書き換える。
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
<span style="font-size:<% out.print((int)(Math.random()*50)); %>pt">文字サイズ変更テスト </span><br>
<a href ="2.jsp?var1=hoge&var2=foo">リンク</a><br>
<a href ="2.jsp?var1=ほげ&var2=ふー">リンク2</a>
<form action="2.jsp" method="post">
<input type="text" name="var1">
<input type="text" name="var2">
<input type="submit" name="command" value="リンク3">
</form>
<%
Date date = new Date();
session.setAttribute("varDate", date);
%>
</body>
</html>2.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>2</title>
</head>
<body>
var1=<%=request.getParameter("var1")%><br>
var2=<%=request.getParameter("var2")%><br>
var3=<%=session.getAttribute("varDate")%>
</body>
</html>
- session.setAttribute("連携用文字列", 変数名)
- session.getAttribute("連携用文字列")
1で、同一セッション内で共有する変数を宣言し、2でそれを取り出す。なお、<% 〜 %>は内部の命令を単純に実行し、<%= %>は、結果をHTML上に出力する。
いずれかのリンクをクリックすれば、index.jspにアクセスした時間が表示される。この時間は、2.jspをいくら更新しても変わらないが、index.jspを再表示すれば更新される。セッションとは、あくまでブラウザ毎の単位のため、別のウィンドウ/タブであっても、基本的に同じものとして認識される。ただ、cokkieはブラウザ単位で保存しているため、別のブラウザを利用すると別のものとして認識される。
ひとまずこれで、最低限WEB上に何かしらを作る準備は出来たと思う。