JSP(Java Server Pages)入門

by 城風敏彦 2002/04/01


目次

JSP

JSPはJava Server Pagesの略であり,PerlやCで作られるCGIやVBScriptで作られるASP(Active Server Pages)と機能的には似た動作をするものである。  HTMLのフォームに入力したパラメータを解析して,DB検索などのロジックを実行して,結果を表示することが典型的な動きである。
JSPファイルはサーバーサイドでサーブレットソースに翻訳され,翻訳結果のサーブレットソースが更にJavaクラスにコンパイルされて実行にかけられる。主にサーブレットの表示機能の代替として使われることが多く,本格的なコントロールはサーブレット,ロジックはビーンなどのJavaクラスで記述する。

Tomcatのインストール

JSPはJavaのアプリケーションサーバー(Weblogic, WebSphere, iPlanet,,)ならばどれでも実行できる。 しかし、資料の多さからしてJakarta ProjectのTomcatが練習用に最も良い。
TomcatはJDK1.2以上が必要であり、http://java.sun.com/j2se/ からダウンロードできる。Javaの月刊誌の付録CDにはたいていJDKとTomcatが入っているので、一冊買うのも 良い。 あまりに最新のJDKではTomcatが動かないことがあるので、最新の一つ前 (2002年時点ではJDK1.3)をお勧めする。
 JDKがインストールできたら、環境変数 JAVA_HOMEを C:\JDK1.3.1_01 などに設定しておく。 Tomcatは、 http://jakarta.apache.org/site/binindex.htmlからダウンロードできる。 Tomcat4.1以上だと管理コンソールがあって、本格的アプリケーションサーバになっているので、 4.1以上を推奨する。
C:\Tomcat4.1
にインストールし、環境変数 CATALINA_HOMEを C:\Tomcat4.1 などに設定しておく。
まず,

<%= new java.util.Date() %>
とだけ書いたファイルを, C:\Tomcat4.1\webapps\ROOT\now.jsp という名前で保存してみよう。 java.util.Dateのインスタンス(現在時刻)を生成して,表示するコードである。
http://マシン名:8080/now.jsp 
をIEで指定すればjspの実行結果を見ることができる。

Tue Apr 02 17:27:33 JST 2002

などと出てくる。ブラウザをリロードすると時刻が変わっているのが わかる。 この例ではjavaの評価を行うエクスプレッションのみであったが,JSPの基本はHTMLであり,動的に表示したい部分のみをJavaで記述して
<%= .. %>
で表示する。

H Tagサンプル

<% for( int i=1; i<7; i++) { %>
    <H<%=i%>> <%=i%>: Hello, World!! </H<%=i%>><p>
<%}%>
3行を
C:\Tomcat4.1\webapps\ROOT\htag.jsp という名前で保存してみよう。


http://マシン名:8080/htag.jsp 
を実行すると, <H1> 1: Hello, World!! </H1><p> <H2> 2: Hello, World!! </H2><p> <H3> 3: Hello, World!! </H3><p> <H4> 4: Hello, World!! </H4><p> が出力される。 <H<%=i%>> の整数iが1から5まで順に,文字の1から5に置き換わっている。 このように文字列への変換はJSPが自動的に行う(実際はtoString()メソッドが起動される) ので,特にフォーマットを指定して出したい場合を除き, 文字列への変換をJSP作成者が行う必要はない。

フォーマット付時刻表示

以下は date.jsp のソースである。
<%-- SimpleDateFormatで現在日付を表示する --%>
<%-- Linuxの漢字コードはEUCなので,charset=Shift_JIS を指定する --%>
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%-- java.text.SimpleDateFormatとjava.util.Date利用を宣言する --%>
<%@ page import = "java.text.SimpleDateFormat" %>
<%@ page import = "java.util.Date" %>
<HTML>
<HEAD>
<TITLE>Date</TITLE>
<%-- mystyle.cssという名前のカスケーディングスタイルシートを用いる --%>
<LINK REL=STYLESHEET TYPE="text/css" HREF="mystyle.css">
</HEAD>
<BODY>
<H1>Date</H1>
<TABLE>
<%-- <% .. %> がJavaスクリプトレット(Javaコード) --%>

