1. 快速入门
语法格式
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>EL表达式1</title>
</head>
<body>
<%
request.setAttribute("request_xxx", "request");
%>
${request_xxx}
</body>
</html>
四大域
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>EL表达式1</title>
</head>
<body>
<%
pageContext.setAttribute("xxx", "pageContext_xxx");
request.setAttribute("xxx", "request_xxx");
session.setAttribute("xxx", "session_xxx");
application.setAttribute("xxx", "application_xxx");
%>
${xxx}
</body>
</html>
注释第一句:
注释第二句:
注释第三句:
注释第四句:
因为会话还没有消失,所以不会显示application。如果EL表达式为空的话不会显示。
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<title>EL表达式1</title>
</head>
<body>
<%
pageContext.setAttribute("xxx_1", "pageContext_xxx");
request.setAttribute("xxx_2", "request_xxx");
session.setAttribute("xxx_3", "session_xxx");
application.setAttribute("xxx_4", "application_xxx");
%>
${xxx}<br>
${pageScope.xxx_1 }<br>
${requestScope.xxx_2 }<br>
${sessionScope.xxx_3 }<br>
${applicationScope.xxx_4 }
</body>
</html>
JavaBean导航
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ page import="com.rjxy.bean.*" %>
<!DOCTYPE html>
<html>
<head>
<title>javabean导航</title>
</head>
<body>
<%
Street s = new Street();
s.setCity("pd");
s.setDoor("xc");
Employee emp = new Employee();
emp.setId("666");
emp.setName("joncy");
emp.setStreet(s);
request.setAttribute("emp1", emp);
%>
${requestScope.emp1.street.city }<br>
${emp1.street.city }
</body>
</html>
注:requestScope.emp1.street.city就相当于request.getAttribute(“emp1”).getStreet().getCity(); 所以说只要对应的对象中再有一个getXxx()方法就能够调用,一定要符合规范,而这个规范就是Javabean的规范。
2. 定义
EL是JSP内置的表达式语言,也就是说能够直接用,不用导入包啥的!jsp2.0开始,不让再使用java脚本,而是使用el表达式和动态标签来替代java脚本!EL替代的是<%= … %>,也就是说,EL只能做输出,但是没有java脚本强大,既然推出EL表达式,应该宗旨就是使用标签代替所有的代码!但要注意EL表达式只能完成输出,要想进行设置等操作得用JSTL。
3. EL运算符
4. 11个内置对象
-
EL可以输出的东西都在11个内置对象中!11个内置对象,其中10个是Map!Map有其自己访问特点,map对象.key。pageContext不是map,它就是PageContext类型,1个项9个。
-
resquestScope、sessionScope、applicationScope、pageScope就是其中的四个
-
param:类型<String,String>对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数。等同于request.getParameter
<body> ${param.username } </body>
-
paramValues:<String,String[]>对应参数,它是一个Map,其中key参数名,value是多个参数值,适用于多值的参数。其返回的是一个集合,如果直接访问其名字,则打印哈希值。必须带有下标。如下图。
<body>
${param.username }<br/>
${paramValues.hobbies }<br/>
</body>
<body>
${param.username }<br/>
${paramValues.hobbies }<br/>
${paramValues.hobbies[0] }<br/>
</body>
- header:对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值请求头。下图这个例子很典型,User-Agent作为key值,有‘-’符号,EL表达式会将其解释为减法操作,所以这时候只能用另外一种访问方式。
<body>
${header['User-Agent'] }
</body>
- headerValues:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值请求头
- initParam:获取内的参数!
<body>
${header['User-Agent'] }<br/>
${initParam.param1 }
</body>
- cookie:Map<String,Cookie>类型,其中key是cookie的name,value是cookie对象。 ${cookie.username.value}
<body>
${cookie.JSESSIONID.value }<br/>
${cookie.JSESSIONID.name }<br>
${cookie.JSESSIONID }<br>
</body>
- pageContext:它是PageContext类型!${pageContext.request.contextPath}
<body>
${pageContext.request.contextPath}<br/>
${pageContext.request.session.id}<br/>
${pageContext.request.scheme}<br/>
${pageContext.request.method}<br/>
</body>
5. 函数库
EL的javabean导航刚才我们已经看过了,它不能调用方法。但导入JSTL提供的函数库可以。要想用它需要导入jar包
- 导入标签库
用WinRAR打开:
将它复制到外面用笔记本打开:
- JSTL提供的函数库
JSTL提供的EL函数 | 作用 |
---|---|
String toUpperCase(String input) | 把参数转换成大写 |
String toLowerCase(String input) | 把参数转换成小写 |
int indexOf(String input, String substring) | 从大串,输出小串的位置! |
boolean contains(String input, String substring) | 查看大串中是否包含小串 |
boolean containsIgnoreCase(String input, String substring) | 忽略大小写的,是否包含 |
boolean startsWith(String input, String substring) | 是否以小串为前缀 |
boolean endsWith(String input, String substring) | 是否以小串为后缀 |
String substring(String input, int beginIndex, int endIndex | 截取子串 |
String substringAfter(String input, String substring) | 获取大串中,小串所在位置后面的字符串 |
substringBefore(String input, String substring) | 获取大串中,小串所在位置前面的字符串 |
String escapeXml(String input) | 把input中“<”、">"、"&"、"’"、""",进行转义 |
String trim(String input) | 去除前后空格 |
String replace(String input, String substringBefore, String substringAfter) | 替换 |
String[] split(String input, String delimiters) | 分割字符串,得到字符串数组 |
int length(Object obj) | 可以获取字符串、数组、各种集合的长度! |
String join(String array[], String separator) | 联合字符串数组! |
- 案例
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试</title>
</head>
<body>
<%
String[] strs = {"a","b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }
<br> ${fn:toLowerCase("ABC") }
<br> ${fn:contains("ABC","a") }
<br> ${fn:indexOf("ABC","A") }
</body>
</html>
- 自定义函数库
-
写一个java类,类中可以定义0-N个方法,但必须是静态,而且必须是由返回值的
package com.test; public class MyFunction { public static String fun() { return "自定义函数库"; } }
-
写一个tld文件,在JSTL提供的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"> <description>user</description> <display-name>defineFunction</display-name> <tlib-version>1.0</tlib-version> <short-name>it</short-name> <uri>http://www.joncy.com/el/functions</uri> <function> <name>fun</name> <function-class>com.test.MyFunction</function-class> <function-signature>java.lang.String fun()</function-signature> </function> </taglib>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="it" uri="/WEB-INF/tlds/joncy.tld"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>测试</title> </head> <body> ${it:fun() } </body> </html>