EL表達式html
基本語法:${EL表達式}java
1.獲取數據web
1)EL表達式只能獲取四大域中的數據。數組
2)EL表達式獲取的對象若是是null,頁面不會顯示數據。所以,EL表達式中永遠不會出現空指針異常。cookie
3).運算符和[]運算符session
.運算符能作的,[]運算符也能作。[]運算符能作,.運算符不必定能作。app
eg:dom
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="cn.lsl.domain.Person"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <jsp:useBean id="person" class="cn.lsl.domain.Person"></jsp:useBean> <jsp:setProperty property="name" name="person" value="lsl"/> ${person.name } <hr/> <% pageContext.setAttribute("pp","p1"); pageContext.setAttribute("pp","p2",PageContext.SESSION_SCOPE); request.setAttribute("pp","p3"); application.setAttribute("pp","p4"); %> ${pp } <hr/> ${person.address.city }<br/> ${person.class }<br/> ${person['class'] } <hr/> <!-- 獲取數組中指定的元素 --> <% String str[] = {"a","b","c"}; pageContext.setAttribute("str",str); %> ${str[1] } <hr/> <% List list = new ArrayList(); list.add("aa"); list.add("bb"); list.add("cc"); pageContext.setAttribute("list",list); %> ${list[2] } <hr/> <% Map map = new LinkedHashMap(); map.put("a","aaa"); map.put("b","bbb"); map.put("c","ccc"); pageContext.setAttribute("mm",map); %> ${mm.b } <hr/> <% Map map1 = new LinkedHashMap(); map1.put("1","aaa"); map1.put("2","bbb"); map1.put("3","ccc"); pageContext.setAttribute("mm1",map1); %> ${mm1["3"] } <hr/> <% Map map2 = new LinkedHashMap(); map2.put("a",new Person("lsl","男",true)); map2.put("b",new Person("zs","女",false)); map2.put("c",new Person("ls","女",true)); pageContext.setAttribute("mm2",map2); %> ${mm2["a"].name }<br/> ${mm2["b"].name }<br/> ${mm2.c.name }<br/> </body> </html>
2.數學邏輯運算jsp
empty運算符:若是判斷的對象是null或者空字符串,都返回true。對於集合對象自己不是 null,沒有任何元素,也返回true。函數
EL表達式不支持字符串鏈接操做。
eg:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <jsp:useBean id="person" class="cn.lsl.domain.Person"></jsp:useBean> ${empty p } <hr/> <% List list = new ArrayList(); list.add("aaa"); pageContext.setAttribute("list",list); %> ${empty list } <hr/> <% session.setAttribute("user","lsl"); %> ${empty user?"請登陸":"歡迎您:" }${user }<br/> <hr/> <% pageContext.setAttribute("gender","0"); %> ${gender == "0"?"女":"男" } <hr/> </body> </html>
3.獲取JSP的內置對象(11大EL內置對象)
難點,不要與JSP的內置對象和範圍名稱搞混
11大EL隱式對象中,其中一個是表示自身對象外,其他都是表示的Map結構
EL隱式對象名稱 Java類型 備註
pageContext javax.servlet.jsp.PageContext 與JSP中的內置對象徹底相同
剩餘的都是表明的Map集合
pageScope java.util.Map 表明着PageContext頁面範圍域那個Map
requestScope java.util.Map 表明着ServletRequest請求範圍域那個Map
sessionScope java.util.Map 表明着HttpSession會話範圍域那個Map
applicationScope java.util.Map 表明着ServletContext應用範圍域那個Map
param java.util.Map 表明着請求參數。key:請求參數的名稱。value:請求參數的值,它是 一個字符串。
paramValues java.util.Map 表明着請求參數。key:請求參數的名稱。value:請求參數的值,它是 一個字符串數組。
header java.util.Map 表明着請求消息頭。key:頭名稱。value:頭值,它是一個字符串。
headerValues java.util.Map 表明着請求消息頭。key:頭名稱。 value:頭值,它是一個字符串數組。
cookie java.util.Map 表明客戶端提交的Cookie的Map。key:cookie的name。value:cookie對象自己
initParam java.util.Map 表明着全局初始化參數(web.xml中context-param).key:參數名稱。value:參數值
eg:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="cn.lsl.domain.Person"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>EL的11大隱式對象</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <br/>-----------------pageContext內置對象-----------------<br/> ${pageContext }<br/> ${pageContext.request }<br/> <!-- EL表達式獲取當前應用名稱 --> ${pageContext.request.contextPath }<br/> <!-- EL表達式獲取HttpServletResponse採用的編碼 --> ${pageContext.response.characterEncoding }<br/> <br/>-----------------pageScope內置對象-----------------<br/> <% pageContext.setAttribute("pp","ppp"); pageContext.setAttribute("p",new Person("lsl","男",false)); %> ${pageScope.pp }<br/> ${pageScope.p.name }<br/> <hr/> <% pageContext.setAttribute("p1",new Person("lsl","男",false),PageContext.REQUEST_SCOPE); %> ${requestScope.p1.gender } <hr/> <% Person person = new Person("lsl","女",true); session.setAttribute("user",person); %> ${empty sessionScope.user?"請登陸":"歡迎您:" }${sessionScope.user.name } <hr/> ${param.username }<br/> ${param.password }<br/> <hr/> <!-- http://localhost:8080/EL/3.jsp?username=abc&username=def&password=123 --> ${paramValues.username[0] }<br/> ${paramValues.username[1] }<br/> ${paramValues.password[0] }<br/> <hr/> ${header["accept-encoding"] }<br/> ${headerValues["accept-encoding"][0] }<br/> <hr/> <!-- 取JSESSIONID這個cookie的名字 --> ${cookie["JSESSIONID"].name }<br/> ${cookie.JSESSIONID.value} <hr/> ${initParam.encoding } <!-- <context-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </context-param> --> </body> </html>
4.調用普通類的靜態方法(EL函數)
編寫步驟(自定義EL函數的編寫步驟即自定義標籤的編寫步驟):
a、編寫一個普通的java類,提供一個靜態方法
public class FunctionDemo { public static String toUpperCase(String str){ return str.toUpperCase(); } }
b、在JavaWeb應用的WEB-INF目錄下創建一個擴展名是tld(taglib definition)的XML文件(參考Tomcat中的示例)。內容以下:
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>myfn</short-name> <uri>http://www.lsl.cn/myfn</uri> <function><!-- 定義函數 --> <name>toUppercase</name> <function-class>cn.lsl.el.FunctionDemo</function-class> <function-signature> java.lang.String toUpperCase( java.lang.String ) </function-signature> </function> </taglib>
c、(可選步驟)前提是把tld文件放到了WEB-INF目錄下。
告知應用,tld文件和tld中的uri的對應。修改web.xml,增長如下內容:
<jsp-config> <taglib> <taglib-uri>http://www.lsl.cn/myfn</taglib-uri> <taglib-location>/WEB-INF/myfn.tld</taglib-location> </taglib> </jsp-config>
d、在JSP中使用
用taglib指令,引入自定義的EL函數庫
<%@ taglib uri="http://www.lsl.cn/myfn" prefix="myfn"%> ${myfn:toUppercase(p)}
eg:
FunctionDemo.java
package cn.lsl.el; public class FunctionDemo { public static String toUpperCase(String str){ return str.toUpperCase(); } }
myfn.tld
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <short-name>myfn</short-name> <uri>http://www.lsl.cn/myfn</uri> <function><!-- 定義函數 --> <name>toUppercase</name> <function-class>cn.lsl.el.FunctionDemo</function-class> <function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature> </function> </taglib>
web.xml
<jsp-config> <taglib> <taglib-uri>http://www.lsl.cn/myfn</taglib-uri> <taglib-location>/WEB-INF/myfn.tld</taglib-location> </taglib> </jsp-config>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.lsl.cn/myfn" prefix="myfn"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <% pageContext.setAttribute("p","abcdefg"); %> ${myfn:toUppercase(p)} </body> </html>
5.SUN提供的標準EL函數庫
JSTL標準標籤
須要導入JSTL的jar包。standard.jar jstl.jar
eg:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> ${fn:contains("abc","bc") }<br/> ${fn:substring("shit",3,100) }<br/> ${fn:split("www.lsl.cn",".")[0]}${fn:split("www.lsl.cn",".")[1]} ${fn:split("www.lsl.cn",".")[2]}<br/> ${fn:split("2013-04/26","-/")[0]}<br/> ${fn:split("2013-04/26","-/")[1]}<br/> ${fn:split("2013-04/26","-/")[2]}<br/> <hr/><br/> <% pageContext.setAttribute("h","<h1>haha</h1>"); %> ${fn:escapeXml(h)} </body> </html>
拓展:
Functions標籤庫中經常使用的16個函數的用法
1)fn:contains函數用於判斷在源字符串中是否包含目標字符串,其語法爲:
fn:contains(String source,String target) -------boolean;
2)fn:containsIgnoreCase函數用於判斷在源字符串中是否包含目標字符串,而且在判斷時忽略大小寫,其語法爲:
fn: containsIgnoreCase (String source,String target) -------boolean;
3)fn:startsWith函數用於判斷源字符串是否以指定的目標字符串開頭,其語法爲:
fn:startsWith(String source,String target) ----boolean
4)fn: endsWith函數用於判斷源字符串是否以指定的目標字符串結尾,其語法爲:
fn: endsWith (String source,String target) ----boolean
5)fn:indexOf函數用於在源字符串中查找目標字符串,並返回源字符串中最早與目標字符串匹配的第一個字符的索引,若是在源字符串中不包含目標字符串,就返回-1,源字符串中的第一個字符的索引爲0。 fn:indexOf函數的語法爲:
fn: indexOf (String source,String target) ----int
6)fn:replace函數用於把源字符串中的一部分替換爲另外的字符串,並返回替換後的字符串。fn:replace函數的語法爲:
fn: replace (String source,String before,String after) ----String
7)fn:substring函數用於獲取源字符串中的特定子字符串,它的語法爲:
fn:substring(String source,int beginIndex,int endIndex) ------String
8)fn:substringBefore函數用於獲取源字符串中指定子字符串以前的子字符串,其語法爲:
fn:substringBefore(String source,String target) ----String
9)fn: substringAfter函數用於獲取源字符串中指定子字符串以後的子字符串,其語法爲:
fn: substringAfter (String source,String target) ----String
10)fn:split函數用於將源字符串拆分爲一個字符串數組,其語法爲:
fn: split (String source,String delimiter) ----String[]
11)fn:join函數用於將源字符串數組中的全部字符串鏈接爲一個字符串,其語法爲:
fn:join(String source[],String separator) ----String
12)fn:toLowerCase函數用於將源字符串中的全部字符改成小寫,其語法爲:
fn:toLowerCase(String source) -----String
13)fn: toUpperCase函數用於將源字符串中的全部字符改成大寫,其語法爲:
fn: toUpperCase (String source) -----String
14)fn:trim函數用於將源字符串中的開頭和末尾的空格刪除,其語法爲:
fn:trim(String source) ----String
15)fn:escapeXml函數用於將源字符串中的字符「<」、「>」、「」」和「&」等轉換爲轉義字符,本書第1章的1.2節(HTML簡介)介紹了轉義字符的概念。fn:escapeXml函數的行爲與<c:out>標籤的escapeXml屬性爲true時的轉換行爲相同,fn:escapeXml函數的語法爲:
fn:escapeXml(String source) ----String
16)fn:length函數用於返回字符串中的字符的個數,或者集合和數組的元素的個數,其語法爲:
fn:length(source) ---- int
6. c:if
做用:判斷是否爲true,若是爲true,那麼標籤的主體內容就會顯示。
屬性:
test:必須的。要求必須是boolean的。支持表達式(EL或Java表達式)
var:保存test運算結果的變量
scope: 保存的域範圍。默認是page
eg:
<%@ page language="java" import="java.util.*" 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></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <% pageContext.setAttribute("result",true); %> <c:if test="${result}"> 真的 </c:if> <hr/> <% session.setAttribute("user","lsl"); %> <c:if test="${sessionScope.user==null}"> 對不起!請登陸 </c:if> <c:if test="${sessionScope.user!=null}"> 歡迎您:${sessionScope.user } </c:if> <hr/> <% List list = new ArrayList(); list.add("書"); session.setAttribute("cart",list); %> <c:if test="${empty sessionScope.cart}"> 對不起!您還不曾購物 </c:if> <c:if test="${!empty sessionScope.cart}"> 您購買了以下東西 </c:if> <hr/> <c:if test="${empty sessionScope.cart}" var="result" scope="page"></c:if> ${result } </body> </html>
7.c:forEach
遍歷:數組、List、Set、Map
屬性:
items:要遍歷的目標對象。支持表達式
var:變量名。指向當前遍歷的集合中的一個元素
begin:開始的索引(含)
end:結束的索引(含)
step:步長。默認是1
varStatus:取一個名字,引用了一個對象。
該對象有如下方法:
int getIndex():當前記錄的索引號。從0開始
int getCount():當前記錄的順序。從1開始
boolean isFirst():是不是第一條記錄
boolean isLast():是不是最後一條記錄
eg:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="cn.lsl.domain.Person"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <% String str[] = {"a","b","c"}; pageContext.setAttribute("str",str); %> <c:forEach items="${str}" var="s"> ${s }<br/> </c:forEach> <hr/> <% List list = new ArrayList(); list.add("aa"); list.add("bb"); list.add("cc"); pageContext.setAttribute("list",list); %> <c:forEach items="${list}" var="s"> ${s }<br/> </c:forEach> <hr/> <% Set set = new HashSet(); set.add("aaa"); set.add("bbb"); set.add("ccc"); pageContext.setAttribute("set",set); %> <c:forEach items="${set}" var="s"> ${s }<br/> </c:forEach> <hr/> <% Map map = new LinkedHashMap(); map.put("a","aaaa"); map.put("b","bbbb"); map.put("c","cccc"); pageContext.setAttribute("map",map); %> <c:forEach items="${map}" var="me"> ${me.key }==${me.value }<br/> </c:forEach> <hr/> <% String s1[] = {"a","b","c","d","e","f"}; pageContext.setAttribute("s1",s1); %> <c:forEach items="${s1}" var="s" begin="1" end="4" step="2"> ${s }<br/> </c:forEach> <hr/> <c:forEach items="${s1}" var="s" step="2"> ${s }<br/> </c:forEach> <hr/> <c:forEach begin="1" end="100" var="s"> ${s } </c:forEach> <hr/> <% List<Person> ps = new ArrayList<Person>(); ps.add(new Person("zs","1",true)); ps.add(new Person("ls","1",false)); ps.add(new Person("ww","0",false)); ps.add(new Person("xl","0",false)); ps.add(new Person("xq","1",true)); ps.add(new Person("xb","1",false)); ps.add(new Person("xj","1",false)); pageContext.setAttribute("ps",ps); %> <c:forEach items="${ps}" var="p"> ${p.name}:${p.gender=="1"?"男":"女"}:${p.married?"已婚":"未婚"}<br/> </c:forEach> <hr/> <table border="1" width="60%"> <tr> <th>索引</th> <th>順序</th> <th>第一個</th> <th>最後一個</th> <th>姓名</th> <th>性別</th> <th>婚姻</th> </tr> <c:forEach items="${ps}" var="p" varStatus="vs"> <tr> <td>${vs.index }</td> <td>${vs.count }</td> <td>${vs.first }</td> <td>${vs.last }</td> <td>${p.name }</td> <td>${p.gender=="1"?"男":"女"}</td> <td>${p.married?"已婚":"未婚"}</td> </tr> </c:forEach> </table> <hr/> <table border="1" width="60%"> <tr> <th>順序</th> <th>姓名</th> <th>性別</th> <th>婚姻</th> </tr> <c:forEach items="${ps}" var="p" varStatus="vs"> <tr bgcolor="${vs.index%2==0?'#CFCFCF':'#4D88AB' }"> <td>${vs.count }</td> <td>${p.name }</td> <td>${p.gender=="1"?"男":"女"}</td> <td>${p.married?"已婚":"未婚"}</td> </tr> </c:forEach> </table> </body> </html>