ゆとりずむ

東京で働く意識低い系ITコンサル(見習)。金融、時事、節約、会計等々のネタを呟きます。

JSPとTwitter APIのお勉強 - JSP間のデータ連携の方法について

とりあえずのところ、プラグラミング言語っぽくなってきたので、次は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にアクセスされる。作成したファイルは、

  • sample.jspで、URLの?以下に変数名と値を指定
  • 2.jspで、自分の?以下の部分から、変数名と値を取り出して処理


といったことを行う内容になる。
問題は、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>
  1. session.setAttribute("連携用文字列", 変数名)
  2. session.getAttribute("連携用文字列")

1で、同一セッション内で共有する変数を宣言し、2でそれを取り出す。なお、<% 〜 %>は内部の命令を単純に実行し、<%= %>は、結果をHTML上に出力する。
いずれかのリンクをクリックすれば、index.jspにアクセスした時間が表示される。この時間は、2.jspをいくら更新しても変わらないが、index.jspを再表示すれば更新される。セッションとは、あくまでブラウザ毎の単位のため、別のウィンドウ/タブであっても、基本的に同じものとして認識される。ただ、cokkieはブラウザ単位で保存しているため、別のブラウザを利用すると別のものとして認識される。

ひとまずこれで、最低限WEB上に何かしらを作る準備は出来たと思う。