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はすべてタグベースで記述できる.