/*
*作者:呆萌老师
*☑csdn认证讲师
*☑51cto高级讲师
*☑腾讯课堂认证讲师
*☑网易云课堂认证讲师
*☑华为开发者学堂认证讲师
*☑爱奇艺千人名师计划成员
*在这里给大家分享技术、知识和生活
*各种干货,记得关注哦!
*/
EL(表达式语言)
1 EL概述
1.1 EL的作用
EL: (Expression Language) 表达式语言:用于计算和输出存储在标志位置(page,request,session,application)的java对象的值。
JSP2.0要把html和css分离、要把html和javascript分离、要把Java脚本替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>
EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。
基本格式:${}
访问JavaBean:
第一种 点号记法:${Product.pid}; //常用
第二种 数组记法:${Product[“pid”]}
EL表达式先从request对象中取值 如果没有 就从session中取值,如果都取不到 就不显示,不会报空指针异常(即使调用不存在的对象的属性)。
EL表达式可以直接取对象中的私有属性,也不需要强转对象类型
1.2 EL的格式
格式:${…}
例如:${1 + 2}
1.3 关闭EL
如果希望整个JSP忽略EL表达式,需要在page指令中指定isELIgnored=”true”。
如果希望忽略某个EL表达式,可以在EL表达式之前添加“\”,例如:\${1 + 2}。
1.4 EL运算符
运算符
说明
范例
结果
+
加
${17+5}
22
-
减
${17-5}
12
*
乘
${17*5}
85
/或div
除
${17/5}或${17 div 5}
3
%或mod
取余
${17%5}或${17 mod 5}
2
==或eq
等于
${5==5}或${5 eq 5}
true
!=或ne
不等于
${5!=5}或${5 ne 5}
false
<或lt
小于
${3<5}或${3 lt 5}
true
>或gt
大于
${3>5}或${3 gt 5}
false
<=或le
小于等于
${3<=5}或${3 le 5}
true
>=或ge
大于等于
${3>=5}或${3 ge 5}
false
&&或and
并且
${true&&false}或${true and false}
false
!或not
非
${!true}或${not true}
false
||或or
或者
${true||false}或${true or false}
true
empty
是否为空
${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”}
true
1.5 EL不显示null
当EL表达式的值为null时,会在页面上显示空白,即什么都不显示。
2 EL表达式格式
先来了解一下EL表达式的格式!现在还不能演示它,因为需要学习了EL11个内置对象后才方便显示它。
3 EL内置对象
EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象。
3.1 域相关内置对象(重点)
域内置对象一共有四个:
如果在域中保存的是JavaBean对象,那么可以使用EL来访问JavaBean属性。因为EL只做读取操作,所以JavaBean一定要提供get方法,而set方法没有要求。
Person.java
publicclass Person {
private String name;
privateintage;
private String sex;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
public String getSex() {
returnsex;
}
publicvoid setSex(String sex) {
this.sex = sex;
}
}
编辑
全域查找:${person}表示依次在pageScope、requesScopet、sessionScope、appliationScope四个域中查找名字为person的属性。
3.2 请求参数相关内置对象
param和paramValues这两个内置对象是用来获取请求参数的。
编辑
注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。
编辑
编辑
3.3 请求头相关内置对象
header和headerValues是与请求头相关的内置对象:
编辑
3.4 应用初始化参数相关内置对象
3.5 Cookie相关内置对象
编辑
3.6 pageContext对象
pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest(),可以${pageContext.request}。也就是读取JavaBean属性!!!
EL表达式
说明
${pageContext.request.queryString}
pageContext.getRequest().getQueryString();
${pageContext.request.requestURL}
pageContext.getRequest().getRequestURL();
${pageContext.request.contextPath}
pageContext.getRequest().getContextPath();
${pageContext.request.method}
pageContext.getRequest().getMethod();
${pageContext.request.protocol}
pageContext.getRequest().getProtocol();
${pageContext.request.remoteUser}
pageContext.getRequest().getRemoteUser();
${pageContext.request.remoteAddr}
pageContext.getRequest().getRemoteAddr();
${pageContext.session.new}
pageContext.getSession().isNew();
${pageContext.session.id}
pageContext.getSession().getId();
${pageContext.servletContext.serverInfo}
pageContext.getServletContext().getServerInfo();
EL函数库
1 什么EL函数库
EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是由JSTL添加的。
EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!当然,不只是JSTL可以定义EL函数库,我们也可以自定义EL函数库。
EL函数库中包含了很多对字符串的操作方法,以及对集合对象的操作。例如:${fn:length(“abc”)}会输出3,即字符串的长度。
2 导入函数库
因为是第三方的东西,所以需要导入。导入需要使用taglib指令!
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
3 EL函数库介绍
<%@taglibprefix="fn"uri="http://java.sun.com/jsp/jstl/functions"%>
…
String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }<br/><!--3-->
${fn:length(list) }<br/><!--1-->
${fn:toLowerCase("Hello") }<br/><!-- hello -->
${fn:toUpperCase("Hello") }<br/><!-- HELLO -->
${fn:contains("abc", "a")}<br/><!-- true -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
${fn:contains(arr, "a")}<br/><!-- true -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
${fn:join(arr, ";")}<br/><!-- a;b;c -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->
${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
${fn:trim(" a b c ")}<br/><!-- a b c -->
${fn:escapeXml("<html></html>")}<br/><!-- <html></html> -->
4 自定义EL函数库
EduaskFuncations.java
package cn.eduask.el.funcations;
publicclass EduaskFuncations {
publicstatic String test() {
return"上海软件自定义EL函数库测试";
}
}
eduask.tld(放到classes下)
<?xmlversion="1.0"encoding="UTF-8"?>
<taglibxmlns="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>eduask</short-name>
<uri>http://www.eduask.cn/jsp/functions</uri>
<function>
<name>test</name>
<function-class>cn.eduask.el.funcations.EduaskFuncations</function-class>
<function-signature>String test()</function-signature>
</function>
</taglib>
index.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@taglibprefix="edu"uri="/WEB-INF/eduask.tld" %>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<h1>${edu:test() }</h1>
</body>
</html>