<%-- SimpleDateFormatを指定 --%>
SimpleDateFormat formatter
     = new SimpleDateFormat ("yyyy年MM月dd日 (EE) hh:mm:ss zzz");

// ループを2回回す
 for(int i=0; i<2; i++) {
 java.util.Date()で現在時刻を取得
   Date currentTime_1 = new Date();
// dateStringに現在時刻をフォーマット処理した文字列をセット
   String dateString = formatter.format(currentTime_1);
%>
<TR>
<TH>Date</TH>
<%-- <%= .. %> はエクスプレッションで,挟まれた部分を文字化して表示する  --%>
<TD><%= dateString %></TH>
</TR>
<%
//  1秒待つ
   Thread.sleep(1000);
 }
%>
</TABLE>
</BODY>
</HTML>
http://マシン名:8080/date.jsp 

JavaBeanとの連携

以下の4つのクラスからなるログインのみのアプリケーションを示す。
index.jsp 画面コントロールJSP
login.jsp ログイン画面JSP
menu.jp   ログイン後メニューJSP
WEB-INF/classes/UserInfo.class ユーザ情報JavaBean
ログイン入力フォームJSP login.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="userBean" scope="session" class="login.UserBean" />
<jsp:setProperty name="userBean" property="*" />

<HTML>
<HEAD>
 <META http-equiv=Content-Type content="text/html; charset=Shift_JIS">
 <TITLE>Logging In</TITLE>
</HEAD>
<BODY>
<H1>Login</H1>

<FORM method=post>
<B>ユーザー名とパスワードを入力してください</B>
<TABLE>
  <TR>
    <TD vAlign=top align=right><B>ログイン名</B></TD>
    <TD vAlign=top><INPUT NAME="userName"> </TD></TR>
  <TR>
    <TD vAlign=top align=right><B>パスワード</B></TD>
    <TD vAlign=top><INPUT NAME="passWord"></TD></TR>
  <TR>
    <TD></TD>
    <TD>
      <INPUT type=submit value=Login name=btnSubmit>
      <INPUT type=reset value=Reset name=btnReset>
    </TD>
  </TR>
</TABLE>
</FORM>

</BODY>
</HTML>
メニュー画面JSP menu.jsp
<jsp:useBean id="userBean" scope="session" class="login.UserBean" />
<jsp:setProperty name="userBean" property="*" />
<HTML>
<HEAD>
  <TITLE>MENU</TITLE>
</HEAD>

<BODY>
 <h2><%= userBean.getUserName() %>'s Menu</h2>

</BODY>
</HTML>
コントロールJSP index.jsp
<jsp:useBean id="userBean" scope="session" class="login.UserBean" />
<jsp:setProperty name="userBean" property="*" />

<%
  if (!userBean.login()) {
%>
  <jsp:forward page="login.jsp" />
<%
  } else {
%>
  <jsp:forward page="menu.jsp" />
<%
  }
%>
ユーザ情報Bean UserBean.java
package login;

public class UserBean {
  /** ユーザ名 */
  private String userName=null;
  /** パスワード */
  private String passWord=null;

  public UserBean() {
  }

  public String getUserName() {
    return userName;
  }
  public void setUserName(String newUserName) {
    userName = newUserName;
  }
  public void setPassWord(String newPassWord) {
    passWord = newPassWord;
  }
  public String getPassWord() {
    return passWord;
  }

/**
 * ユーザー情報を確認し、ログインする
 */
  public boolean login() {
      // ユーザー名が指定されていない場合は、ログイン処理を行わない
      if (userName == null || userName.equals(""))
        return false;  // ログイン処理は失敗
      if (passWord == null || passWord.equals(""))
        return false;  // ログイン処理は失敗

      // ログイン処理を行う
    return (userName.equals(passWord));
  }
}
C:\Tomcat4.1\webapps\jspLogin を作成し、
jspは全て、
C:\Tomcat4.1\webapps\jspLogin
に、JavaBeanクラスは、
C:\Tomcat4.1\webapps\jspLogin\WEB-INF\classes\login
に置いて、Tomcatを再起動し、
http://61.122.77.34:8080/jspLogin/index.jsp
で確認できる。
webapps直下のディレクトリがコンテキストパス(ここでは/jspLogin)になることに注意して欲しい。

