- PR -

JSP内でのBeanの扱いについて

1
投稿者投稿内容
tony-x
会議室デビュー日: 2004/03/18
投稿数: 3
投稿日時: 2004-11-04 11:09
こんにちは。tony-xと申します。
JSP内でのBeanの扱いについて質問します。
下記のコードと出力結果を示します。

--------------------- コード ---------------------
<%@ page contentType="text/html; charset=Shift_JIS" import="bean.*" %>
<jsp:useBean id="dataBean" scope="session" class="bean.DataBean" />
<jsp:useBean id="dataListBean" scope="session" class="bean.DataListBean" />

<html>
<body>

<%-- 1.DataBeanを設定 --%>
<% dataBean = dataListBean.getDataBean(); %>

<%-- 2.プロパティを設定 --%>
<% dataBean.setTitle("setTitle"); %>
<jsp:setProperty name="dataBean" property="title" value="jsp:setProperty" />

<%-- 3.プロパティを取得 --%>
「jsp:getProperty」による出力⇒
<jsp:getProperty name="dataBean" property="title" />
<br>
「dataBean.getTitle()」による出力⇒
<%= dataBean.getTitle() %>

</body>
</html>
--------------------------------------------------

--------------------- 出力 -----------------------
「jsp:getProperty」による出力⇒jsp:setProperty
「dataBean.getTitle()」による出力⇒setTitle
--------------------------------------------------

<jsp:getProperty>による出力と
<%= %>による出力で結果が異なりました。
双方ともdataBeanという変数名を使用しているのですが、
なぜこのような現象が起こるのでしょうか?
(<jsp:xxxProperty>と<%= %>で別のインスタンスを指している?)

ちなみに
<%-- 1.DataBeanを設定 --%>
<% dataBean = dataListBean.getDataBean(); %>
の部分を削除すると、下記のような結果になります。
--------------------- 出力 -----------------------
「jsp:getProperty」による出力⇒jsp:setProperty
「dataBean.getTitle()」による出力⇒jsp:setProperty
--------------------------------------------------

以上、よろしくお願いします。
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2004-11-04 11:44
>(<jsp:xxxProperty>と<%= %>で別のインスタンスを指している?)
そうなのだと思います。
JSPコンテナが生成するJAVAソースコードを見るのが早いのでは?
動作としては<jsp:xxxProperty>でアクセスするオブジェクトは
<jsp:useBean id="dataBean" scope="session" class="bean.DataBean" /> で
生成されたオブジェクトで、
<%= %>でアクセスするオブジェクトは
<% dataBean = dataListBean.getDataBean(); %> で
dataListBean.getDataBean()が返すオブジェクトのようですね。

これが、JSP仕様なのか、コンテナの実装依存なのかはわかりませんが・・・
ご存じの方がいらっしゃいましたがフォローお願いします。
tony-x
会議室デビュー日: 2004/03/18
投稿数: 3
投稿日時: 2004-11-04 17:19
>T2さん
回答ありがとうございます。

>JSPコンテナが生成するJAVAソースコードを見るのが早いのでは?
生成されたソースを見ると、

<jsp:useBean id="dataBean" scope="session" class="bean.DataBean" />
で変数dataBeanが生成されたDataBeanオブジェクトを参照し、

<% dataBean.setTitle("setTitle"); %> 等の<%,<%=内の処理は、
JSP内と同様に変数dataBeanで処理を行い、

<jsp:setProperty name="dataBean" property="title" value="jsp:setProperty" />等の<jsp:xxxProperty>では
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("dataBean"), "title", "jsp:setProperty", null, null, false);
といった感じで、直接変数を指定しないで処理していました。

おそらく、直接変数を指定しない方では、変数dataBeanとは違うインスタンスを参照しているのでしょうね。
少々すっきりしませんが、そのようなものであると認識することにします。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)