日期:2014-05-16  浏览次数:20496 次

EL和JSP中的细节
EL中的细节

1、 EL的隐式对象
作用域属性的Map:   pageScope,requestScope,sessionScope,applicationScope
请求参数的Map:    param,paramValues
请求首部的Map:     header,headerValues
上下文初始化参数(不是Servlet初始化参数!)的Map:initParam
cookie的Map:cookie
pageContext:唯一一个不是Map的隐式对象,它是pageContext对象的一个实际引用。

2、 requestScope不是请求对象
隐式的requestScope只是请求作用域属性的一个Map,而不是request对象本身!
例如:得到HTTP请求方法
Method is: ${request. method}   错啦,没有request隐式对象
Method is: ${requestScope. method}   错啦,确实有一个隐式对象requestScope,但是它不是请求对象本身。
Method is: ${reqeustContext. method}  对啦!可以通过pageContext来得到其他的一切~~  

3、 禁用EL
在DD中放置<el-ignored>元素
<jsp-config>
   <jsp-property-group>
          <url-pattern>*.jsp</url-pattern>
          <el -ignored >
               true
</el -ignored >
</jsp-property-group>
</jsp-config>

使用isELIgnored page指令属性
<%@ page isELIgnored=”true” %>
注:page指令优先于DD设置,如果在DD中的<el-ignored>设置与isELIgnored page指令属性有冲突,总是听指令的。

4、 initParam只能得到上下文初始化参数
servlet初始化参数是用<init-param>配置的,而上下文参数使用<context-param>配置,initParam不能得到servlet中的初始化参数。

5、 使用点号(.)操作符访问性质和映射值
     1第一个变量(点号左边的变量)可以是一个隐式对象,也可以是一个属性,点号右边可以是一个映射键(如果第一个变量是映射),也可以是一个bean性质(如果第一个变量是一个JavaBean属性。
2如果表达式中变量后面有一个点号,点号左边的变量必须是一个Map或一个bean
3点号右边必须是一个Map键或一个bean性质。
4pageContext隐式对象是一个bean,所有其他隐式对象都是Map。

6、[]比点号更强大
    1如果表达式中变量后有一个[],左边的变量则有更多选择,可以是Map、bean、List或是数组。
    2如果[]里是一个String直接量(即用引号引起的串),这可以是一个Map键,或是一个bean性质,还可以是List或数组中的索引。数组和List中的String索引会强制转换为int。
例如:
Servlet中:
     String[] pauling={“hello”,”you”,”no”,”cat”};
     request.setAttribute(“pauling”,pauling);
JSP中:
First num is: ${pauling[0]}
First num is: ${pauling[“0”]}
两种表达都是输出一样的结果。

    3在[]中,可以使用嵌套表达式,EL中都是表达式,可以任意嵌套,深度不限。

    4
Servlet中:
java.util.Map pauling=new java.util.HashMap();
pauling.put{“pig”,”big”};
pauling.put{“cat”,”fly”};”   
request.setAttribute(“pauling”,pauling);

JSP中:
you will see:  ${pauling[“pig”]}
----?you will see:  big

如果你写成:
   you will see:  ${pauling[pig]}    就不对啦!!!
注:如果[]里的内容没有加引号,容器就会计算[]中的内容,搜索与改名字绑定的属性,并替换为这个属性的值(如果有一个同名的隐式对象,那么总是使用隐式对象)


JSP中的细节