JSP文法

コメント
   形式   <%-- ... --%>

   <%-- Author John Lennon. Date 2002/04/12. --%>
   
Declaration(宣言)
   形式 <%! ... %>

   <%! int i = 0; %>
   <%! int a, b, c; %>
   <%! Circle a = new Circle(2.0); %>
   
Expression(式を評価して表示。";"がないことに注意)
   形式 <%= ... %>

   The map file has <font color="blue"><%= map.size() %></font> entries.
   Good guess, but nope. Try <b><%= numguess.getHint() %></b>.
   
Scriptlet(Javaコード)
   形式 <% ... %>

   <% int sum =0;
      for(int i=0; i<10; i++) { 
        sum += i;
      }
    %>
   
Page Directive
   形式
   <%@ page
     [ language="java" ]
     [ extends="package .class" ]
     [ import="{package .class | package.*}, ..." ]
     [ session="true|false" ]
     [ buffer="none|8kb|sizekb" ]
     [ autoFlush="true|false" ]
     [ isThreadSafe="true|false" ]
     [ info="text" ]
     [ errorPage="relativeURL" ]
     [ contentType="mimeType [ ;charset=characterSet ]" |
       "text/html ; charset=ISO-8859-1" ]
     [ isErrorPage="true|false" ]
   %>

   <%@ page import="java.util.*, java.lang.*" %>
   <%@ page buffer="5kb" autoFlush="false" %>
   <%@ page errorPage="error.jsp" %>
   
Include Directive (他のJSPを読み込んでからコンパイルする)
形式 <%@ include file="relativeURL" %>
   
jsp:forward(クライアントのリクエストを、HTML、JSP、servletに送る)
形式 <jsp:forward page="{relativeURL | <%= expression %>}" />
          or
   <jsp:forward page="{relativeURL | <%= expression %>}" >
   <jsp:param name="parameterName"
      value="{parameterValue | <%= expression %>}" />
   </jsp:forward>
   
jsp:include(他のJSPの実行結果を読み込む)
形式   <jsp:include page="{relativeURL | <%= expression %>}" flush="true" />
     or
   <jsp:include page="{relativeURL | <%= expression %>}" flush="true" >
   <jsp:param name="parameterName"
     value="{parameterValue | <%= expression %>}" />+
   </jsp:include>
   
jsp:plugin(appletまたはビーンを実行する)
形式   <jsp:plugin
      type="bean|applet"
      code="classFileName"
      codebase="classFileDirectoryName"
    [ name="instanceName" ]
    [ archive="URIToArchive, ..." ]
    [ align="bottom|top|middle|left|right" ]
    [ height="displayPixels" ]
    [ width="displayPixels" ]
    [ hspace="leftRightPixels" ]
    [ vspace="topBottomPixels" ]
    [ jreversion="JREVersionNumber | 1.1" ]
    [ nspluginurl="URLToPlugin" ]
    [ iepluginurl="URLToPlugin" ] >
    [ <jsp:params>
    [ <jsp:param name="parameterName"
          value="{parameterValue | <%= expression %>}" /> ]+
      </jsp:params> ]
    [ <jsp:fallback> text message for user </jsp:fallback> ]
   </jsp:plugin>
   
jsp:useBean(ビーンのインスタンスを作成,または検索する)
形式  <jsp:useBean
      id="beanInstanceName"
      scope="page|request|session|application"
    { class="package.class" |
      type="package.class"  |
      class="package.class" type="package.class" |
      beanName="{package.class | <%= expression %>}" type="package.class"
    }
    { /> |
       > other elements
       </jsp:useBean>
    }
   
