<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表達式</title>
</head>
<body>
<h2>演示EL表達式的用法,格式: ${標識符}</h2>
<a href="jsps/demo1.jsp">用EL表達式讀取數據</a>
<br>
<br>
<a href="jsps/demo2.jsp">EL表達式的運算符</a>
<br>
<br>
<a href="jsps/demo3.jsp?name=Jack&age=22">EL表達式中的隱藏對象</a>
<br />
<br />
<br />
<br />
<a href="show">EL表達式中的應用實例--用戶信息查詢</a>
<br />
<br />
<a href="show2">EL表達式中的應用實例--用戶信息查詢2--EL表達式的不足,JSTL出場解決</a>
<br />
</body>
</html>
EL 全名爲Expression Language。
EL主要作用:
獲取數據:
EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的java對象中獲取數據。
執行運算:
利用EL表達式可以在JSP頁面中執行一些基本的關係運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。
獲取web開發常用對象
EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕鬆獲得對web常用對象的引用,從而獲得這些對象中的數據。
調用Java方法
EL表達式允許用戶開發自定義EL函數,以在JSP頁面中通過EL表達式調用Java類的方法。
獲取數據:
使用EL表達式獲取數據語法:${ 標識符}
EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符爲關鍵字,分別從page、request、session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回”” (注意,不是null,而是空字符串)。
EL表達式也可以很輕鬆獲取JavaBean的屬性,或獲取數組、Collection、Map類型集合的數據
結合JSTL的foreach標籤,使用EL表達式也可以很輕鬆迭代各種類型的數組或集合,示例:
迭代數組
迭代collection類型集合
迭代map類型集合
獲得web開發常用對象:
EL表達式語言中定義了11個隱含對象,使用這些隱含對象可以很方便地獲取web開發中的一些常見對象,並讀取這些對象的數據。
語法 :${隱式對象名稱},:獲得對象的引用
pageContext:對應於JSP頁面中的pageContext對象(注意:取的是pageContext對象。)
pageScope:代表page域中用於保存屬性的Map對象
requestScope:代表request域中用於保存屬性的Map對象
sessionScope:代表session域中用於保存屬性的Map對象
applicationScope:代表application域中用於保存屬性的Map對象
param:表示一個保存了所有請求參數的Map對象
paramValues:表示一個保存了所有請求參數的Map對象,它對於某個請求參數,返回的是一個string[]
header:表示一個保存了所有http請求頭字段的Map對象
headerValues:同上,返回string[]數組。注意:如果頭裏面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”]
cookie:表示一個保存了所有cookie的Map對象
initParam :表示一個保存了所有web應用初始化參數的map對象
1.測試各個隱式對象
2.注意事項
測試headerValues時,如果頭裏面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”]
測試cookie時,例
<%@page import="cn.hncu.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表達式</title>
</head>
<body>
<h2>用EL表達式讀取數據</h2>
<font color="red" size="5">用EL表達式讀取容器中的數據</font><br/>
<%
//pageContext.setAttribute("name", "pageContext_jack");
//request.setAttribute("name", "request_jack");
session.setAttribute("name", "session_jack");
application.setAttribute("name", "application_jack");
%>
name:${name}<!-- 找到誰就會讀出誰(session/application特殊:只要有) --><br/>
abc:${abc}<!-- 沒有不會掛 --><br/>
<!-- EL表達式的內容實現機制, 如果所讀取的屬性不存在,輸出空字符串""(注意,不是null) -->
EL表達式的內容實現機制:<%=pageContext.findAttribute("name")==null ? "":pageContext.findAttribute("name") %>
<br/><br/><br/>
<font color="red" size="5">用EL表達式讀取JavaBean中的數據</font><br/>
<%
User u=new User();
u.setName("tom");
u.setAge(15);
u.setPwd("tom");
u.setId("001");
//把數據放到容器中
session.setAttribute("user", u);//或者request(必須轉發)
%>
EL表達式中的標識符必須用"屬性名"但不加引號且屬性名相當於對象:u:${u}<br/>
<!-- EL表達式的 標識符必須是"屬性名"但不加引號且屬性名相當於對象-->user:${user}<br/>
user.name:${user.name},,,id:${user.id},,,age:${user.age},,,pwd:${user.pwd}
<br/><br/><br/>
<font color="red" size="5">用EL表達式讀取Map中的數據</font><br/>
<%
Map<String,Object> map=new HashMap<String,Object>();
map.put("name", "rose");
map.put("id", "R001");
map.put("age", "20");
map.put("pwd", "21432");
session.setAttribute("mm", map);
%>
建議採用:mm.name:${mm.name},,,id:${user.id},,,age:${user.age},,,pwd:${user.pwd}<br/>
可以,但不建議使用:mm['name']:${mm['name']},,,user['id']:${user['id']},,,user['age']:${user['age']},,,user['pwd']:${user['pwd']}<br/>
但是-如果屬性名不符合標識符的命名規則要用第二種方式<br/><br/><br/>
<font color="red" size="5">用EL表達式讀取List中的數據</font><br/>
<%
List list=new ArrayList();
list.add(u);
list.add("hncu");
session.setAttribute("list", list);
%>
list[0]:${list[0]}--調用User類的toString()函數<br/>
list[0].name:${list[0].name},,,age:${list[0].age},,,id:${list[0].id}
</body>
</html>
<%@ page language="java" import="java.util.*,cn.hncu.domain.User" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表達式</title>
</head>
<body>
<%
User u=new User();
u.setName("tom");
u.setAge(15);
u.setPwd("tom");
u.setId("001");
//把數據放到容器中
request.setAttribute("user", u);//或者request(必須轉發)
pageContext.setAttribute("a", "page_a");
request.setAttribute("a", "req_a");
session.setAttribute("a", "session_a");
application.setAttribute("a", "app_a");
%>
<font color="red">從指定容器讀取,效率更高</font><br/>
pageScope.a:${pageScope.a}<br/>
requestScope.user.name:${requestScope.user.name}<br/>
requestScope.a:${requestScope.a}<br/>
sessionScope.a:${sessionScope.a}<br/>
applicationScope.a:${applicationScope.a}<br/>
<br/>
<font color="red">請求頭</font><br/>
header:${header}<br/>
<font color="red">--都是key-value形式</font><br/>
header.host:${header.host}<br/>
header.cookie:${header.cookie}<br/>
cookie.JSESSIONID.value:${cookie.JSESSIONID.value}<br/>
cookie.jsessionid.value:${cookie.jsessionid.value}<br/>
<!-- 這種註釋不能把下面的cookie.JSESSIONID.key注掉-->
<%-- org.apache.jasper.JasperException
cookie.JSESSIONID.key:${cookie.JSESSIONID.key}
--%>
cookie.JSESSIONID.name:${cookie.JSESSIONID.name}<br/>
<br/>
param:${param}<br/>
param.name:${param.name}<br/>
param.age:${param.age}<br/>
paramValues:${paramValues}--用於讀取類似 興趣愛好 這種參數 的值 (字符串數組)<br/>
paramValues.name:${paramValues.name}<br/>
paramValues.name[0]:${paramValues.name[0]}<br/>
<br/>
initParam:${initParam}<br/>
pageContext:${pageContext}--類對象<br/>
pageContext.request:${pageContext.request}<br/>
pageContext.request.contextPath:${pageContext.request.contextPath}--項目名(不能重寫url但是能代替寫java代碼的方式)<br/>
<br/><br/><br/>
</body>
</html>
執行運算:
語法:${運算表達式},EL表達式支持如下運算符:
empty運算符:檢查變量是否爲null或“空”,很好用!!!
二元表達式:${user!=null?user.name : “”} ,很好用!!!
[ ] 和 . 號運算符
<%@ page language="java" import="java.util.*,cn.hncu.domain.User" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表達式</title>
</head>
<body>
<h2>EL表達式的運算符</h2>
<%
User u=new User();
u.setName("tom");
u.setAge(15);
u.setPwd("tom");
u.setId("001");
//把數據放到容器中
request.setAttribute("user", u);//或者request(必須轉發)
%>
<font color="red" size="5">可以使用算術運算符:+,-,*,/,%</font><br/>
user.age+10:${user.age+10}
<br/><br/><br/>
<font color="red" size="5">可以使用比較運算符:== != < > <= >= </font><br/>
user.name=='tom'&& user.age>15= ${user.name=='tom'&& user.age>15 }<!-- true -->
<br/><br/><br/>
<font color="red" size="5">可以使用條件算符</font><br/>
user.age>20?"老了":"年輕"= ${user.age>20?"老了":"年輕"}
<br/><br/><br/>
<font color="red" size="5">可以使用判斷是否爲空的運算符--empty</font><br/>
如果u爲null(根本就沒有這樣的屬性) 或 空字符串 ,都是返回true<br/>
empty u:${empty u}<!-- 如果u有定義,爲null--根本米有這樣的屬性,或者爲空字符串....true --><br/>
empty user:${empty user}<!-- false --><br/>
empty user的非:${!empty user}<!-- true --><br/>
</body>
</html>
運用EL表達式的一個小實例:
package cn.hncu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.domain.Car;
import cn.hncu.domain.User;
public class ShowServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//封裝信息--模擬後臺查詢並封裝出出來
User user=new User();
user.setId("u001");
user.setName("rose");
user.setAge(12);
user.setPwd("1324");
String[] colors={"red","green","blue"};
Car cars[]=new Car[3];
for(int i=0;i<3;i++){
cars[i]=new Car();
cars[i].setId(""+(i+1));
cars[i].setColor(colors[i]);
cars[i].setName("car"+(i+1));
}
user.setCars(cars);
//把查詢出來的數據 轉到 前端頁面去顯示
request.setAttribute("user", user);
request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);
}
}
<%@ page language="java" import="java.util.*,cn.hncu.domain.User" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表達式</title>
<style type="text/css">
table{
border: 1px red solid;
border-collapse: collapse;
width: 200px;
}
th{
border: 1px red solid;
}
td{
border: 1px red solid;
}
</style>
</head>
<body>
<h2>用戶信息如下:</h2>
user--${user}<br>
user.name--${user.name}<br>
<font color="red">車輛信息如下:</font><br>
<table>
<tr><th>車名</th><th>編號</th><th>顏色</th></tr>
<tr><th>${user.cars[0].name}</th><th>${user.cars[0].id}</th><th>${user.cars[0].color}</th></tr>
<tr><th>${user.cars[1].name}</th><th>${user.cars[1].id}</th><th>${user.cars[0].color}</th></tr>
<tr><th>${user.cars[2].name}</th><th>${user.cars[2].id}</th><th>${user.cars[0].color}</th></tr>
</table>
</body>
</html>
package cn.hncu.servlet;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.domain.Car;
import cn.hncu.domain.User;
public class ShowServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//封裝信息--模擬後臺查詢並封裝出出來
User user=new User();
user.setId("u001");
user.setName("rose");
user.setAge(12);
user.setPwd("1324");
String[] colors={"red","green","blue","pink","black","gray","yellow","white"};
Random r=new Random();
// int n=0;
int n=r.nextInt(50);
Car cars[]=new Car[n];
for(int i=0;i<n;i++){
cars[i]=new Car();
cars[i].setId(""+(i+1));
cars[i].setColor(colors[i%8]);
cars[i].setName("car"+(i+1));
}
user.setCars(cars);
//把查詢出來的數據 轉到 前端頁面去顯示
request.setAttribute("user", user);
request.getRequestDispatcher("/jsps/show2.jsp").forward(request, response);
}
}
<%@ page language="java" import="java.util.*,cn.hncu.domain.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表達式</title>
<style type="text/css">
table{
border: 1px red solid;
border-collapse: collapse;
width: 200px;
}
th{
border: 1px red solid;
}
td{
border: 1px red solid;
}
</style>
</head>
<body>
<h2>用戶信息如下:</h2>
user--${user}<br>
user.name--${user.name}<br>
<font color="red">車輛信息如下:</font><br>
<table>
<tr><th>車名</th><th>編號</th><th>顏色</th></tr>
<%
Car cars[]=((User)request.getAttribute("user")).getCars();
pageContext.setAttribute("cars", cars);
for(Car c:cars){
pageContext.setAttribute("c", c);
%>
<tr><td>${c.name}</td><td>${c.id}</td><td>${c.color}</td></tr>
<%
}
%>
</table>
<h2>El表達式的不足-JSTL出場解決</h2>
<font color="red">車輛信息如下2:</font><br>
<c:if test="${!empty c}">
<table>
<tr><th>車名</th><th>編號</th><th>顏色</th></tr>
<%--
<c:forEach items="${user.cars}" var="c">
--%>
<c:forEach items="${cars}" var="c">
<tr><td>${c.name}</td><td>${c.id}</td><td>${c.color}</td></tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
值對象
package cn.hncu.domain;
public class User {
private String pwd;
private Integer age;
private String name,id;
private Car cars[];
public User() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "User [name=" + name + ", pwd=" + pwd + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Car[] getCars() {
return cars;
}
public void setCars(Car[] cars) {
this.cars = cars;
}
}
package cn.hncu.domain;
public class Car {
private String id;
private String color;
private String name;
public Car() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Car [id=" + id + ", color=" + color + ", name=" + name + "]";
}
}
EL表達式是JSP 2.0規範中的一門技術 。因此,若想正確解析EL表達式,需使用支持Servlet2.4/JSP2.0技術的WEB服務器。
注意:有些Tomcat服務器如不能使用EL表達式
(1)升級成tomcat6
(2)在JSP中加入<%@ page isELIgnored=”false” %>
EL表達式保留關鍵字
所謂保留字的意思是指變量在命名時,應該避開上述的名字,以免程序編譯時發生錯誤