E L(Expression Language) 目的:為了使JSP寫起來更加簡單。
1、獲取數據
${expression}
2、[ ]與.運算符
EL 提供“.“和“[ ]“兩種運算符來存取數據。
當要存取的屬性名稱中包含一些特殊字符,如.或?等並非字母或數字的符號,就一定要使用“[ ]“。例如:
${user.My-Name}應當改為${user["My-Name"] }
如果要動態取值時,就可以用“[ ]“來做,而“.“無法做到動態取值。例如:
${sessionScope.user[data]}中data 是一個變量
3、變量
EL存取變量數據的方法很簡單,例如:${username}。它的意思是取出某一范圍中名稱為username的變量。
因為我們並沒有指定哪一個范圍的username,所以它會依序從Page、Request、Session、Application范圍查找
使用范例:
<%@page import="org.eclipse.jdt.internal.compiler.lookup.ImportConflictBinding"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@page import="com.entity.People"%> <%@page import="java.util.*"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body>
<!-- 直接取數據 --> <% pageContext.setAttribute("info1", "page范圍屬性"); request.setAttribute("info1", "request范圍屬性"); session.setAttribute("info1", "session范圍屬性"); application.setAttribute("info1", "application范圍屬性"); %> ${info1} <hr>
<!-- 提交表單參數 --> <form action="el.jsp" method="psot"> name屬性:<input type="text" name="name" /> <br> age屬性:<input type="text" name="age" /> <br> <input type="submit" value="提交到el.jsp"> <hr>
<!-- paramValues提交一組參數 --> <form action="el.jsp" method="post"> <input type="checkbox" name="hobby" value="java語言" />java語言 <input type="checkbox" name="hobby" value="C語言" />C語言 <input type="checkbox" name="hobby" value="php語言" />php語言 <br> <input type="submit" value="提交到el.jsp"> <hr>
<!-- 對象操作 --> <% People zhangsan = new People(); zhangsan.setId(1); zhangsan.setName("zhangsan"); zhangsan.setAge(12); request.setAttribute("zhangsan", zhangsan); %> 編號:${zhangsan.id }<br> 姓名:${zhangsan.name }<br> 年齡:${zhangsan.age }<br> <hr>
<!-- list操作 --> <% People p1 = new People(); p1.setName("張三"); People p2 = new People(); p2.setName("李四"); List<People> list = new ArrayList<People>(); list.add(p1); list.add(p2); request.setAttribute("list",list); %> <!-- 取list指定位置的數據 --> ${list[0].name} ${list[1].name} <hr> <!-- 運算符操作 --> <% request.setAttribute("num1", 10); request.setAttribute("num2", 3); request.setAttribute("flog1", true); request.setAttribute("flog2", false); %> 算術運算符<br> num1=${num1 },num2=${num2 }<br> num1+num2=${num1+num2 }<br> num1-num2=${num1-num2 }<br> num1-num2=${num1-num2 }<br> num1*num2=${num1*num2 }<br> num1/num2=${num1/num2 }<br> num1%num2=${num1%num2 } <hr> 關系運算符<br> flag1=${flag1 },flag2=${flag2 }<br> flag1 && flag2: ${flag1 && flag2 }<br> flag1 || flag2: ${flag1 || flag2 }<br> !flag1: ${!flag1} } <hr> 三目運算符<br> num1>num2: ${num1>num2?"yes":"no" } <hr> 判斷空操作:${empty num1 } EL表達式中使用二元表達式<hr> <% session.setAttribute("user",new People("張三")); %> ${user==null? "對不起,您沒有登陸 " : user.username} </body> </html>
在對對象進行操作時要用<%@page import%>把包引進來
<%=user.getAddr( ) %>等價於${user.addr}
el.jsp頁面范例:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> this is el.jsp <% request.setCharacterEncoding("utf-8"); %> <!--表單提交過來的參數 --> 姓名:${param.name}<br> 年齡:${param.age}<hr> <!-- 提交過來的一組參數 --> 技能1:${paramValues.hobby[0]}<br> 技能2:${paramValues.hobby[1]}<br> 技能3:${paramValues.hobby[2]} </body> </html>
4、表達式內置對象說明
EL表達式語言中定義了11個隱含對象,使用這些隱含對象可以很方便地獲取web開發中的一些常見對象,並讀取這些對象的數據。
語法:${隱式對象名稱}:獲得對象的引用
序號 | 隱含對象名稱 | 描 述 |
1 | pageContext | 對應於JSP頁面中的pageContext對象(注意:取的是pageContext對象。) |
2 | pageScope | 代表page域中用於保存屬性的Map對象 |
3 | requestScope | 代表request域中用於保存屬性的Map對象 |
4 | sessionScope | 代表session域中用於保存屬性的Map對象 |
5 | applicationScope | 代表application域中用於保存屬性的Map對象 |
6 | param | 表示一個保存了所有請求參數的Map對象 |
7 | paramValues | 表示一個保存了所有請求參數的Map對象,它對於某個請求參數,返回的是一個string[] |
8 | header | 表示一個保存了所有http請求頭字段的Map對象,注意:如果頭里面有“-” ,例Accept-Encoding,則要header[“Accept-Encoding”] |
9 | headerValues | 表示一個保存了所有http請求頭字段的Map對象,它對於某個請求參數,返回的是一個string[]數組。注意:如果頭里面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”] |
10 | cookie | 表示一個保存了所有cookie的Map對象 |
11 | initParam | 表示一個保存了所有web應用初始化參數的map對象 |
示例代碼:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>el隱式對象</title> </head> <body> 1、pageContext對象:獲取JSP頁面中的pageContext對象 <br /> ${pageContext} <hr> 2、pageScope對象:從page域(pageScope)中查找數據 <br /> <% pageContext.setAttribute("name", "張三"); //map %> ${pageScope.name} <hr> 3、requestScope對象:從request域(requestScope)中獲取數據 <br /> <% request.setAttribute("name", "李四"); //map %> ${requestScope.name} <hr> 4、sessionScope對象:從session域(sessionScope)中獲取數據 <br /> <% session.setAttribute("user", "sf1"); //map %> ${sessionScope.user} <hr> 5、applicationScope對象:從application域(applicationScope)中獲取數據 <br /> <% application.setAttribute("user", "sf2"); //map %> ${applicationScope.user} <hr> 6、param對象:獲得用於保存請求參數map,並從map中獲取數據 <br /> ${param.name} <!-- 此表達式會經常用在數據回顯上 --> <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post"> <input type="text" name="username" value="${param.username}"> <input type="submit" value="注冊"> </form> <hr> 7、paramValues對象:paramValues獲得請求參數//map{"",String[]} <br /> <!-- http://localhost:8080/JavaWeb_EL_Study_20140826/ELDemo03.jsp?like=aaa&like=bbb --> ${paramValues.like[0]} ${paramValues.like[1]} <hr> 8、header對象:header獲得請求頭 <br /> ${header.Accept} <br /> <%--${header.Accept-Encoding} 這樣寫會報錯 測試headerValues時,如果頭里面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”] --%> ${header["Accept-Encoding"]} <hr> 9、headerValues對象:headerValues獲得請求頭的值 <br /> <%--headerValues表示一個保存了所有http請求頭字段的Map對象,它對於某個請求參數,返回的是一個string[]數組 例如:headerValues.Accept返回的是一個string[]數組 ,headerValues.Accept[0]取出數組中的第一個值 --%> ${headerValues.Accept[0]} <br /> <%--${headerValues.Accept-Encoding} 這樣寫會報錯 測試headerValues時,如果頭里面有“-” ,例Accept-Encoding,則要headerValues[“Accept-Encoding”] headerValues["Accept-Encoding"]返回的是一個string[]數組,headerValues["Accept-Encoding"][0]取出數組中的第一個值 --%> ${headerValues["Accept-Encoding"][0]} <hr> 10、cookie對象:cookie對象獲取客戶機提交的cookie <br /> <!-- 從cookie隱式對象中根據名稱獲取到的是cookie對象,要想獲取值,還需要.value --> ${cookie.JSESSIONID.value} //保存所有cookie的map <hr> 11、initParam對象:initParam對象獲取在web.xml文件中配置的初始化參數 <br /> <%-- <!-- web.xml文件中配置初始化參數 --> <context-param> <param-name>xxx</param-name> <param-value>yyyy</param-value> </context-param> <context-param> <param-name>root</param-name> <param-value>/JavaWeb_EL_Study_20140826</param-value> </context-param> --%> <%--獲取servletContext中用於保存初始化參數的map --%> ${initParam.xxx} <br /> ${initParam.root} </body> </html>
RegisterServlet的代碼如下:
package com.web.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RegisterServlet extends HttpServlet { /* * 處理用戶注冊的方法 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、接收參數 String userName = request.getParameter("username"); /** * 2、直接跳轉回/ELDemo03.jsp頁面,沒有使用request.setAttribute("userName", userName)將userName存儲到request對象中 * 但是在ELDemo03.jsp頁面中可以使用${param.username}獲取到request對象中的username參數的值 */ request.getRequestDispatcher("/ELDemo03.jsp").forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
注意:
測試header和headerValues時,如果頭里面有“-” ,例Accept-Encoding,則要header["Accept-Encoding"]、headerValues["Accept-Encoding"]
測試cookie時,例${cookie.key}取的是cookie對象,如訪問cookie的名稱和值,須${cookie.key.name}或${cookie.key.value}
使用EL調用Java方法
EL表達式語法允許開發人員開發自定義函數,以調用Java類的方法。語法:${prefix:method(params)}
在EL表達式中調用的只能是Java類的靜態方法,這個Java類的靜態方法需要在TLD文件中描述,才可以被EL表達式調用。
EL自定義函數用於擴展EL表達式的功能,可以讓EL表達式完成普通Java程序代碼所能完成的功能。
是否啟用EL表達式:
<%@ page isELIgnored="true" %> 表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默認的啟用EL語言