jsp:getProperty(ビーンのgetXXXメソッドを呼び出す)
形式   <jsp:getProperty name="beanInstanceName" property="propertyName" />

   <jsp:useBean id="calendar" scope="page" class="employee.Calendar" />
   <h2>
     Calendar of <jsp:getProperty name="calendar" property="username" />
   </h2>

   は,<% calendar.getUsername() %> と同じ。
   
jsp:setProperty(ビーンのsetXXXメソッドを呼び出す)
特に prpperty="*" で,requestの全パラメータをビーンにセットは便利。
形式  <jsp:setProperty
       name="beanInstanceName"
     { property="*" |
       property="propertyName" [ param="parameterName" ] |
       property="propertyName" value="{string | <%= expression %>}"
     }
   />


   <jsp:setProperty name="mybean" property="*" />
   <jsp:setProperty name="mybean" property="username" />
   <jsp:setProperty name="mybean" property="username" value="Steve" />

   最下段は,<% calendar.setUsername("Steve") %> と同じ。
  
予約語
JSP では、スクリプトレットや式内の暗黙的オブジェクトのための予約語が用意されている。
この暗黙的オブジェクトとは、JSP ページに有用なメソッドや情報を提供する Java 
オブジェクトである。これらの暗黙的オブジェクトは、 スクリプトレットや 式の内部で
のみ宣言なしに使用できる。

request

request は、javax.servlet.HttpServletRequest オブジェクトである。
ブラウザからの要求についての情報が含まれ、クッキー、ヘッダ、およびセッション
 データを取得するために便利なメソッドも用意されている。

<%
  String firstName = request.getParameter("fName");
  String lastName = request.getParameter("lName");
  out.println("Welcome " + firstName + " " + lastName);
%>

response

response は、javax.servlet.HttpServletResponse オブジェクトである。
JSP ページからブラウザに返送される応答の設定に便利な複数のメソッドを持つ。
この応答の例として、クッキーとその他のヘッダ情報がある。 
response.getWriter() メソッドを JSP ページ内で使用することはできない。
outを利用する。 

out

out は、javax.jsp.JspWriter のインスタンスで、ブラウザへの出力の返送に使える
メソッドを持っている。 

出力ストリームを必要とするメソッドを使用している場合、JspWriter は動作しない。
この制限を回避するには、バッファ化ストリームを提供して、このストリームを out
 に記述する。

pageContext

pageContext は、javax.servlet.jsp.PageContext オブジェクトである。
さまざまなスコープのネームスペースやサーブレット関連オブジェクトにアクセスする
ために便利な API で、一般的なサーブレット関連機能のためのラッパー メソッドを
提供する。

session

session は、要求に対する javax.servlet.http.HttpSession オブジェクト。
セッション ディレクティブは、デフォルトでは true に設定されている。
したがって、session はデフォルトで有効である。
JSP 1.1 仕様では、セッション ディレクティブが false に設定されている場合、
session キーワードを使用すると変換時に致命的なエラーが発生することが説明されている。
下の例では,sessionにStringのfirstNameを登録し,取り出している。

<%
  session.setAttribute("fName", firstName);
  session.setAttribute("lName", lastName);
  String firstName = (String) session.getAttribute("fName");
  String lastName = (String) session.getAttribute("lName");
  out.println("Welcome " + firstName + " " + lastName);
%>

application

application は、javax.servlet.ServletContext オブジェクトを表す。
サーブレット エンジンやサーブレット環境に関する情報の検索に使用する。
リクエストを転送または取り込む場合は、ServletContext を使用してサーブレット
 requestDispatcher にアクセスできる。
または、他のサーブレットへのリクエストの転送に JSP forward ディレクティブ、
他のサーブレットからの出力の取り込みに JSP include ディレクティブを使用すること
もできる。

config

config は javax.servlet.ServletConfig オブジェクトを表し、サーブレット インスタンスの
初期化パラメータへのアクセスを提供する。

exception

java.lang.Throwableのインスタンス。
page ディレクティブの isErrorPageが "true"のJSP、つまりエラーページでのみ有効。
JSPで発生した例外にアクセスするためのオブジェクト。

