一、简介
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中比较特别的隐含对象。例如我们要取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}
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和headerValuesheader 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
若同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。
3.initParam
initParam取得设定web站点的环境参数(Context)
例:String userid = (String)application.getInitParameter("userid");
可以使用 ${initParam.userid}来取得名称为userid
四、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>