一、EL 概览
Expression Language(EL),它提供了一个让Web 页面和Bean 管理进行通信的重要机制,被应用在JSF (一个开发JavaWeb的标准框架,很少用)和JSP 技术中。简言之,EL 在页面既能获取 Bean 的属性,又能获取JSP 内置对象的属性,仅仅是获取来使用,并不能设置与修改!
1、基础语法与特点
语法:${expression}
特点:
可与JSTL 及JavaScript 语句结合使用;
对两个数值型字符串的相加,自动执行类型转换(EL 不能实现字符串相加功能);
不仅可以访问一般变量,而且可以访问javabean 中的属性、嵌套属性和集合对象;
可以执行算术、逻辑、条件、关系运算;
可以获得命名空间(pageContext 对象);
可以访问JSP 的四个作用域;
执行除法运算时,除数为0返回Infinity,对于不存在的属性,不显示为null,而是显示空字符串等;
EL 函数可与Java 类的静态方法进行映射。
2、EL 禁用
只要安装的Web 服务器能够支持Servlet 2.4/JSP 2.0,即可在JSP 页面中直接使用EL 。低于JPS 2.0的版本中,需要对其进行禁用。(应该是指从高版本迁移到低版本的服务器环境,所以需要禁用EL ,不然就不使用EL 好了。EL 只是用来显示信息的,所以禁用后对业务整个应用功能不会造成影响,只是客户端显示可能出现问题。)
JSP 中三种方式禁用EL :
1)、使用转义字符"\",一般不这么做,麻烦。如:\${request.userName}
2)、使用page 指令的isELIgnored 属性,取值true或false
3)、web.xml中在jsp-config 元素中配置,如:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
注:新了解了在web.xml 中对jsp页面进行配置的标签,jsp-config包含两个大的子标签,具体功能暂不详细了解:
<jsp-config>
<taglib>
</taglib>
<jsp-property-group>
</jsp-property-group>
</jsp-config>
技巧:eclipse中在某标签内容处ctrl+/ 提示信息,关键在于提示的标签中将当前可选与不可选的标签都列出了,其中可选的标签,其前面的"<>"是黑色的,不可选的呈灰色。
3、EL 中保留关键字
共16个,在此简单分类:
逻辑:or、and、not
比较:gt、eq、lt、ge、le
判断:instanceof、empty、null、true、false
除法:mod、div
4、EL 运算符及其优先级
算术型:+、-(二元)、*、/、div、%、mod、-(一元)
逻辑型:and、&&、or、||、!、not
关系型:==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
空:空操作符是前缀操作,可用于确定值是否为空。
条件型: A ?B :C。根据 A 赋值的结果来赋值 B 或 C。
注:此外,还应该注意[]与点的访问数据的作用,对于有"-"号命名的属性,只能通过[]访问,如:${request["user-name"]},而非${request.user-name}
5、EL 访问应用数据的隐含对象
EL 提供了11个隐含对象,对应于JSP 的内置对象,直接通过对象名操作。这些隐含对象中,除pageContext 是JavaBean 对象,对应于javax.servlet.jsp.PageContext 类型,其它的对象均对应于java .util.Map 类型,里面存储了与JSP 内置对象的数据。在此简单分类:
(1)、pageContext 隐含对象。可以获取JSP 中9个内置对象中application、config、pageContext 除外的内置对象的相应隐含对象,及servletContext(JSP 中实际上application内置对象就是ServletContext 的实例)隐含对象。即可获取:servletContext、session、request、response、page、out、exception隐含对象。
(2)、servletContext、session、request、response、page、out、exception隐含对象。
(3)、pageScope、requestScope、sessionScope、applicationScope隐含对象。使用这些对象后,将系统将不再按照默认的顺序(page、request、session、application)查找相应的标识符。实例化一个bean 时是可以通过scope属性指定其存在范围的。
6、EL 访问环境信息的隐含对象
共6个:
param对象:获取请求参数的值,如获取name属性为user的input 的值:${param.user};
paramValues对象:如果表单中同一个name对应多个值,则使用此对象而非param对象;
header对象:获取HTTP 请求的一个具体的header值;
headerValues对象:类比param与paramValues对象;
initParam对象:获取应用的初始化参数(通过context-param标签定义的参数);
cookie 对象:可以访问在客户端设置的cookie对象(通过response的addCookie设置cookie),语法:${cookie.cookie名.cookie值}
7、定义和使用EL 函数
具体看 定义和使用标签库 篇。
注:以上整理于《Java Web 入门经典》——王国辉 陈英等
二、实例解析EL 中各种运用
原文:http://www.jb51.net/article/82406.htm
内容:
这篇文章主要介绍了JSP中EL表达式的各种运用,比如用EL处理数学运算、内置对象以及数据的存取等,代码示例都相当实用,需要的朋友可以参考下
EL运算符:
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.sql.*"%>
<!DOCTYPE html>
<html>
<head>
<title>El算数运算符</title>
</head>
<body>
<table border=1>
<tr>
<td>算数运算符</td>
<td>结果</td>
</tr>
<tr>
<td>加法运算符\${1+ 1}</td>
<td>结果${1+1}</td>
</tr>
<tr>
<td>减法运算符\${1- 1}</td>
<td>结果${1-1}</td>
</tr>
<tr>
<td>乘法运算符\${1* 2}</td>
<td>结果${1* 1}</td>
</tr>
<tr>
<td>除法运算符\${3/ 2}</td>
<td>结果${3/ 2}</td>
</tr>
<tr>
<td>求余运算符\${3% 2}</td>
<td>结果${3% 2}</td>
</tr>
</table>
<table border=1>
<tr>
<td>关系运算符</td>
<td>结果</td>
</tr>
<tr>
<td>等于运算符\${1== 1}</td>
<td>结果${1==1}</td>
</tr>
<tr>
<td>不等于运算符\${1!= 1}</td>
<td>结果${1!=1}</td>
</tr>
<tr>
<td>小于运算符\${1< 2}</td>
<td>结果${1< 2}</td>
</tr>
<tr>
<td>大于运算符\${3> 2}</td>
<td>结果${3> 2}</td>
</tr>
<tr>
<td>小于等于运算符\${1<= 2}</td>
<td>结果${1<= 2}</td>
</tr>
<tr>
<td>大于等于运算符\${3>= 2}</td>
<td>结果${3>= 2}</td>
</tr>
</table>
<table border=1>
<tr>
<td>逻辑运算符</td>
<td>结果</td>
</tr>
<tr>
<td colspan="2">逻辑运算符&&</td>
</tr>
<tr>
<td>\${true&& true}</td>
<td>结果${true&& true}</td>
</tr>
<tr>
<td>\${true&& false}</td>
<td>结果${true&& false}</td>
</tr>
<tr>
<td>\${false&& false}</td>
<td>结果${false&& false}</td>
</tr>
<tr>
<td colspan="2">逻辑运算符||</td>
</tr>
<tr>
<td>\${true|| true}</td>
<td>结果${true|| true}</td>
</tr><tr>
<td>\${true|| false}</td>
<td>结果${true|| false}</td>
</tr><tr>
<td>\${false|| false}</td>
<td>结果${false|| false}</td>
</tr>
<tr>
<td colspan="2">逻辑运算符!</td>
</tr>
<tr>
<td>\${!true}</td>
<td>结果${!true}</td>
</tr><tr>
<td>\${!false}</td>
<td>结果${!false}</td>
</tr>
</table>
<table border=1>
<tr>
<td>条件运算符</td>
<td>结果</td>
</tr>
<tr>
<td>\${2>1?"Yes":"No"}</td>
<td>结果${2>1?"Yes":"No"}</td>
</tr>
<tr>
<td>\${2<1?"Yes":"No"}</td>
<td>结果${2<1?"Yes":"No"}</td>
</tr>
</table>
<table border=1>
<tr>
<td>验证运算符</td>
<td>结果</td>
</tr>
<tr>
<td>\${empty param.username}</td>
<td>结果${empty param.username}</td>
</tr>
<tr>
<td>\${empty param.password}</td>
<td>结果${empty param.password}</td>
</tr>
</table>
<table border=1>
<tr>
<td>括号运算符及运算符的优先级</td>
<td>结果</td>
</tr>
</table>
</body>
</html>
EL处理内置对象:
“.”和"[]"符号是用来存取数据的
${applicationScope.user.username}
${applicationScope.user[0].username}
${applicationScope.user["user-name"]}
通过变量来传值就必须使用[]
${applicationScope.user["data"]}
与存储有关的内置对象
与输入有关的内置对象
<!DOCTYPE html>
<html>
<head>
<title>用户表单</title>
</head>
<body>
<form action="UserDemo.jsp"method="post">
用户名:<input type="text"name="username"/><br />
密码:<input type="password"name="password"/><br />
姓名:<input type="text"name="name"/><br />
性别:<input type="radio"name="sex"value="男">男<input type="radio"name="sex"value="女">女<br />
爱好:<br />
<input type="checkbox"name="interest"value="打篮球">打篮球<br />
<input type="checkbox"name="interest"value="看书">看书<br />
<input type="checkbox"name="interest"value="旅行">旅行<br />
<input type="checkbox"name="interest"value="编程">编程<br />
<input type="submit"value="提交">
<input type="reset"value="重置">
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>接收用户参数</title>
</head>
<body>
<%
//设置页面编码格式
request.setCharacterEncoding("gb2312");
%>
<%--接收用户参数--%>
用户名:${<span style="color:#003399;">param</span>.username}<br />
密码:${<span style="color:#003399;">param</span>.password}<br />
姓名:${<span style="color:#003399;">param</span>.name}<br />
性别:${<span style="color:#003399;">param</span>.sex}<br />
爱好:${<span style="color:#003399;">paramValues</span>.interest[0]}
${<span style="color:#003399;">paramValues</span>.interest[1]}
</body>
</html>
cookie内置对象
<!DOCTYPE html>
<html>
<head>
<title>设置cookie的值</title>
</head>
<body>
<%
//设置cookie的值
Cookie c = newCookie("username","root");
//添加cookie到客户端
response.addCookie(c);
%>
<a href="getCookieDemo.jsp">显示cookie的值</a>
</body>
</html>
<span style="color:#000000;"><%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
<head>
<title>取得cookie的值</title>
</head>
<body>
cookie中的username的值为:${cookie.username.value}
</body>
</html>
header内置对象
initParam内置对象:获取web站点中设置的环境变量
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
<head>
<title>获得环境参数</title>
</head>
<body>
username参数值:${initParam.username}<br />
</body>
</html>
<?xml version="1.0"encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<context-param>
<param-name>username</param-name>
<param-value>Zhangdapeng</param-value>
</context-param>
</web-app>
pageContex内置对象
用来取得有关用户请求和页面的详细信息
<body>
<table border="1">
<tr>
<td>取得请求的参数的字符串</td>
<td>${pageContext.request.queryString}</td>
</tr><tr>
<td>取得请求URL</td>
<td>${pageContext.request.requestURL}</td>
</tr><tr>
<td>取得web应用名称</td>
<td>${pageContext.request.contextPath}</td>
</tr><tr>
<td>取得HTTP请求方式(POST/GET)</td>
<td>${pageContext.request.method}</td>
</tr><tr>
<td>取得使用的协议</td>
<td>${pageContext.request.protocol}</td>
</tr><tr>
<td>取得用户IP地址</td>
<td>${pageContext.request.remoteAddr}</td>
</tr><tr>
<td>判断session是否为新</td>
<td>${pageContext.session.new}</td>
</tr><tr>
<td>取得session的id</td>
<td>${pageContext.session.id}</td>
</tr>
</table>
</body>
EL存取器:
使用存取器读取JavaBean中的数据
package com.javaweb.ch08;
import java.util.*;
//一个简单的JavaBean示例
public class Person{
privateStringname;
private int age;
privateStringsex;
private ArrayList friends;
public Person(){
}
public Person(Stringname,int age,Stringsex){
this.name = name;
this.age = age;
this.sex = sex;
}
publicStringgetName(){
return name;
}
public int getAge(){
return age;
}
publicStringgetSex(){
return sex;
}
public void setName(Stringname){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
public void setSex(Stringsex){
this.sex = sex;
}
public void setFriends(ArrayList friends){
this.friends = friends;
}
public ArrayList getFriends(){
return friends;
}
}
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
<head>
<title>设置JavaBean中的属性</title>
</head>
<body>
<%
//实例化一个Person
Person person = newPerson("zhangdapeng",24,"男");
//创建一个friends实例
ArrayList friends = newArrayList();
//添加值
friends.add("wang wu");
friends.add("li si");
person.setFriends(friends);
//存储在session范围内
session.setAttribute("person",person);
%>
<a href="GetJavaBean.jsp">跳转到GetJavaBean.jsp</a>
</body>
</html>
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
<head>
<title>取得JavaBean中的属性值</title>
</head>
<body>
姓名:${sessionScope.person.name}<br />
年龄:${sessionScope.person.age}<br />
性别:${sessionScope.person.sex}<br />
朋友:${sessionScope.person.friends[0]},${sessionScope.person.friends[1]}<br />
</body>
</html>
使用存储器读取Map中的数据
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
<head>
<title>设置Map页面</title>
</head>
<body>
<%
//新建一个HashMap
HashMap userInfo = newHashMap();
//在HashMap中设置值
userInfo.put("username","zhangdapeng");
userInfo.put("password","zhnagda123");
//将值存储到session范围中
session.setAttribute("userInfo",userInfo);
%>
<a href="GetMapDemo.jsp">跳转到GetMapDemo.jsp</a>
</body>
</html>
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
<head>
<title>使用存储器读取map中的数据</title>
</head>
<body>
用户名:${sessionScope.userInfo.username}<br />
密码:${sessionScope.userInfo.password}<br />
</body>
</html>
使用存储器读取数组中的数据
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
<head>
<title>设置Array页面</title>
</head>
<body>
<%
String[] names = {"zhangda1","zhangda2","zhangda3"};
//将值存储到session范围中
session.setAttribute("names",names);
%>
<a href="GetMapDemo.jsp">跳转到GetArrayDemo.jsp</a>
</body>
</html>
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
<head>
<title>使用存储器读取map中的数据</title>
</head>
<body>
用户名1:${sessionScope.names[0]}<br />
用户名2:${sessionScope.names[1]}<br />
</body>
</html>
存储器的复杂应用
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<%@pageimport="java.util.*,com.javaweb.ch08.*"%>
<!DOCTYPE html>
<html>
<head>
<title>设置Array页面</title>
</head>
<body>
<%
ArrayList<Person> persons = newArrayList<Person>();
Person person1 = newPerson("wang wu",24,"男");
Person person2 = newPerson("wang liu",24,"女");
persons.add(person1);
persons.add(person2);
session.setAttribute("persons",persons);
%>
<a href="GetMapDemo.jsp">跳转到GetArrayDemo.jsp</a>
</body>
</html>
<%@pagelanguage="java"contentType="text/html;charset=gb2312"%>
<!DOCTYPE html>
<html>
<head>
<title>使用存储器读取map中的数据</title>
</head>
<body>
用户名1:${sessionScope.persons[0].name},${sessionScope.persons[0].age},${sessionScope.persons[0].sex}<br />
用户名2:${sessionScope.persons[1].name},${sessionScope.persons[1].age},${sessionScope.persons[1].sex}<br />
</body>
</html>