文字化け対策

日本語漢字をフォーム入力した場合,8bitで送信されるので,エンコーディングされるが,JSPのサーバ側では8Bit文字コードのうちのどれだかわからずに,Latin-1として デコードすることがあり,"??????"というように文字化けが発生することがある。

この場合,Latin-1でバイト列にパックした後,想定している漢字コードに変換すると 正常にデコードできる。以下にEUCにデコードする場合の例を示す。 Shift_JISの部分を,shift_jisやiso-2022-jpに変更すれば大抵の場合正常に表示できる。

     String temp = request.getParameter("name");
     if(temp == null) temp="";
     String name = new String(temp.getBytes("ISO8859_1"),"Shift_JIS");

Tomcatサンプル解説


Tomcatサンプル

NumberGuess NumberGuessBean.java
package num;

import java.util.*;

public class NumberGuessBean {
  /** 正解値 */
  int answer;
  /** 正解が入力されたかのフラグ */
  boolean success;
  /** higher, lowerのヒント */
  String hint;
  /** 推測回数 */
  int numGuesses;

  /** コンストラクタ。乱数から正解値を生成 */
  public NumberGuessBean() {
    reset();
  }

  /** 以後はset,getのアクセッサメソッド */
  public void setGuess(String guess) {
    numGuesses++;

    int g;
    try {
      g = Integer.parseInt(guess);
    }
    catch (NumberFormatException e) {
      g = -1;
    }

    if (g == answer) {
      success = true;
    }
    else if (g == -1) {
      hint = "a number next time";
    }
    else if (g < answer) {
      hint = "higher";
    }
    else if (g > answer) {
      hint = "lower";
    }
  }

  public boolean getSuccess() {
    return success;
  }

  public String getHint() {
    return "" + hint;
  }

  public int getNumGuesses() {
    return numGuesses;
  }

  public void reset() {
    answer = Math.abs(new Random().nextInt() % 100) + 1;
    success = false;
    numGuesses = 0;
  }
}
numguess.jsp
<%@ page import = "num.NumberGuessBean" %>

<%-- NumberGuessBeanのインスタンスを numguessという名前で作成 -- %>
<jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/>
<%-- フォームから送られてくるパラメータを全て対応するsetterでnumguessにセット--%>
<jsp:setProperty name="numguess" property="*"/>

<html>
<head><title>Number Guess</title></head>
<body bgcolor="white">
<font size=4>

<%-- 正解した場合,Congratulationsを表示 --%>
<% if (numguess.getSuccess()) { %>

  Congratulations!  You got it.
<%-- numguess.getNumGuesses()  は実行されて,Stringに置き換わる --%>
  And after just <%= numguess.getNumGuesses() %> tries.<p>

  <% numguess.reset(); %>

  Care to <a href="numguess.jsp">try again</a>?
<%-- 初回,入力用フォームを表示 --%>
<% } else if (numguess.getNumGuesses() == 0) { %>

  Welcome to the Number Guess game.<p>

  I'm thinking of a number between 1 and 100.<p>

  <form method=get>
  What's your guess? <input type=text name=guess>
  <input type=submit value="Submit">
  </form>

<%-- 正解しなかった場合,再入力用フォームを表示 --%>
<% } else { %>

  Good guess, but nope.  Try <b><%= numguess.getHint() %></b>.

  You have made <%= numguess.getNumGuesses() %> guesses.<p>

  I'm thinking of a number between 1 and 100.<p>

  <form method=get>
  What's your guess? <input type=text name=guess>
  <input type=submit value="Submit">
  </form>

<% } %>

</font>
</body>
</html>

Date JspCalendar.java
package dates;

import java.text.DateFormat;
import java.util.*;

public class JspCalendar {
    Calendar  calendar = null;

    /** コンストラクタ。現在日付を取得 */
    public JspCalendar() {
    calendar = Calendar.getInstance();
    Date trialTime = new Date();
    calendar.setTime(trialTime);
    }

    public int getYear() {
    return calendar.get(Calendar.YEAR);
    }
    
