JSP リファレンス

<jsp:useBean>
xmlns:jsp="http://java.sun.com/JSP/Page"
JSP 1.0 以降

SYNOPSIS

<jsp:useBean
id*="変数名"
scope="page|request|session|application"
class†1="クラス完全限定名"
beanName†1="Bean名|クラス完全限定名"
type†1="クラス完全限定名"
>
新規に Bean が生成されたときに実行される内容.
</jsp:useBean>

説 明

id 属性で指定した変数をスクリプトレット内で使用できるようにします。 この時、変数に対する Bean が存在しない場合は新たに生成してスコープに 設定します (これは EL から参照できます)。 新規にインスタンスが構築された場合、このタグの中に記述された処理が 実行されます。

classbeanNametype 属性の組み合わせは 4 通り 存在し、それぞれ微妙に違いますので注意してください。

class 属性を単体で指定した場合、スコープ内に id に 対応する Bean が存在しなければこのクラス名に基づいたインスタンスが 新たに生成されます。

class
<jsp:useBean id="foo" class="MyBean" />
  ↓
MyBean foo = (MyBean)pageContext.findAttribute("foo");
if(foo == null){
    foo = (MyBean)Class.forName("MyBean").newInstance();
    pageContext.setAttribute("foo", PageContext.SCOPE_PAGE);
}

class 属性に type 属性を併用した場合は、ローカル変数の 型を限定することができます。

class+type
<jsp:useBean id="foo" type="MyBean" class="MyBeanImpl" />
  ↓
MyBean foo = (MyBean)pageContext.findAttribute("foo");
if(foo == null){
    foo = (MyBean)Class.forName("MyBeanImpl").newInstance();
    pageContext.setAttribute("foo", PageContext.SCOPE_PAGE);
}

beanName 属性を指定した時は Beans.instantiate() メソッドを用いてインスタンスが生成されます。この時 type 属性は必須です。

beanName
<jsp:useBean id="foo" type="MyBean" beanName="myBean" />
  ↓
MyBean foo = (MyBean)pageContext.findAttribute("foo");
if(foo == null){
    foo = (MyBean)Beans.instantiate(classLoader, "myBean");
    pageContext.setAttribute("foo", PageContext.SCOPE_PAGE);
}

type 属性のみを指定した場合はスコープ内に Bean が存在 しなければ例外となります。

type
<jsp:useBean id="foo" type="MyBean" />
  ↓
MyBean foo = (MyBean)pageContext.findAttribute("foo");
if(foo == null){
    throw new JspException(message);
}

属 性

id="変数名"
required
Bean の変数名。 各スコープに対しての属性名として使用されるほか、スクリプトレット 内で利用できるローカル変数名としても使用されます。 このため値は Java の変数として使用できるものでなければいけません。
scope="page|request|session|application"
optional

新しく作成した Bean を格納するスコープ。

page スコープはこのページ内の処理でのみ有効な最も狭い スコープを持ちます。 <jsp:forward>, <jsp:include> などによる 呼び出しの連鎖で、別の JSP で同一 id の Bean が定義されて いたとしても、Bean のインスタンスはそれぞれの JSP で保持されるので 互いに影響を及ぼしません。 また複数のリクエストが同一の JSP を同時に実行していても Bean の インスタンスはそれぞれの処理で個々に生成されるため影響はありません。

request, session, application スコープはそれぞれ ServletRequest, HttpSession, ServletContext 属性のスコープと等価です。

class="クラス完全限定名"
selective required 1

実際にインスタンス化するクラス名です。 指定されたスコープ内に id に該当する Bean が存在しない場合、 このクラスのインスタンスが新規に生成されます。このクラスはデフォルト コンストラクタによって生成可能でなければいけません。

type 属性と合わせる事で、スクリプトレット内でこの Bean に アクセスするインターフェースを選択できます。

beanName="Bean名|クラス完全限定名"
selective required 1

