您的位置:首页 > 其它

EL基本用法

2010-03-31 16:26 162 查看
概述

EL是在web前端经常会用到的技术,EL经常和JSTL一起使用,但是EL又可以单独使用,全称是Expression Language,它原本是JSTL 1.0为方便存取数据所定义的语言,是一种新的语言,有它自己的语法,只要支持Servlet2.4或者JSP2.0的容器,都可以在JSP网页中直接使用EL,不需导入任何其他的包。
优势
在JSP中,经常会打印一些变量的内容,这些变量可以是从某个范围中变量,比如page、request、session、application范围。例,打印str变量,下面三种方法都可以:
<%out.println(str)%>,这样会使JSP页面里面包含JAVA代码;
<%=str%>只能从本地获得,如果要从session里面获取必须是<%=session.getAttribute()%>;
${str}则可以从request、session、application范围中获得。
EL语法

EL的语法很简单,最大的特点就是使用上很方便。所有的EL都是以 ${ 为起始、以 } 为结尾的。
例如:${sessionScope.user.sex},表示从session的范围中,取得用户的性别。如果使用JSP Scriptlet的写法如下:
User user = (User)session.getAttribute(“user”);
String sex = user.getSex();
out.print(“sex”);
使用这种方法就会使JSP中包含JAVA代码,而且很麻烦。
EL提供 . 和 [ ] 两种运算符来存取数据。下面两种所代表的意思是一样的。

${sessionScope.user.sex}等于${sessionScope.user[“sex”]}
但是使用 [ ] 的范围更广,因为 [ ] 中还可以是变量,比如:
String str = “sex”;
${sessionScope.user[str]}
. 和 [ ] 的混合使用,获取集合中元素的值,例如:
${sessionScope.shoppingCart[0].price}表示结果为shoppingCart中第一项物品的价格。
几个重要的EL隐含对象

pageScope,取得page范围的属性名称所对应的值。
requestScope,取得request范围的属性名称所对应的值。
sessionScope,取得session范围的属性名称所对应的值。
applicationScope,取得application范围的属性名称所对应的值。
param,如同ServletReqest.getParameter(String
name)。
cookie,如同HttpServletRequest.getCookie()。
initParam,如同ServletContext.getInitParameter(String
name)。
获取request、session、application中的值
新建项目ELPro,新建页面PageA.jsp、PageB.jsp
PageA.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'PageA.jsp' starting page</title>
</head>
<body>
<%
application.setAttribute("msgA", "Welcome Application!");//在application内放一些内容
session.setAttribute("msgS", "Welcome Session!");//在session内放一些内容
request.setAttribute("msgR", "Welcome Request!");//在request内放一些内容
%>
<a href="PageB.jsp" mce_href="PageB.jsp">进入PageB页面</a>
</body>
</html>
PageB.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'PageB.jsp' starting page</title>
</head>
<body>
application中的内容:${applicationScope.msgA }<br/>
session中的内容:${sessionScope.msgS }<br/>
request中的内容:${request.msgR }<br/>
</body>
</html>
[b][b]
[/b][/b]
[b][b][/b][/b]

[b][b][/b][/b]
[b][b][/b][/b]

运行页面,在PageB.jsp显示如下

[b][b][/b][/b][b][/b]

[b][/b]

[b][/b]

application中的内容:Welcome Application!

session中的内容:Welcome Session!

request中的内容:
因为PageA.jsp到PageB.jsp是使用连接,地址栏上的地址也发生了改变,所以是一个从定向跳转,此时request中内容丢失了,所以request中的内容没有显示,如果使用forward跳转,request中的内容将不会丢失。
上面使用了EL表达式来获取各种范围中的数据内容。使用的方式是${applicationScope.msgA},也可以省略Scope部分,直接写成${msgA},省略方式写成${msgA},系统会自动去application、session、request、page四种范围寻找msgA,所以这种省略的写法只能用在pageScope、requestScope、sessionScope、applicationScope四种范围内。其他不能省略,例如不能把${param.A}省略成${A}。
假如applicationScope和sessonScope中都有msg呢,用省略的方式${msgA}得到的是什么呢?
application.setAttribute("msg", "Welcome Application!");
session.setAttribute("msg", "Welcome Session!");
${msg}将得到的是结果是:Welcome Session!
因为系统自动寻找的步骤是:pageScope、requestScope、sessionScope、applicationScope,所以先找到session中的msg信息。
上面的例子中放入session等范围的都是一些简单的数据,当然也可以放入复制的数据,例如javabean、集合等。
创建Customer.java的javabean
package po;
public class Customer {
private String account;
private String password;

public Customer() {

}

public Customer(String account, String password) {
this.account = account;
this.password = password;
}

public String getAccount() {
return account;
}

public void setAccount(String account) {
this.account = account;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}
在PageA.jsp中生成该javabean
Customer cus = new Customer("000", "000");
session.setAttribute("cus", cus);
在PageB.jsp中打印该Customer javabean的值,添加如下代码。
customer的值为:${cus.account }, ${cus.password }
运行结果如下
customer的值为:000, 000
更加复制的情况,在PageA.jsp中加入如下代码
ArrayList cuses = new ArrayList();
cuses.add(new Customer("111", "111"));
cuses.add(new Customer("222", "222"));
cuses.add(new Customer("333", "333"));
session.setAttribute("customers", cuses);
在PageB.jsp中打印customer信息,添加代码如下
所有的customer如下<br/>
第一个:${customers[0].account }, ${customers[0].password }<br/>
第二个:${customers[1].account }, ${customers[1].password }<br/>
第三个:${customers[2].account }, ${customers[2].password }<br/>
运行结果如下
第一个:111,
111
第二个:222, 222
第三个:333, 333
获取param中的值

使用param,就是使用url传递过来的参数,例如在PageA.jsp中的连接使用如下
<a href="PageB.jsp?A=1&B=2" mce_href="PageB.jsp?A=1&B=2">进入PageB页面</a>
在PageB.jsp中得到A和B的值的代码如下
参数A的值是:${param.A }<br/>
参数B的值是:${param.B }<br/>
运行结果如下

参数A的值是:1
参数B的值是:2
获取cookie中的值
在PageA.jsp中添加如下代码
response.addCookie(new Cookie("username", "skycloud"));
在PageB.jsp中获取cookie的值,代码如下

cookie username的值是:${cookie.username.value }
运行结果如下

cookie
username
的值是:skycloud
如果直接使用${cookie.username}将得到一个对象,运行结果如下
cookie username的值是:javax.servlet.http.Cookie@2cc2d4
获取initParam的值
有些时候需要在web.xml中进行一些初始化的工作,例如在web.xml做如下初始化
<context-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</context-param>
如果要在PageB.jsp中获取这个初始化参数,在PageB.jsp中添加如下代码
初始化参数encoding是:${initParam.encoding }
运行结果如下

初始化参数encoding是:gb2312
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: