目次へ戻る 下へ↓
30、JSPの利用
作成者:Fumitaka Makino 更新日:2003-05-16 16:32

・JSPとは?

JSPとは、Microsoft社のアプリケーションサーバー(IIS)で用いるASP(ActiveServerPages)に対抗して作られた言語・環境です。当初はJavaServerPagesの頭文字を取ったものだといわれていましたがサンマイクロシステムズによると「JSP」という商標だそうです。JSPはHTMLとプログラムが混在した言語・環境です。まず下記のJSPによるHelloWorldを見て下さい。

例:JSPによるHelloWorld(HelloWorld.jsp)

     
 

<%@ page contentType="text/html; charset=SJIS"%>

<html>
<head>
<title>HelloJSP!!</title>
</head>
<body>

<h1>HelloWorld,JSP!</h1>

</body>
</html>

 
     

このJSPをコンテキストルートの直下(例:studyディレクトリの直下など)に配置してください。そしてTomcat4を起動している状態で

http://localhost:8080/study/HelloWorld.jsp

をブラウザで開いてみてください。少し時間がかかりますがHelloWorldが表示されたと思います。ちなみに、このJSPが行っていることをサーブレットで記述すると下記のようなコードになります。

例:サーブレットによるHelloWorld

     
 

import java.io.*;


import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException
  {
    response.setContentType("text/html");//配信する情報のコンテンツタイプを指定
    PrintWriter out = response.getWriter();//レスポンスに対するWriterを取得
    
    //HTMLを書き出し
    out.println("<html>");
    out.println("<body>");
    out.println("<head>");
    out.println("<title>HelloJSP!!</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>HelloWorld,JSP!</h1>");
    out.println("</body>");
    out.println("</html>");
  }
}

 
     

いかがでしょうか?サーブレットと見比べてみると、JSPは非常に簡便な方法でHTMLの出力が行えることがわかると思います。では、さらにfor文を利用したJSPを見てみましょう。

例:JSPによるHelloWorld2(HeeloWorld2.jsp)

     
 

<%@ page contentType="text/html; charset=SJIS"%>

<html>
<head>
<title>HelloJSP!!</title>
</head>
<body>

<% for( int i=0;i<10;i++ ){ %>
  <h1>HelloWorld,JSP!</h1>
<% } %>

</body>
</html>

 
     

同じくコンテキストルートの直下に配置してブラウザで開いてみてください。「HelloWorld,JSP!」が10行表示されていると思います。さらに何行目かを表示してみましょう。

例:JSPによるHelloWorld3(HeeloWorld3.jsp)

     
 

<%@ page contentType="text/html; charset=SJIS"%>

<html>
<head>
<title>HelloJSP!!</title>
</head>
<body>

<% for( int i=0;i<10;i++ ){ %>
  <h1><%=i%>:HelloWorld,JSP!</h1>
<% } %>

</body>
</html>

 
     

同じくコンテキストルートの直下に配置してブラウザで開いてみてください。すると「HelloWorld,JSP!」が10行表示され、さらに行数が0から記述されていると思います。つまりJSPでは <%〜%> の部分はJavaのコードと同様に扱われ、それ以外の部分はprintlnする部分として扱われます。サーブレットコンテナにおいてファイルがJSPとして扱われる条件としては「拡張子が.jspとなっている」ことだけです。ではJSPファイルにおいて特別な意味を持つタグを下表に示します。

例:JSPのタグ

タグの形態 説明
<%@ 〜 %> ディレクティブと呼び、主に静的な宣言として利用する。その種類にはページのコンテンツタイプやJSPで利用するパッケージのインポートを宣言するページディレクティブ、外部ファイルに分断されたJSPを取り込むインクルードディレクティブなどが存在する。
<%@ page contentType="text/html; charset=SJIS" import="java.util.*"%>
<%@ include file="/test.jsp"%>
<%! 〜 %> メンバーの宣言、記述に利用する。フィールドやメソッドを定義するコードはこのタグの内部に記述する。
<%! String str = null; %>
<%! String getName(){ return "SampleName"; } %>
<%= 〜 %>

〜で定義された文字列をタグの配置部分に挿入する。
<%= "牧野" %>

<% 〜 %>

〜に記述されたJavaコードを実行する。
<% for( int i=0;i<10;i++ ){ %>
  test!<BR>
<% } %>

<jsp:〜 /> JSP組み込みタグライブラリ、幾つかの便利な機能をカスタム化したタグ
<jsp:useBean id="test" class="jp.co.wownet.education.servlet.Goods" scope="request"/>

通常の<%〜%>タグに関しては問題ないと思います。注意して欲しいのは<jsp:〜 />の部分です。これはタグライブラリと呼ばれよく利用する機能をタグとして用意して、それをタグセットとして提供しています。またjspタグライブラリは標準で組み込まれており、Beansの呼び出しや操作に関して便利な機能を提供してくれます。またJSPでは暗黙の了解としてrequest(ServletRequest)、response(ServletResponse)、session(HttpSession)、application(ServletContext)、config(ServletConfig)という変数が括弧内のオブジェクトの型として宣言無しに利用できます。

ではJSPはどのようなプロセスでコンテナに配置されるのでしょうか?実はJSPは2段階のコンパイルを経てサーブレットコンテナへと配置されます。

JSP -(JSP翻訳エンジン)→ ソースコード -(コンパイラ)→ クラス

JSPの呼び出し時、JSPのインスタンスが存在しないかJSPファイルに変更があったとします。するとまずJSP翻訳エンジン(TomcatならJasperエンジン)が対象のJSPファイルをjavaコードへと翻訳します。そして翻訳されたJSPのソースコードをjavacなどによって動的にコンパイルし、そのインスタンスをコンテナへ配置しリクエストとレスポンスが引き渡されます。JSPはHTML自体にjavaコードを記述でき便利な反面でコードが煩雑になったり、JSP翻訳エンジンの実装形態が違うという注意すべき点もあります。

 

・JSPとサーブレットの連動、MVCアーキテクチャ

JSPが登場してしばらくはJSPのみでWEBアプリケーションを記述するというのが流行りました。しかしJSPのみでWEBアプリケーションを実現するにはコードが煩雑になるなどの限界があり、現在ではサーブレットと連動するという使い方が一般的になっています。例えばサーブレットでリクエストを分析し、転送先やロジックをコントロールし、HTMLなどの表示部分はJSPにやらせてしまうという手法です。このときサーブレットをController、ロジック 部分をModel、表示層であるJSPをViewと表現し、この手法をMVCアーキテクチャと呼びます。

 

このMVCアーキテクチャにおいてJSPは完全に表示、もしくは表示ロジックのみを実装することが望ましいです。またサーブレットとJSPでの連動はリダイレクト、もしくは下記のようにリクエストディスパッチャーによる転送を行って実現します。

getServletContext().getRequestDispatcher("/test.jsp").forward(request,response)

このときJSPに対してオブジェクトを渡すにはサーブレットの節で学習した各スコープ(ServletContext,HttpSession,ServletRequest)にセットして置きます。そしてJSP側でjspタグリブのuseBeanタグを利用したり、直接リクエストを利用するなどで取得できます。それでは下記サンプルを参考に、今までの掲示板やショッピングカートをJSPとサーブレットを利用したものにしてみましょう。

サンプル用のソースファイル(JavaDoc)

test.jsp 転送先JSP
ForwardTest03.java 転送元サーブレット

 
 
 
↑上へ 目次へ戻る