    public String getMonth() {
    int m = getMonthInt();
    String[] months = new String [] { "January", "February", "March",
                    "April", "May", "June",
                    "July", "August", "September",
                    "October", "November", "December" };
    if (m > 12)
        return "Unknown to Man";
    
    return months[m - 1];

    }

    public String getDay() {
    int x = getDayOfWeek();
    String[] days = new String[] {"Sunday", "Monday", "Tuesday", "Wednesday", 
                      "Thursday", "Friday", "Saturday"};

    if (x > 7)
        return "Unknown to Man";

    return days[x - 1];

    }
    
    public int getMonthInt() {
    return 1 + calendar.get(Calendar.MONTH);
    }

    public String getDate() {
    return getMonthInt() + "/" + getDayOfMonth() + "/" +  getYear();

    }

    public String getTime() {
    return getHour() + ":" + getMinute() + ":" + getSecond();
    }

    public int getDayOfMonth() {
    return calendar.get(Calendar.DAY_OF_MONTH);
    }

    public int getDayOfYear() {
    return calendar.get(Calendar.DAY_OF_YEAR);
    }

    public int getWeekOfYear() {
    return calendar.get(Calendar.WEEK_OF_YEAR);
    }

    public int getWeekOfMonth() {
    return calendar.get(Calendar.WEEK_OF_MONTH);
    }

    public int getDayOfWeek() {
    return calendar.get(Calendar.DAY_OF_WEEK);
    }
     
    public int getHour() {
    return calendar.get(Calendar.HOUR_OF_DAY);
    }
    
    public int getMinute() {
    return calendar.get(Calendar.MINUTE);
    }


    public int getSecond() {
    return calendar.get(Calendar.SECOND);
    }

    public static void main(String args[]) {
    JspCalendar db = new JspCalendar();
    p("date: " + db.getDayOfMonth());
    p("year: " + db.getYear());
    p("month: " + db.getMonth());
    p("time: " + db.getTime());
    p("date: " + db.getDate());
    p("Day: " + db.getDay());
    p("DayOfYear: " + db.getDayOfYear());
    p("WeekOfYear: " + db.getWeekOfYear());
    p("era: " + db.getEra());
    p("ampm: " + db.getAMPM());
    p("DST: " + db.getDSTOffset());
    p("ZONE Offset: " + db.getZoneOffset());
    p("TIMEZONE: " + db.getUSTimeZone());
    }

    private static void p(String x) {
    System.out.println(x);
    }


    public int getEra() {
    return calendar.get(Calendar.ERA);
    }

    public String getUSTimeZone() {
    String[] zones = new String[] {"Hawaii", "Alaskan", "Pacific",
                       "Mountain", "Central", "Eastern"};
    
    return zones[10 + getZoneOffset()];
    }

    public int getZoneOffset() {
    return calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000);
    }


    public int getDSTOffset() {
    return calendar.get(Calendar.DST_OFFSET)/(60*60*1000);
    }

    
    public int getAMPM() {
    return calendar.get(Calendar.AM_PM);
    }
}
date.jsp
<body bgcolor="white">
<jsp:useBean id='clock' scope='page' class='dates.JspCalendar' type="dates.JspCalendar" />

<font size=4>
<ul>
<li>    Day of month: is  <jsp:getProperty name="clock" property="dayOfMonth"/>
<li>    Year: is  <jsp:getProperty name="clock" property="year"/>
<li>    Month: is  <jsp:getProperty name="clock" property="month"/>
<li>    Time: is  <jsp:getProperty name="clock" property="time"/>
<li>    Date: is  <jsp:getProperty name="clock" property="date"/>
<li>    Day: is  <jsp:getProperty name="clock" property="day"/>
<li>    Day Of Year: is  <jsp:getProperty name="clock" property="dayOfYear"/>
<li>    Week Of Year: is  <jsp:getProperty name="clock" property="weekOfYear"/>
<li>    era: is  <jsp:getProperty name="clock" property="era"/>
<li>    DST Offset: is  <jsp:getProperty name="clock" property="DSTOffset"/>
<li>    Zone Offset: is  <jsp:getProperty name="clock" property="zoneOffset"/>
</ul>
</font>

