スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

jsp:setアクションとcoreライブラリのsetタグの違い

よく間違えやすいので検証。

beanオブジェクト


package org.scjwc.bean;

public class HogeBean {

private String name;
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}



jsp:setアクション


<!-- Beanオブジェクトの作成 -->
<jsp:useBean id="bean" class="org.scjwc.bean.HogeBean"></jsp:useBean>

<!-- JSP:setProperty -->
<jsp:setProperty name="bean" property="name" value="HogeHoge"/>

<!-- JSP:getProperty -->
<jsp:getProperty name="bean" property="name"/>


name属性にBean名を指定
property属性にBeanの属性名を指定
(このときsetterのsetを除くことを忘れないこと)

実行結果は

HogeHoge



ここまでは理解しているので問題ないが
coreライブラリのsetタグについて

coreライブラリのsetタグ


<!-- coreタグライブラリ -->
<c:set target="${bean}" property="name" value="TESTTEST"<>/c:set>>
<c:out value="${bean.name}"/>



target属性でBeanを指定するけど、間違えやすい点として
setタグは、EL式で${bean}とBeanを指定しないと例外が発生する。

property属性はjsp:setと同じ。

実行結果は

TESTTEST



ここでギモン。

Beanオブジェクトの作成でjsp:useBeanを使ってるけど、ディフォルトではページスコープになってるが
これをページ以外のセッションとかに指定したら
coreライブラリのsetタグの動作はどうなるか?
setタグのscope属性を省略するとディフォルトでページとなってるし。

検証1:


<!-- Beanオブジェクトの作成 -->
<jsp:useBean id="bean" class="org.scjwc.bean.HogeBean" scope="session"></jsp:useBean>

<!-- coreタグライブラリ -->
<c:set target="${bean}" property="name" value="TESTTEST"<>/c:set>>
<c:out value="${bean.name}"/>



実行結果は

TESTTEST



setタグのscope属性を省略しているの以下の順で検索。
page → request → session → application
つーことでセッションでBeanを見つけれたので問題なし。

検証2:


<!-- Beanオブジェクトの作成 -->
<jsp:useBean id="bean" class="org.scjwc.bean.HogeBean" scope="session"></jsp:useBean>

<!-- coreタグライブラリ -->
<c:set target="${bean}" property="name" value="TESTTEST" scope="session"<>/c:set>>
<c:out value="${bean.name}"/>



実行結果は


org.apache.jasper.JasperException:
"c:set" タグで var が存在しないのに scope 属性を指定することは正しくありません



setタグではscope属性を指定するときは、var属性が必須となる

これはbeanではなくスコープオブジェクトに値を入れる目的の為だと解釈できる・・・かな?

ちなみにvar属性とtarget属性を同時に指定してみると・・・


<!-- Beanオブジェクトの作成 -->
<jsp:useBean id="bean" class="org.scjwc.bean.HogeBean" scope="session"></jsp:useBean>

<!-- JSP:setProperty -->
<jsp:setProperty name="bean" property="name" value="HogeHoge"/>

<!-- coreタグライブラリ -->
<c:set target="${bean}" property="name" var="test" value="TESTTEST" scope="session"<>/c:set>>
<c:out value="${bean.name}"/>



実行結果は


HogeHoge



あれ?
値が変わってない??

sessionスコープを見たら
キーが"test"で値が"TESTTEST"がセットされてました。
つーか同時に指定してもエラーにならないのね・・・・

つーことで、setタグはスコープオブジェクトへの値セットが優先ってことが分かった


うん、ようやく理解しました。
スポンサーサイト

コメントの投稿

非公開コメント

Re: jsp:setアクションとcoreライブラリのsetタグの違い

さすが我等の希望の星だね。俺なら、こんなブログにできんし、自作ビデオだけ流すね。
なんなら、JAVAの初心者講習とかやってよ。

コメントあんがと

ほとんどが自分用メモだから
なんせ自分大好きなんで(笑

Javaの初心者講習やるのも復習になるからいいかもねー

承認待ちコメント

このコメントは管理者の承認待ちです
プロフィール

DJコーク

Author:DJコーク
地方で細々とSEまがいの仕事をしています。

楽天ブック
最近の記事
Feed
月別アーカイブ
スポンサードリンク
グラビス|gravis ノーマディック|nomadic ヴィブラム|vibram ロープロ|lowepro
MoMA STORE
MoMAstore
MoMAstore
MoMAstore
MoMAstore
MoMAstore
リンク
カテゴリ
サイト
ランキング
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。