インスタンス化する Bean の名前です。スコープ内に id に該当する Bean が存在しない場合、 Beans.instantiateJava™ API リファレンス() を用いて新しいインスタンスが生成されます。

beanName 属性を指定した場合は type 属性が必須です。 また class 属性と併用することはできません。

type="クラス完全限定名"
selective required 1
スクリプトレットから Bean にアクセスするときのインターフェース またはクラス名。 JSP 内でのローカル変数の宣言に使用される型です。 スコープ内に id に該当する Bean が存在せず、class 属性も beanName 属性も指定されていない場合は例外となります。

内 容

新規に Bean が生成されたときに実行される内容。 例えば構築時に特定のプロパティを設定したいような場合にタグ内部に記述します。 <jsp:setProperty> のような JSP タグのほかにスクリプト レットや通常の HTML タグを記述することも出来ます。

使用例

ページ表示ごとに時分秒フィールドをクリアした現在時刻を表示します。
JSP
<jsp:useBean id="date" class="java.util.Date">
  <jsp:setProperty name="date" property="hours"   value="0" />
  <jsp:setProperty name="date" property="minutes" value="0" />
  <jsp:setProperty name="date" property="seconds" value="0" />
</jsp:useBean>
<%= DateFormat.getDateTimeInstance().format(date) %>
リクエストパラメータを元にユーザ認証処理を行います。成功したらセッションスコープにユーザ情報の Bean を格納します。失敗したらメッセージ付きでログイン画面に移動します。
JSP
<jsp:useBean id="auth" class="biz.moyo.lab.auth.LoginBean">
  <jsp:setProperty name="auth" property="username" param="user" />
  <jsp:setProperty name="auth" property="password" param="pass" />
  <% if(! auth.execute()){ %>
    <jsp:forward page="login.jsp">
      <jsp:param name="message" value="<%= auth.getMessage() %>" />
    </jsp:forward>
  <% } %>
  <jsp:useBean id="user" class="biz.moyo.lab.auth.UserBean" scope="session">
    <jsp:setProperty name="user" property="username" param="user" />
  </jsp:useBean>
</jsp:useBean>
<jsp:getProperty name="auth" property="message" />
セッションに格納されているユーザ情報からユーザ名を表示します。 既にセッションが存在しユーザ情報が格納されているという前提の JSP です。 該当する id にユーザ情報が格納されていない場合は例外となります。
JSP
<jsp:useBean id="user" type="biz.moyo.lab.auth.UserBean" scope="session" />
USERNAME: <jsp:getProperty name="user" property="username" />
アプリケーションが起動していない場合には 503 Service Unavailable を返します。 app のインスタンスはコンテナ起動時にサーブレットやリスナにより設定済みという前提の JSP です。 該当する id にアプリケーションが格納されていない場合は例外となります。
JSP
<jsp:useBean id="app" type="biz.moyo.lab.foo.MyApplication" scope="application" />
<% if(! app.available()){
  response.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
  return;
} %>
前画面での入力値を全て Bean に設定し、値が正しくなければ前の画面を再表示します。 リクエストスコープに設定した form インスタンスは forward 先の JSP からも参照できますので、呼び出し先の prev-page.jsp 側で今回の入力値をそのままデフォルト値として使う事が出来ます。
JSP
<jsp:useBean id="form" class="biz.moyo.lab.page.Form" scope="request" />
<jsp:setProperty name="form" property="*" />
<% if(form.check()){ %>
  <jsp:forward page="prev-page.jsp" />
<% } %>
prev-page.jsp
<jsp:useBean id="form" class="biz.moyo.lab.page.Form" scope="request" />
MESSAGE: <jsp:getProperty name="form" property="message" /><br>
USERNAME: <input type="text" name="username"
    value="<jsp:getProperty name="form" property="username" />"><br>
PASSWORD: <input type="password" name="password"><br>
CVS 2008/03/09