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应用程序运行期间,都可以访问这个范围内的对象。

 

         

 

      

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