EL表達式詳解

       在JSP頁面中,我們常常看到頁面會使用EL表達式,它的形式是${ 表達式}。一直以來,對於EL表達式和OGNL表達式都很模糊,EL表達式只有一種符號$,但是OGNL表達式卻有${表達式}、%{表達式}、#表達式這三種方式。今天終於把他們搞清楚了,於是分享一下自己的心得。

       先說EL表達式

        EL表達式第一個命名變量爲一個隱式對象或者某個作用域(頁面作用域、請求作用域、會話作用域、應用作用域)的一個屬性。用在HTML和JSP標籤中,代替JSP頁面中複雜的JAVA代碼。

       1、與範圍有關的隱含對象:pageScope、requestScope、sessionScope、applicationScope,只能取得範圍屬性值,即getAttribute(String name)。

       2、與輸入有關的隱含對象:param和paramValues。

             當需要取得用戶的請求參數時,可以使用如下方法:

              request.getParameter(String name)

              request.getParameterValues(String name)

                            在EL中,

                   ${param.name}   表示返回請求參數中單個字符串的值
                          ${paramValues.name} 表示返回請求參數的一組值

        3、在JSP頁面中的對象,包括用戶創建的對象(JavaBean對象)和JSp的隱含對象,都有一個範圍屬性。範圍定義了在什麼時間內在哪個JSP頁面中可以訪問這些對象。在JSP中,有4種範圍,如下

             

·page範圍

具有page範圍的對象被綁定到javax.servlet.jsp.PageContext對象中。在這個範圍內的對象,只能在創建對象的頁面中訪問。可以調
用pageContext這個隱含對象的getAttribute()方法來訪問具有這種範圍類型的對象(pageContext對象還提供了訪問其他範圍對象的
getAttribute方法),pageContext對象本身也屬於page範圍。當Servlet類的_jspService()方法執行完畢,屬於page範圍的對象的
引用將被丟棄。page範圍內的對象,在客戶端每次請求JSP頁面時創建,在頁面向客戶端發送迴響應或請求被轉發(forward)到其
他的資源後被刪除。

·request範圍

具有request範圍的對象被綁定到javax.servlet.ServletRequest對象中,可以調用request這個隱含對象的getAttribute()方法來訪問
具有這種範圍類型的對象。在調用forward()方法轉向的頁面或者調用include()方法包含的頁面中,都可以訪問這個範圍內的對象。
要注意的是,因爲請求對象對於每一個客戶請求都是不同的,所以對於每一個新的請求,都要重新創建和刪除這個範圍內的對象。

request對象的主要方法:

1、 getParameter(String name) return String

2、 getParameterNames() return Enumeration

3、 getParameterValues(String name) return String[]


 

·session範圍

具有session範圍的對象被綁定到javax.servlet.http.HttpSession對象中,可以調用session這個隱含對象的getAttribute()方法來訪問
具有這種範圍類型的對象。JSP容器爲每一次會話,創建一個HttpSession對象,在會話期間,可以訪問session範圍內的對象。

Session對象的主要方法:

1、 getAttribute(String name) return Object

2、 getAttributeNames() return Enumeration

3、 getCreationTime() return long

4、 getId() return String

5、 GetLastAccessedTime() return long

6、 GetMaxInactiveInterval() return int

7、 RemoveAttribute(String name) void

8、 SetAttribute(String name , java.lang.Object value) void

·application範圍

具有application範圍的對象被綁定到javax.servlet.ServletContext中,可以調用application這個隱含對象的getAttribute()方法來訪問
具有這種範圍類型的對象。在Web應用程序運行期間,所有的頁面都可以訪問在這個範圍內的對象。

application對象的主要方法:

 

下面我們通過幾個簡單的例子,來看一下這4種範圍對象的應用。

1.測試page範圍

test1.jsp

<%

pageContext.setAttribute("name","zhangsan");

out.println("test1.jsp: ");

out.println(pageContext.getAttribute("name"));

out.println("<p>");

pageContext.include("test2.jsp");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(pageContext.getAttribute("name"));

%>

訪問test1.jsp,將看到如下的輸出:

test1.jsp: zhangsan

test2.jsp: null

說明保存在pageContext對象中的屬性具有page範圍,只能在同一個頁面中被訪問。

2.測試request範圍

 

修改test1.jsp和test2.jsp,如下所示。

test1.jsp

<%

request.setAttribute("name","zhangsan");

out.println("test1.jsp: ");

out.println(request.getAttribute("name"));

out.println("<p>");

pageContext.include("test2.jsp");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(request.getAttribute("name"));

%>

訪問test1.jsp,將看到如下的輸出:

test1.jsp: zhangsan

test2.jsp: zhangsan

說明保存在request對象中的屬性具有request範圍,在請求對象存活期間,可以訪問這個範圍內的對象。
將pageContext.include("test2.jsp"); 這一句註釋起來,先訪問test1.jsp,再訪test2.jsp,可以看到如下輸

 

輸出:

test2.jsp: null

這是因爲客戶端開始了一個新的請求。

3.測試session範圍

修改test1.jsp和test2.jsp,如下所示。

test1.jsp

<%

session.setAttribute("name","zhangsan");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(session.getAttribute("name"));

%>

先訪問test1.jsp,然後在同一個瀏覽器窗口中訪問test2.jsp,可以看到如下輸出:

test2.jsp: zhangsan

說明保存在session對象中的屬性具有session範圍,在會話期間,可以訪問這個範圍內的對象。

如果我們在訪問完test1.jsp後,關閉瀏覽器,重新打開瀏覽器窗口,訪問test2.jsp,將看到如下輸出:

test2.jsp: null

 

這是因爲客戶端與服務器開始了一次新的會話。

4.測試application範圍

修改test1.jsp和test2.jsp,如下所示。

test1.jsp

<%

application.setAttribute("name","zhangsan");

%>

test2.jsp

<%

out.println("test2.jsp: ");

out.println(application.getAttribute("name"));

%>

先訪問test1.jsp,然後關閉瀏覽器,再打開瀏覽器窗口,訪問test2.jsp,可以看到如下輸出:

test2.jsp: zhangsan

說明保存在application對象中的屬性具有application範圍,在Web應用程序運行期間,都可以訪問這個範圍內的對象。

 

         

 

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章