</body>
</html>
Snoop HttpServletRequest参照。
<body bgcolor="white">
<h1> Request Information </h1>
<font size="4">
JSP Request Method: <%= request.getMethod() %>
<br>
Request URI: <%= request.getRequestURI() %>
<br>
Request Protocol: <%= request.getProtocol() %>
<br>
Servlet path: <%= request.getServletPath() %>
<br>
Path info: <%= request.getPathInfo() %>
<br>
Path translated: <%= request.getPathTranslated() %>
<br>
Query string: <%= request.getQueryString() %>
<br>
Content length: <%= request.getContentLength() %>
<br>
Content type: <%= request.getContentType() %>
<br>
Server name: <%= request.getServerName() %>
<br>
Server port: <%= request.getServerPort() %>
<br>
Remote user: <%= request.getRemoteUser() %>
<br>
Remote address: <%= request.getRemoteAddr() %>
<br>
Remote host: <%= request.getRemoteHost() %>
<br>
Authorization scheme: <%= request.getAuthType() %> 
<hr>
The browser you are using is <%= request.getHeader("User-Agent") %>
<hr>
</font>
</body>
</html>
ErrorPage
<body bgcolor="lightblue">

    <%@ page errorPage="errorpge.jsp" %>
    <jsp:useBean id="foo" scope="request" class="error.Smart" />
    <% 
        String name = null;

                // nameパラメータがnullだとエラーページにforwardする
        if (request.getParameter("name") == null) {
    %>
    <%@ include file="/jsp/error/error.html" %>
    <%
        } else {
          foo.setName(request.getParameter("name"));
          if (foo.getName().equalsIgnoreCase("integra"))
              name = "acura";
          if (name.equalsIgnoreCase("acura")) {
    %>

    <H1> Yes!!! <a href="http://www.acura.com">Acura</a> is my favorite car.

    <% 
          }
        }    
    %>    
</body>
</html>
cart カートを表すVectorとパラメータ変数を持つ,典型的なJavaBeanである。 RMIなどでシリアライズされることはないので,java.io.Serializableをインプリメント していない。 DummyCart.java
package sessions;

import javax.servlet.http.*;
import java.util.Vector;
import java.util.Enumeration;

public class DummyCart {
    /** Cartの実体 */
    Vector v = new Vector();
    /** HTMLフォームのSUBMITパラメータ */
    String submit = null;
    /** 商品名 */
    String item = null;
    
    private void addItem(String name) {
    v.addElement(name);
    }

    private void removeItem(String name) {
    v.removeElement(name);
    }

    public void setItem(String name) {
    item = name;
    }
    
    public void setSubmit(String s) {
    submit = s;
    }

    public String[] getItems() {
    String[] s = new String[v.size()];
    v.copyInto(s);
    return s;
    }
    
    public void processRequest(HttpServletRequest request) {
    // null value for submit - user hit enter instead of clicking on 
    // submitがnullか"add"だとカートに追加 
    if (submit == null) 
        addItem(item);

    if (submit.equals("add"))
        addItem(item);
    // submitが"remove"だとカートから削除
    else if (submit.equals("remove")) 
        removeItem(item);
    
    // reset at the end of the request
    reset();
    }

    // reset
    private void reset() {
    submit = null;
    item = null;
    }
}
carts.jsp
<html>
<jsp:useBean id="cart" scope="session" class="sessions.DummyCart" />

<jsp:setProperty name="cart" property="*" />
<%
    cart.processRequest(request);
%>


<FONT size = 5 COLOR="#CC0000">
<br> You have the following items in your cart:
<ol>
<% 
    String[] items = cart.getItems();
    for (int i=0; i<items.length; i++) {
%>
<li> <%= items[i] %> 
<%
    }
%>
</ol>

</FONT>

<hr>
<%@ include file ="/jsp/sessions/carts.html" %>
</html>

参考URL)

姉妹編)
Java入門 | Java和暦クラス | JDBC入門 |