JSPについて

JSPとはJava Server Pagesの略で、PHPのようにHTMLの記述の中にJavaのスクリプト(JavaScriptではありません)を埋め込むことができます。直感的に作成できるのですが、本来は
  • Servletで処理した結果をJSPを利用して表示する
ことを目的としています。技術的には,Servlet単体で処理結果をブラウザに返すことはできます.しかし,JSPは静的なHTML部分をそのままの形で記述でき,動的な記述部分を区別できる利点があります.ServletとJSPを連携させれば,効果的なシステム開発が行えます.

ServletとJSPを連携させるメリット(その1)
Servletのみを利用した場合,HTMLをプログラムへ埋め込む作業が必要であるため,もし見た目の部分の変更が必要になった場合,そのServletクラスをコンパイルする必要が出てきます.JSPを利用すれば、
  • HTMLデザイナー=タグを扱える人
  • プログラマー=Java言語を扱える人
というようにHTMLデザイナーとプログラマーという役割に対応して,ファイルをわけることができます.この際,JSPの部分にはタグしか記述しないようにします.これにより,プログラムの変更に対して,JSPは左右されなくなります.また,デザイナーが記述したHTMLをそのまま流用できるわけです.

ServletとJSPを連携させるメリット(その2)
Webベースのシステムは,基本的に
  1. ユーザからのリクエストを得る
  2. データを加工する
  3. ページとして出力する
の3階層になっています.Servlet/JSPの特徴を考慮すれば,
  • 1,2の部分をServlet
  • 3の部分をJSP
で行うことができます.2の部分については,可能であればJavaBeans化をしておくほうがよいでしょう.

ServletからJSPへ移動するには

ServletにおいてJSPへ転送するためには,次の2つの方法があります
1.Dispatcherクラスを用いる場合

・・・・執筆中・・・・

2. sendRedirectを用いる場合

//ページへ転送する
String url="URL";
response.sendRedirect(url) ;


データの受け渡しをするには?
ServletとJSPを連携させるようになると,データをどのように保持するかが問題となってきます.一般には,リクエスト変数で管理します.

Servlet側(送り側)
request.setAttribute("呼び出し変数名",オブジェクト)

JSP側(受け取り側)
<jsp:useBean id ="呼び出し変数名" class="クラス名" scope ="request"/>

受け取る時の変数名は,呼び出し変数名と共通でなければいけません.


beanを利用してデータの受け渡す

保持するデータがたくさんになった時,変数が増えてしまうと,プログラムをする上で混乱が起きてきます.そこで,セッション変数を利用する時は,データは必ずbean化して,クラス単位で共有することが,効率的なプログラムへの第一歩になります.beanとは

  • フィールド変数はすべて private. 先頭文字は小文字で宣言したほうが良い(Netbeansではそういう現象がおきました)
  • set/getメソッドで フィールド変数を操作
  • Serializableインタフェースを実装
  • 引数なしコンストラスタの作成

という条件を持ったJavaクラスです。


配列/リスト型のBeansを渡すには
ServletとJSPでデータを受け渡す際,配列型のデータを利用する場合にはちょっとした工夫が必要となります. setAttributeで受け渡すオブジェクトが配列である場合,userBeanタグを利用した場合にJSP側で配列として受け取れないという問題がある.スクリプトレット領域において,session.getAttribute("")をJSP内で呼び出せば配列として取り出すことは可能であるが,スクリプトの記述はプログラム的に美しくない.また,配列型のデータを取り出すのもちょっと面倒です.
そこで,次のアプローチをとることにする.

  • Iteratorインタフェースでラップして送る
  • Standard Tag Libraryを利用して取り出しを容易にする
以下に説明する.

Iteratorインタフェースを利用したラッピング

以下は,送りたいデータクラスである.nameというフィールドを持っている.

public class sample implements java.io.Serializable{

/** Creates a new instance of sample */
public sample() {
}
private String name;

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

たとえば,このクラスを利用して,Aさん,Bさん..という複数のデータを送りたいとする.これを配列すればいいわけだが,そうすると上記の問題がおきるわけだ(JSP側でSessionから配列として受け取れない).そこで,Aさん,Bさん...のような連続したデータをどのようにして送るのか?...というわけで,ListArrayクラスでラップして,session変数に渡せばよい.

以下は,その例である.

HttpSession ss = request.getSession(true);
sample[] man = new sample[2];
man[0]= new sample();
man[0].setName("AAA");
man[1]= new sample();
man[1].setName("BBB");
java.util.ArrayList manArray = new java.util.ArrayList();
manArray.add(man[0]);
manArray.add(man[1]);
ss.setAttribute("ma", manArray);

Standard Tag Libraryを利用して取り出す
sessionに保存したクラスは,useBeanタグを利用することでJSP側で利用できる.問題は,ArrayListの要素の取り出し方だが、JSTLと呼ばれる標準のタグライブラリには,foreachタグというのが存在する.このタグはArrayListなどのクラスを与えるとその要素を取り出してくれる.

JSPの一部抜粋.
<%@page contentType="text/html"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean class= "java.util.ArrayList" id="ma" scope="session" />
<html>
<head><title>JSP Page</title></head>
<body>
<c:forEach var="element" items="${ma}">
<c:out value="${element.name}"/>abc<BR>
</c:forEach>
</body>

こうすることで,JSPはすべてタグベースで記述できる.
Comments