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ベースのシステムは,基本的に
ユーザからのリクエストを得る
データを加工する
ページとして出力する
の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はすべてタグベースで記述できる.