1. 程式人生 > >JSP 中標簽小故事【轉】=====》scope【作用域】

JSP 中標簽小故事【轉】=====》scope【作用域】

目的 taglib set 變量的作用域 java 報告 -- 是個 字符串

前兩天接到老大一個任務:要驗證一下<c:import>能否動態地引入不同的文件。當時很興奮,要知道在對日外包裏面,這個也得算技術活了。呵呵!

說幹就幹,寫了兩個jsp文件:m.jsp test1.jsp。目的是用變量"a"代替test1中的“1”。代碼如下:

m.jsp

----------------------------------

<@import prefix="c" uri="http://java.sun.com/jstl.core">

<c:set var="a" value="1"/>

<c:import url="test${a}.jsp"/>

----------------------------------

test1.jsp

---------------------------------

<@import prefix="c" uri="http://java.sun.com/jstl.core">

<BR>TEST1<BR><c:out value="${a}"/>

---------------------------------

試驗之前老大說估計不行,而結果卻是

TEST

1

那是不是可以說JSTL(Jsp Standard Taglib Language)是可以解析EL(Express Language)的呢?。我再看了看tomcat裏面work目錄下編譯java文件(m_jsp.java文件),其實是沒編譯EL的,即還是把他作為字符串參數傳遞,而在執行的時候動態的解析。

說到現在還沒說到<c:import> 的scope屬性,別急哈。先談談引入這個問題的原因:試驗結果出乎老大的意料,他在那JJYY了一陣,我在一旁偷著樂:哈哈,沒搞對吧!沒想到他馬上又說:如果給"a"設不同的值,能引入不同的文件嗎? “恩.........,我也不知道”我應到。於是他在我機子上寫了下面的代碼:

m.jsp

----------------------------------

<@import prefix="c" uri="http://java.sun.com/jstl.core">

<c:set var="a" value="1"/>

<c:import url="test${a}.jsp"/>

<c:set var="a" value="2" scope="request"/>

<c:import url="test${a}.jsp"/>

----------------------------------

test1.jsp

---------------------------------

<@import prefix="c" uri="http://java.sun.com/jstl.core">

<BR>TEST1<BR><c:out value="${a}"/>

---------------------------------

test2.jsp

---------------------------------

<@import prefix="c" uri="http://java.sun.com/jstl.core">

<BR>TEST2<BR><c:out value="${a}"/>

---------------------------------

結果如下:

TEST1

1

TEST1

1

老大火了,為什麽不行呢?這次test2.jsp怎麽沒引入進來??“不搞了,看來不行”老大拂袖而去,丟了這麽一句。
“我來搞搞”我心理想著,看著他寫的代碼,伊?怎麽m.jsp中第二次設值要加一個“scope”屬性呢?我試著把第次設a的值也加上“scope="request"”,跑了跑。結果:

TEST1

1

TEST2

2

我很激動,馬上報告老大。老大過來看了看,他也覺得奇怪啊,然後他把兩行代碼的scope都去掉,結果和都加上scope是一樣的。我和老大現在都想不通了,於是老大去找了他的老大(呵呵,某部的部長)!

 果然是老大的老大啊,看了不到一分鐘。馬上就解釋了原因:默認下scope屬性值是"page", <c:set var="a" value="1"/>  <c:set var="a" value="2" scope="request"/>是申明了兩個的不同作用域的變量,我們可以稱為page.a ,request.a。<c:import url="test${a}.jsp"/>引入時,肯定是先在當前頁面找a的值了,找不到的話再去找request作用域的a,如果找到了,當然就不用去更大的作用域找了。

 聽到這,老大汗.....;我更汗.........。看來自己現只能是個小兵水平哈。

總結:

  1.scope的作用域大小依次為:application>session>request>page(默認)

  2.jsp處理變量的作用域先後依次為:page(默認)->request->session->application

JSP 中標簽小故事【轉】=====》scope【作用域】