一、简介
1.1基本形式
${expression}
<%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.
1.2操作符
a.点操作符
b.[]操作符,可以取集合值(有索引的都可以取,set不行),还可以代替点运算符;
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例: ${user.My-Name}应当改为${user["My-Name"] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。
例: ${sessionScope.user[data]}中data 是一个变量
1.3 运算符
1.算术运算符有五个:+、-、*或$、/或div、%或mod
2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
3.逻辑运算符有三个:&&或and、||或or、!或not
4.其它运算符有三个:Empty运算符、条件运算符、()运算符
最常用的表达式:
为空判断:${empty param.name}
三元运算:${A?B:C}
算数运算:${A*(B+C)}
1.4取值过程
EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识符所对应的对象,则返回结果为空值;
二、作用
2.1.取值
例1:取对象
<%@page import="com.test.demo.Address"%> <%@ page import="com.test.demo.Student"%> <%@ 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>EL</title> </head> <body> <%-- El表达式主要获取Bean的属性值--%> <% Address address=new Address("432000","湖北省石家庄"); Student s=new Student("name",12,5000.90,address); request.setAttribute("stu", s); %> <%--直接写stu,会调用对象的toString()方法 --%> s: ${stu} <%--先调用 pageContext.findAttribute("stu");在4大域中查找是否有这个对象, 有的话,再调用这个对象的get方法;再将属性值转化为String输出到浏览器! --%> 姓名:${stu.name} <br/> 年龄:${stu.age} <br/> 薪资:${stu.salary} <br/> 邮编: ${stu.address.zipcode} <br/> 地址: ${stu.address.location} <br/> </body> </html></span>
例2:取集合
<%@ 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> </head> <body> <% List<String> list=new ArrayList<String>(); list.add("java1"); list.add("java2"); list.add("java3"); list.add("java4"); list.add("java5"); request.setAttribute("list", list); %> 取List集合第一个元素:${list[0]} <br/> <% Map<Integer,String> map=new LinkedHashMap<Integer,String>(); map.put(1, "java开发1"); map.put(2, "java开发2"); map.put(3, "java开发3"); map.put(4, "java开发4"); map.put(5, "java开发5"); //放在page域 pageContext.setAttribute("map", map); %> 取Map集合的第一个元素 :${map.1} <table> <tr> <th>书名</th> <th>操作</th> </tr> <c:forEach var="ss" items="${list}"> <tr> <td> ${ss}</td> <td>购买</td> </tr> </c:forEach> </table> <hr/> <table> <tr> <th>编号</th> <th>书名</th> <th>操作</th> </tr> <c:forEach var="entry" items="${map}" > <tr> <td>${entry.key}</td> <td>${entry.value}</td> <td>购买</td> </tr> </c:forEach> </table> </body> </html> </span>
2.2.执行运算
a.数值运算
b.逻辑运算
c.三目运算
d.空值判断empty
例:3:
<%@page import="com.test.demo.Student"%> <%@ page language="java" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <%--如果没有找到mm,返回空值,不是null --%> ${mm} <%--运算 5大运算符 +-*/%(求余) --%> 8+10=${8+10} <br/> 8-10=${8-10} <br/> 8*10=${8*10} <br/> 8/10=${8/10} <br/> 10%3=${10%3} <br/> 8*(6+1)=${8*(6+1)}<br/> <%--三目运算符 ,字符串不能比较大小--%> 8与9谁大: ${8>9?8:9}<br/> 8与9谁大: ${8>9?"8大":"9大"}<br/> a与b相等吗: ${"a"=="b"?true:false}<br/> <%--empty,如果对象为空或者null,返回true,否则返回false --%> <% Student stu=null; String str=null; String str1=""; List<String> list=new ArrayList<String>(); List<String> list1=null; List<String> list2=new ArrayList<String>(); list2.add("사랑해"); request.setAttribute("list", list); request.setAttribute("list1", list1); request.setAttribute("list2", list2); pageContext.setAttribute("stu", stu); session.setAttribute("str", str); session.setAttribute("str1", str1); %> <%--判断--%> Student对象是否为null: ${empty stu}<br/> <%--true--%> 字符串是否为null: ${empty str} <br/> <%--true--%> 字符串是否为空值: ${empty str1} <br/> <%--true--%> List集合是否为空: ${empty list} <br/> <%--true--%> List1集合是否为null: ${empty list1} <br/> <%--true--%> List2集合是否为null: ${empty list2} <br/> <%--false--%> <%--取值方式1 --%> List2:${list2[0]} <br/> <%--取值方式2,指定域范围 --%> List2:${requestScope.list2[0]} <br/> </body> </html> </span>
三、11个隐式对象
3.1 与范围有关的隐含对象
pageScope、requestScope、sessionScope 和applicationScope;
它们对应JSP的pageContext、request、session和application一样;
例如: ${sessionScope.username}
等价 session.getAttribute("username") 取得username的值
3.2 与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。3.3 pageContext
pageContext取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString} 取得请求的参数字符串
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath} 服务的web application 的名称
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
3.4 其他对象
1.cookie
cookie表示是一个Map<String,Cookie>,key是cookie对象的name,value是cookie对象本身,
${cookie.JSESSIONID.value}
2.header和headerValues四、EL函数
4.1.语法
${fn:function( arg1, arg2, arg3 …. argN)}
其中fn为前置名称(prefix),它必须和taglib 指令的前置名称一置,使用之前导入标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
4.2.功能
操作字符串(16个函数)
例4:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ 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> </head> <%--functions 函数16个 4大域对象:pageScope,requestScope,sessionScope,applicationScope --%> <body> <%--取到集合的长度 --%> <% ArrayList<String> arrayList1 = new ArrayList<String>(); arrayList1.add("aa"); arrayList1.add("bb"); arrayList1.add("cc"); session.setAttribute("arrayList1", arrayList1); String str4[]=new String[]{"aaa","bbb","ccc"}; request.setAttribute("str4", str4); %> 集合的长度: ${fn:length(sessionScope.arrayList1)} </span><span style="font-size:12px;"> <br /> 是否包含:${fn:contains("HELLO","H")} <br /> 是否包含子串(忽略大小写): ${fn:containsIgnoreCase("HELLO word", "llo")} <br /> 是否以指定子串结尾:${fn:endsWith("abc.txt", ".txt")} <br /> 把一些字符转成XML表示: ${fn:escapeXml("hello")} <%--没有匹配成功,返回 -1 --%> <br />aa位置: ${fn:indexOf("hello", "aa")} <br />el位置:${fn:indexOf("hello", "el")} <br /> 将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(str4, "-")} <br /> 替换字符串中指定的字符: ${fn:replace("hello java", "java", "sql")} <%--split返回的是一个字符串数组,要显示需要指定索引值 --%> <br /> 把字符串按照指定字符切分: ${fn:split("aa:bb:cc", ":")[0]} <br /> 判断字符串是否以某个子串开始 :${fn:startsWith("哈哈", "哈")} <br /> 获取子串 :${fn:substring("hello java", 0, 2)} <br /> 获取从某个字符所在位置之后的子串:${fn:substringAfter("hello","l")} <br /> 获取从某个字符所在位置之前的子串:${fn:substringBefore("hello","l")} <br /> toLowerCase 转为小写:${fn:toLowerCase("ABC")} <br /> toUpperCase 转为大写字符: ${fn:toUpperCase("abcdf")} <br /> trim 去除字符串前后的空格 :${fn:trim(" bbb ")} <br /> <%--if结构 --%> <c:if test="${fn:contains('HELLO','H')}"> 包含了 </c:if> </body> </html> </span>
4.3 Functions源码
public class Functions { //********************************************************************* // String capitalization /** * Converts all of the characters of the input string to upper case. */ public static String toUpperCase(String input) { return input.toUpperCase(); } /** * Converts all of the characters of the input string to lower case. */ public static String toLowerCase(String input) { return input.toLowerCase(); } //********************************************************************* // Substring processing public static int indexOf(String input, String substring) { if (input == null) input = ""; if (substring == null) substring = ""; return input.indexOf(substring); } public static boolean contains(String input, String substring) { return indexOf(input, substring) != -1; } public static boolean containsIgnoreCase(String input, String substring) { if (input == null) input = ""; if (substring == null) substring = ""; String inputUC = input.toUpperCase(); String substringUC = substring.toUpperCase(); return indexOf(inputUC, substringUC) != -1; } public static boolean startsWith(String input, String substring) { if (input == null) input = ""; if (substring == null) substring = ""; return input.startsWith(substring); } public static boolean endsWith(String input, String substring) { if (input == null) input = ""; if (substring == null) substring = ""; int index = input.indexOf(substring); if (index == -1) return false; if (index == 0 && substring.length() == 0) return true; return (index == input.length() - substring.length()); } public static String substring(String input, int beginIndex, int endIndex) { if (input == null) input = ""; if (beginIndex >= input.length()) return ""; if (beginIndex < 0) beginIndex = 0; if (endIndex < 0 || endIndex > input.length()) endIndex = input.length(); if (endIndex < beginIndex) return ""; return input.substring(beginIndex, endIndex); } public static String substringAfter(String input, String substring) { if (input == null) input = ""; if (input.length() == 0) return ""; if (substring == null) substring = ""; if (substring.length() == 0) return input; int index = input.indexOf(substring); if (index == -1) { return ""; } else { return input.substring(index+substring.length()); } } public static String substringBefore(String input, String substring) { if (input == null) input = ""; if (input.length() == 0) return ""; if (substring == null) substring = ""; if (substring.length() == 0) return ""; int index = input.indexOf(substring); if (index == -1) { return ""; } else { return input.substring(0, index); } } //********************************************************************* // Character replacement public static String escapeXml(String input) { if (input == null) return ""; return Util.escapeXml(input); } public static String trim(String input) { if (input == null) return ""; return input.trim(); } public static String replace( String input, String substringBefore, String substringAfter) { if (input == null) input = ""; if (input.length() == 0) return ""; if (substringBefore == null) substringBefore = ""; if (substringBefore.length() == 0) return input; StringBuffer buf = new StringBuffer(input.length()); int startIndex = 0; int index; while ((index = input.indexOf(substringBefore, startIndex)) != -1) { buf.append(input.substring(startIndex, index)).append(substringAfter); startIndex = index + substringBefore.length(); } return buf.append(input.substring(startIndex)).toString(); } public static String[] split( String input, String delimiters) { String[] array; if (input == null) input = ""; if (input.length() == 0) { array = new String[1]; array[0] = ""; return array; } if (delimiters == null) delimiters = ""; StringTokenizer tok = new StringTokenizer(input, delimiters); int count = tok.countTokens(); array = new String[count]; int i = 0; while (tok.hasMoreTokens()) { array[i++] = tok.nextToken(); } return array; } //********************************************************************* // Collections processing public static int length(Object obj) throws JspTagException { if (obj == null) return 0; if (obj instanceof String) return ((String)obj).length(); if (obj instanceof Collection) return ((Collection)obj).size(); if (obj instanceof Map) return ((Map)obj).size(); int count = 0; if (obj instanceof Iterator) { Iterator iter = (Iterator)obj; count = 0; while (iter.hasNext()) { count++; iter.next(); } return count; } if (obj instanceof Enumeration) { Enumeration enum_ = (Enumeration)obj; count = 0; while (enum_.hasMoreElements()) { count++; enum_.nextElement(); } return count; } try { count = Array.getLength(obj); return count; } catch (IllegalArgumentException ex) {} throw new JspTagException(Resources.getMessage("FOREACH_BAD_ITEMS")); } public static String join(String[] array, String separator) { if (array == null) return ""; if (separator == null) separator = ""; StringBuffer buf = new StringBuffer(); for (int i=0; i<array.length; i++) { buf.append(array[i]); if (i < array.length-1) buf.append(separator); } return buf.toString(); } }
五,jstl核心标签
1.重点标签
保存数据:<c:set></c:set>
获取数据:<c:out value=""></c:out>
单条件判断:<c:if test=""></c:if>
多条件判断:
<c:choose></c:choose>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
循环数据:
<c:forEach></c:forEach>
<c:forTokens items="" delims=""></c:forTokens>
重定向: <c:redirect></c:redirect>
例子:
<%@page import="com.test.demo.Student"%> <%@ 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> </head> <body> <%--使用标签 --%> <%--set标签 :保存数据(保存到域中)默认保存到page域 代替了setAttribute --%> <c:set var="name" value="rose" scope="request"></c:set> <% String msg = null; pageContext.setAttribute("msg",msg); %> ${msg } <br/> <%--out标签: 获取数据(从域中) default: 当value值为null时,使用默认值 escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认) 转义的含义,像普通文本一样输出; --%> <c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out> <hr/> <%--if标签 :单条件判断--%> <c:if test="${!empty msg}"> 条件成立 </c:if> <hr/> <%--choose标签+when标签+otherwirse标签: 多条件判断 --%> <c:set var="score" value="56"></c:set> <c:choose> <c:when test="${score>=90 && score<=100}"> 优秀 </c:when> <c:when test="${score>=80 && score<90}"> 良好 </c:when> <c:when test="${score>=70 && score<80}"> 一般 </c:when> <c:when test="${score>=60 && score<70}"> 及格 </c:when> <c:otherwise> 不及格 </c:otherwise> </c:choose> <%-- forEach标签:循环 --%> <% //List List<Student> list = new ArrayList<Student>(); list.add(new Student("rose",18)); list.add(new Student("jack",28)); list.add(new Student("lucy",38)); //放入域中 pageContext.setAttribute("list",list); //Map Map<String,Student> map = new HashMap<String,Student>(); map.put("100",new Student("mark",20)); map.put("101",new Student("maxwell",30)); map.put("102",new Student("narci",40)); //放入域中 pageContext.setAttribute("map",map); %> <hr/> <%-- begin="" : 从哪个元素开始遍历,从0开始.默认从0开始 end="": 到哪个元素结束。默认到最后一个元素 step="" : 步长 (每次加几) ,默认1 items="": 需要遍历的数据(集合) var="": 每个元素的名称 varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始) --%> <c:forEach items="${list}" var="student" varStatus="varSta"> 序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/> </c:forEach> <hr/> <c:forEach items="${map}" var="entry"> ${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/> </c:forEach> <hr/> <%-- forToken标签: 循环特殊字符串 --%> <% String str = "java-php-net-平面"; pageContext.setAttribute("str",str); %> <c:forTokens items="${str}" delims="-" var="s"> ${s }<br/> </c:forTokens> <%--redrict:重定向 --%> <c:redirect url="http://www.baidu.com"></c:redirect> </body> </html>