とりあえずのところ、プラグラミング言語っぽくなってきたので、次は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上に何かしらを作る準備は出来たと思う。