EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。
EL表达式的格式:${…},例如:${1+2}。
在使用EL表达式时,要求page指令的isELIgnored属性为false。这样JSP在编译成.java时,才不会忽略EL表达式。
如果你希望某个EL表达式被JSP编译器忽略,那么可以在EL表达式之前添加“\”,例如:\${1+2}。
运算符 |
说明 |
范例 |
结果 |
+ |
加 |
${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 |
小于 |
${3 |
TRUE |
|
>或gt |
大于 |
${3>5}或${3 gt 5} |
FALSE |
小于等于 |
${3 |
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 |
EL表达式运算测试
\${1+1}
${2-1}
${2*3}
${9/3}
${9%3}
${9 div3}
${9 mod3}
${9 == 3} ${"a" eq "a"}
${9 != 3} ${"a" ne "a"}
${9 > 3} ${9 < 3}
${9 lt 3} ${9 gt 3}
${9 >= 3} ${9 <= 3}
${9 >= 3&& 10 >= 3} ${9 <= 3 and 8<= 3}
${ !(9 >=33)} ${not (9 <= 3) }
${9 >= 3 || 10>= 3} ${9 <= 3 or 3 <=8}
${not empty""}
${empty null}
在EL表达式中,无需创建就可以使用的对象称之为EL隐藏(隐含、内置)对象。在EL中一共有11个隐藏对象,它们都与Map(key-value)相似。其中10个是Map,一个是 PageContext;
①param:param是Map类型!param对象可以用来获取参数,与request.getParameter()方法相同。Url key
注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。
②paramValues:paramValues是Map类型,当一个参数名,对应多个参数值时可以使用它。
③header:header是Map类型,用来获取请求头。
④headerValues:headerValues是Map类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。
⑤initParam:initParam是Map类型。它对应web.xml文件中的参数。
⑥cookie:cookie是Map类型,其中key是Cookie的名字,而值是Cookie对象本身。
使用EL表达式最为常用的就是获取域对象中保存的数据。例如:${pageScope.xxx},表示获取在pageContext保存的数据。当然${pageScope[‘xxx’]}是相同的!
pageScope:pageScope是Map类型,${pageScope.xxx}的功能相等与pageContext.getAttribute(“xxx”)。两者的区别在于,前者在数据不存在时返回空字符串,而后者返回null。
⑦requestScope:requestScope是Map类型,装载了request对象中的所有数据;
⑧sessionScope:sessionScope是Map类型,装载了session对象中的所有数据;
⑨applicationScope:applicationScope是Map类型,装载了application对象中的所有数据;
当EL中给出的不是隐藏对象时,表示在四个域中查找数据。例如:${a},表示
pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest,可以${pageContext.request}。
Expression |
说明 |
${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(); |
JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。既然是第三方的东西,那么就需要导包。但是如果你使用的是MyEclipse,那么MyEclipse会帮你导包的。
导入标签库需要使用taglib指令!
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fun" uri="http://java.sun.com/jsp/jstl/functions" %>
①c:out
输出aaa字符串常量
与${aaa}相同
当${aaa}不存在时,输出xxx字符串
当escapeXml为false,不会转换“”、“>”。这可能会受到JavaScript攻击。
②c:set
”a” value=”hello”/> 在pageContext中添加name为a,value为hello的数据。
”a” value=”hello” scope=”session”/> 在session中添加name为a,value为hello的数据。
2.2.2. c:if和c:choose(熟练)
①c:if
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
②c:choose
choose标签对应Java中的if/else if/else结构
when标签的test为true时,会执行这个when的内容。
当所有when标签的test都为false时,才会执行otherwise标签的内容
forEach当前就是循环标签了,可以进行
基本遍历:
下面例子中设置域变量i,初始值为1,结束值为10。即i的值从1遍历到10,包含10。
遍历数组:
遍历集合:
<%
List strs = new ArrayList();
strs.add("A");
strs.add("B");
strs.add("C");
strs.add("D");
request.setAttribute("strs",strs);
%>
遍历Map:
<%
Map map = new HashMap();
map.put("username","txjava");
map.put("password","tx123456");
map.put("age","20");
map.put("address","中国");
request.setAttribute("users",map);
%>
:
varStatus:
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
current当前这次迭代的(集合中的)项
index当前这次迭代从 0 开始的迭代索引
count当前这次迭代从 1 开始的迭代计数
first用来表明当前这轮迭代是否为第一次迭代的标志last用来表明当前这轮迭代是否为最后一次迭代的标志
<%
List users = new ArrayList();
users.add("A");
users.add("B");
users.add("C");
users.add("D");
request.setAttribute("users",users);
%>
index
count
first
last
value
如果对集合进行遍历,没有输出结果,那么请检查你的EL表达式内的变量名称是否正确
导入标签库需要使用taglib指令!
http://java.sun.com/jsp/jstl/format"%>\
value |
要显示的日期 |
是 |
无 |
type |
DATE, TIME, 或 BOTH |
否 |
date |
dateStyle |
FULL, LONG, MEDIUM, SHORT, 或 DEFAULT |
否 |
default |
timeStyle |
FULL, LONG, MEDIUM, SHORT, 或 DEFAULT |
否 |
default |
pattern |
自定义格式模式 |
否 |
无 |
timeZone |
显示日期的时区 |
否 |
默认时区 |
var |
存储格式化日期的变量名 |
否 |
显示在页面 |
scope |
存储格式化日志变量的范围 |
否 |
页面 |
属性 |
描述 |
是否必要 |
默认值 |
value |
要显示的数字 |
是 |
无 |
type |
NUMBER,CURRENCY,或 PERCENT类型 |
否 |
Number |
pattern |
指定一个自定义的格式化模式用与输出 |
否 |
无 |
currencyCode |
货币码(当type="currency"时) |
否 |
取决于默认区域 |
currencySymbol |
货币符号 (当 type="currency"时) |
否 |
取决于默认区域 |
groupingUsed |
是否对数字分组 (TRUE 或 FALSE) |
否 |
TRUE |
maxIntegerDigits |
整型数最大的位数 |
否 |
无 |
minIntegerDigits |
整型数最小的位数 |
否 |
无 |
maxFractionDigits |
小数点后最大的位数 |
否 |
无 |
minFractionDigits |
小数点后最小的位数 |
否 |
无 |
var |
存储格式化数字的变量 |
否 |
Print to page |
scope |
var属性的作用域 |
否 |
page |
属性 |
描述 |
是否必要 |
默认值 |
value |
要解析的数字 |
否 |
Body |
type |
NUMBER,,CURRENCY,或 PERCENT |
否 |
number |
parseLocale |
解析数字时所用的区域 |
否 |
默认区域 |
integerOnly |
是否只解析整型数(true)或浮点数(false) |
否 |
FALSE |
pattern |
自定义解析模式 |
否 |
无 |
timeZone |
要显示的日期的时区 |
否 |
默认时区 |
var |
存储待解析数字的变量 |
否 |
Print to page |
scope |
var属性的作用域 |
否 |
page |
使用方式如下:
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
Date date1 = new Date();
Double num1 = 12345.4567;
pageContext.setAttribute("date1",date1);
pageContext.setAttribute("num1",num1);
%>
日期格式化 (1):
日期格式化 (2):
日期格式化 (3):
日期格式化 (4):
日期格式化 (5):
日期格式化 (6):
日期格式化 (7):
格式化数字 (1):
格式化数字 (2):
格式化数字 (3):
格式化数字 (4):
格式化数字 (5):
格式化数字 (6):
格式化数字 (7):
格式化数字 (8):
格式化数字 (9):
美元 :
数字解析 (1) :
数字解析 (2) :
使用效果如下:
EL函数库是由第三方对EL的扩展,我们现在学习的EL函数库是由JSTL添加的。下面我们会学习JSTL标签库。
EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!当然,不只是JSTL可以定义EL函数库,我们也可以自定义EL函数库。
EL函数库中包含了很多对字符串的操作方法,以及对集合对象的操作。例如:${fn:length(“abc”)}会输出3,即字符串的长度。
因为是第三方的东西,所以需要导入。导入需要使用taglib指令!
<%@ taglib prefix="fn"uri="http://java.sun.com/jsp/jstl/functions" %>
String toUpperCase(String input): 将输入字符串转换为大写形式。
String toLowerCase(String input): 将输入字符串转换为小写形式。
int indexOf(String input, String substring): 返回子字符串在输入字符串中首次出现的位置的索引,如果未找到则返回-1。
boolean contains(String input, String substring): 判断输入字符串是否包含指定的子字符串,如果包含则返回true,否则返回false。
boolean containsIgnoreCase(String input, String substring): 不区分大小写地判断输入字符串是否包含指定的子字符串,如果包含则返回true,否则返回false。
boolean startsWith(String input, String substring): 判断输入字符串是否以指定的子字符串开始,如果是则返回true,否则返回false。
boolean endsWith(String input, String substring): 判断输入字符串是否以指定的子字符串结束,如果是则返回true,否则返回false。
String substring(String input, int beginIndex, int endIndex): 返回输入字符串中从beginIndex开始到endIndex结束的子字符串(不包括endIndex位置的字符)。
String substringAfter(String input, String substring): 返回输入字符串中指定子字符串之后的所有字符。如果未找到子字符串,则返回空字符串。
String substringBefore(String input, String substring): 返回输入字符串中指定子字符串之前的所有字符。如果未找到子字符串,则返回输入字符串本身。
String escapeXml(String input): 将输入字符串中的特殊字符转义,以便在XML中使用。例如,将""转换为">"等。
String trim(String input): 去除输入字符串两端的空白字符(如空格、制表符、换行符等)。
String replace(String input, String substringBefore, String substringAfter): 将输入字符串中所有出现的指定子字符串(substringBefore)替换为另一个子字符串(substringAfter)。
String[] split(String input, String delimiters): 根据指定的分隔符将输入字符串拆分为一个字符串数组。
int length(Object obj): 返回传入对象的长度(对于字符串,返回字符串的字符数)。注意,这个函数可以处理不同类型的对象,不仅仅是字符串。
String join(String array[], String separator): 使用指定的分隔符将字符串数组中的元素连接成一个字符串。
这些函数通常用于处理字符串数据,在编程中非常常见。它们可以方便地执行常见的字符串操作,如转换大小写、查找子字符串、截取子串、替换子串等。
使用方式:
<%
String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }
${fn:length(list) }
${fn:toLowerCase("Hello") }
${fn:toUpperCase("Hello") }
${fn:contains("abc", "a")}
${fn:containsIgnoreCase("abc", "Ab")}
${fn:contains(arr, "a")}
${fn:containsIgnoreCase(list, "A")}
${fn:endsWith("Hello.java", ".java")}
${fn:startsWith("Hello.java", "Hell")}
${fn:indexOf("Hello-World", "-")}
${fn:join(arr, ";")}
${fn:replace("Hello-World", "-", "+")}
${fn:join(fn:split("a;b;c;", ";"), "-")}
${fn:substring("0123456789", 6, 9)}
${fn:substring("0123456789", 5, -1)}
${fn:substringAfter("Hello-World", "-")}
${fn:substringBefore("Hello-World", "-")}
${fn:trim(" a b c ")}
${fn:escapeXml("")}
展示效果: