JSP/Servlet技术详解---之EL表达式语言简明教程

在Jsp里面获得对象都是直接想在哪里获取就哪里嵌入<%=request.getAttribute("p")%>

这样的一个好处是方便,尤其是对于程序员而言。他们只需要在html的位置上嵌入标签,就可以获得所需的数据。至于缺点嘛,显而易见,第一是美观上的问题,看到一个jsp页面密密麻麻的<%%>里面又包含了Java代码,大家都不愿多看一眼。而且对日后的代码管理维护也是一个巨大的隐患。

什么是EL,它是JSP表达式语言(Expression Language),已经是JSP2.0规范的一部分。为什么强调它是JSP规范呢。因为它事实上成了标准,使用的时候,你不需要下载配置相关的组件.

-------------------------以上都是肺话-------------------------------------------

EL的语法:

很简单 ${ } //千万不要写成人民币的符号啊,毕竟java是老美的^_^

比如,假设我们先 request.setAttibute("person",Person);

在JSP页面中如何访问person呢?

<html>

<body>

the person is: ${person}

</body>

</html>



如何访问一个对象的属性呢?例如一个对象 Person 的 name属性

${person.name}

或者

${person["name"]}

两者是等价的。记住"."能做到的,"[]"也能做到。反之就不一定了



访问不同的对象实例:

1.访问一个普通的java bean, 假设 一个对象 Person 有name属性,

Person person=new Person();

先request.setAttibute("person",person);



显示name :${person.name}



2.访问数组,利用下标直接访问

String s[]={"1","2"};

request.setAttribute("s",s);



显示s[1]

${s[1]}

或者${s["1"]}



3.访问 List,直接用下标进行访问

ArrayList list=new ArrayList();

list.add("1");

list add("1");

request.setAttribute("list",list);


显示list[1]:

${list[1]}

或者${list["1"]}



注意:这里你可能会举得奇怪,为什么数组和list下标可以用数字或者引号加数字

其实在解析的时候,[]里面的索引都是被强制转成int的,索引随便你加不加引号吧



4.访问一个Map,用.或者[]访问

Map map=new Map();

map.put("one","no.1");

map.put("two","no.2");

request.setAttribute("map",map);

显示map("one"):

${map.one}

或者${map["one"]}

注意:这里千万不能用 ${map[one]} 因为下标里面的东西如果不加引号,它就相当于

一个属性,容器编译的时候就会去寻找one属性,相当于${one},找不到,当然就错了



中括号里面是可以嵌套表达式的,但是,中括号里面的表达式是去掉${}的

例如:



${test1[test2[2]] 正确 而 ${test1[${test2[2]}]编译报错



EL隐含对象

你可能又会问什么事隐含对象?隐式对象就是事先准备好的,你可以直接访问,不必知道是怎么来的。

就跟JSP中的隐含对象 request,response一样, 你直接用就行,没人会说你的,放心吧



EL共有11个隐含对象

pageContext

对应于 javax,servlet.jsp.PageContext对象,利用 pageContext,可以访问

ServletContext,Request,Response,Session,例如:

${pageContext.servletContext}

${pageContext.request}

${pageContext.response}

${pageContext.session}



pageScope

类型是Map,将页面范围内的属性名和它的值进行映射。主要是用于获取页面范围的

属性值

例如上面的person

${pageScope.person}



requestScope

类型是Map,用于直接获得请求访问内的属性值

例如

${requestScope,user}



sessionScope

跟上面的requestScope类似,只是范围不同,它是会话范围内的属性

例如

${sessionScope.user}



applicationScope

跟上面的requestScope类似,只是范围不同,它是应用程序范围内的属性

例如

${applicationScope.user}



param

类型是Map,就是请求中参数属性

例如 http://www.janeky.com/request.jsp?name=jiange

获得name

${param.name}



加入一个请求参数名有多个参数值

paramValues

类型Map

例如 http://www.janeky.com/request.jsp?name=jiange&name=jiange2

${paramValues.name[0]}

${paramValues.name[1]}



headerValuess

用于获得请求报头的值,等同于调用ServletRequest.getHeader()



cookie

这个很好用。以前你在jsp中都是先 requst.getCookies();

for()cookies[i].getName().equal("name");

现在一句话就搞定了

${cookie.name.value}


initParam

用于访问上下文的初始化参数。在web.xml中<context-param>

等价于 application.getInitParameter("");


命名变量的查找

你有时偷懒,直接${name}

这时候程序就忙了,它安装page,request,session,application范围帮你找

很多时候命名冲突就麻烦了。

你最好限定范围

${requestScope.name}



EL还可以进行简单的运算操作呢

算术运算

+

-

*

/(或者div) ${3/2}或者${3div2} //主要这里的两个操作数都会被强制转型double,结果是1.5

%(或者mod)


逻辑运算

&&(或者and)

||(或者or)

!(或者not)



关系操作符

== eq

!= ne

< lt

> gt

<= le

>= ge



还觉得EL不够强大,那自己去定义函数吧。个人觉得这样没必要。还是把方法告之一下

1.编写有一个公共静态方法的Java类

2.编写一个标记库描述文件(Tag Library Descriptor,TLD)

3.在JSP中放一个taglib指令

4使用EL调用函数

-----------------------------------以下不是废话---------------------------------

关于EL,本身是很繁杂了,提供的功能也很多,但是,我们用到的功能很少,就是用来获得
我们需要的属性值而已。至于它的函数功能,我建议还是不用去弄了,因为接下来我们可以用
JSTL去灵活控制。

记住EL只是用来获得属性值用的,没有逻辑控制结构的。

来自janeky

posted @ 2009-10-12 15:27  kqhon  阅读(752)  评论(0)    收藏  举报