EL概述
EL的作用
JSP2.0要把html和css分离、要把html和javascript分离、要把Java脚本替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>
EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。包含:取值和输出
EL的格式
格式:${…}
例如:${1 + 2}
关闭EL
如果希望整个JSP忽略EL表达式,需要在page指令中指定isELIgnored=”true”。
如果希望忽略某个EL表达式,可以在EL表达式之前添加“\”,例如:${1 + 2}。
EL运算符:算术 关系 逻辑
运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
+ | 加 | ${17+5} | 22 |
- | 减 | ${17-5} | 12 |
* | 乘 | ${17*5} | 85 |
/或div | 除 | 17 / 5 或 {17/5}或 17/5或{17 div 5} | 3 |
%或mod | 取余 | KaTeX parse error: Expected '}', got 'EOF' at end of input: {17%5}或{17 mod 5} | 2 |
==或eq | 等于 | 5 = = 5 或 {5==5}或 5==5或{5 eq 5} | true |
!=或ne | 不等于 | 5 ! = 5 或 {5!=5}或 5!=5或{5 ne 5} | false |
<或lt | 小于 | 3 < 5 或 {3<5}或 3<5或{3 lt 5} | true |
>或gt | 大于 | 3 > 5 或 {3>5}或 3>5或{3 gt 5} | false |
<=或le | 小于等于 | 3 < = 5 或 {3<=5}或 3<=5或{3 le 5} | true |
>=或ge | 大于等于 | 3 > = 5 或 {3>=5}或 3>=5或{3 ge 5} | false |
&&或and | 并且 | KaTeX parse error: Expected '}', got '&' at position 6: {true&̲&false}或{true and false} | false |
!或not | 非 | ! t r u e 或 {!true}或 !true或{not true} | false |
||或or | 或者 | ${true | |
empty | 是否为空 | e m p t y “ ” , 可 以 判 断 字 符 串 、 数 组 、 集 合 的 长 度 是 否 为 0 , 为 0 返 回 t r u e 。 e m p t y 还 可 以 与 n o t 或 ! 一 起 使 用 。 {empty “”},可以判断字符串、数组、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。 empty“”,可以判断字符串、数组、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。{not empty “ ”} | true |
EL不显示null
当EL表达式的值为null时,会在页面上显示空白,即什么都不显示
EL表达式格式
操作List和数组:${list[0]}、${arr[0]}
操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法
操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)。
EL内置对象
EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象,这哥们一个顶九个
pageScope
requestScope
sessionScope
applicationScope
param;
paramValues;
initParam;
header;
headerValues;
cookie;
pageContext
域相关内置对象(重点)
域内置对象一共有四个
pageScope:${pageScope.name}等同与pageContext.getAttribute(“name”);
requestScope:${requestScope.name}等同与request.getAttribute(“name”);
sessionScoep: ${sessionScope.name}等同与session.getAttribute(“name”);
applicationScope:${applicationScope.name}等同与application.getAttribute(“name”);
如果在域中保存的是JavaBean对象,那么可以使用EL来访问JavaBean属性。因为EL只做读取操作,所以JavaBean一定要提供get方法,而set方法没有要求。
全域查找:${person}表示依次在pageScope、requesScopet、sessionScope、appliationScope四个域中查找名字为person的属性。
请求头相关内置对象
header和headerValues是与请求头相关的内置对象:
header: Map<String,String>类型,用来获取请求头
headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。
应用初始化参数相关内置对象
initParam:initParam是Map<String,String>类型。它对应web.xml文件中的参数
Cookie相关内置对象
cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身。
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.remoteAddr} | pageContext.getRequest().getRemoteAddr(); |
${pageContext.session.id} | pageContext.getSession().getId(); |
${pageContext.servletContext.serverInfo} | pageContext.getServletContext().getServerInfo(); |
导入函数库
因为是第三方的东西,所以需要导入。导入需要使用taglib指令!
<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
需要导入jstl的jar包
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):
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):
JSTL概述
什么是JSTL
JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!
既然是第三方的东西,那么就需要导包
JSTL标签库
JSTL一共包含四大标签库
core:核心标签库,我们学习的重点
fmt:格式化标签库,只需要学习两个标签即可;
sql:数据库标签库,不需要学习了,它过时了
xml:xml标签库,不需要学习了,它过时了
导入标签库
导入标签库需要使用taglib指令!
<%@ taglib prefix=“c” uri=“http://java.sun.com/jstl/core” %>
这东西不用去背,可以把光标放到uri属性位置上,使用Alt+/来查看uri列表,找到其中包含jstl,并且包含core的就是了。
JSTL核心库
out和set(重点)
<c:out value=”aaa”/> | 输出aaa字符串常量 |
---|---|
<c:out value=”${aaa}”/> | 与${aaa}相同 |
<c:out value=”${aaa}” default=”xxx”/> | 当${aaa}不存在时,输出xxx字符串 |
<%request.setAttribute(“a”,“”);%><c:out value="${a }" default=“xxx” escapeXml=“false” /> | 当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。 |
set:set标签的var、value、scope是一组,而target、property、value是一组
<c:set var=”a” value=”hello”/> | 在pageContext中添加name为a,value为hello的数据。 |
---|---|
<c:set var=”a” value=”hello” scope=”session”/> | 在session中添加name为a,value为hello的数据。 |
<jsp:useBean id=“user” class=“cn.kgc.domain.User”/><c:set target=" u s e r " p r o p e r t y = " u s e r n a m e " v a l u e = " q d m m y 6 " / > < c : s e t t a r g e t = " {user }" property="username" value="qdmmy6"/><c:set target=" user"property="username"value="qdmmy6"/><c:settarget="{user }" property=“password” value=“123456”/><c:out value="${user }" /> | 给user的username属性赋值qdmmy6,给user的password属性赋值123456。 |
remove
<% pageContext.setAttribute(“a”, “pageContext”); request.setAttribute(“a”, “session”); session.setAttribute(“a”, “session”); application.setAttribute(“a”, “application”); %> <c:remove var=“a”/> <c:out value="${a }" default=“none”/> | 删除所有域中name为a的数据! |
---|---|
<c:remove var=“a” scope=”page”/> | 删除pageContext中name为a的数据! |
url
url标签会在需要URL重写时添加sessionId,带有输出功能
<c:url value="/"/> | 输出上下文路径:/day08_01/ |
---|---|
<c:url value="/" var=“a” scope=“request”/> | 把本该输出的结果赋给变量a。范围为request |
if和choose(重点)
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
<c:set var="a" value="hello"/>
<c:if test="${not empty a }">
<c:out value="${a }"/>
</c:if>
choose标签对应Java中的if/else if/else结构
when标签的test为true时,会执行这个when的内容。
当所有when标签的test都为false时,才会执行otherwise标签的内容
<c:set var="score" value="${param.score }"/>
<c:choose>
<c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>
<c:when test="${score >= 90 }">A级</c:when>
<c:when test="${score >= 80 }">B级</c:when>
<c:when test="${score >= 70 }">C级</c:when>
<c:when test="${score >= 60 }">D级</c:when>
<c:otherwise>E级</c:otherwise>
</c:choose>
forEach(重点)
forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10">
<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10" step="2">
<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>
还可以使用forEach来遍历数据或集合,遍历数组:
<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
<c:out value="name: ${item }"/><br/>
</c:forEach>
遍历List
<%
List<String> names = new ArrayList<String>();
names.add("zhangSan");
names.add("liSi");
names.add("wangWu");
names.add("zhaoLiu");
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
<c:out value="name: ${item }"/><br/>
</c:forEach>
遍历Map
<%
Map<String,String> stu = new LinkedHashMap<String,String>();
stu.put("number", "N_1001");
stu.put("name", "zhangSan");
stu.put("age", "23");
stu.put("sex", "male");
pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item" items="${stu }">
<c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>
forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。
count:int类型,当前以遍历元素的个数
index:int类型,当前元素的下标;
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素
current:Object类型,表示当前项目
<c:forEach var="item" items="${ns }" varStatus="vs">
<c:if test="${vs.first }">第一行:</c:if>
<c:if test="${vs.last }">最后一行:</c:if>
<c:out value="第${vs.count }行: "/>
<c:out value="[${vs.index }]: "/>
<c:out value="name: ${vs.current }"/><br/>
</c:forEach>
fmt标签库常用标签
fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。
格式化时间:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
......
<%
Date date = new Date();
pageContext.setAttribute("d", date);
%>
<fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss"/>
格式化数字:
<%
double d1 = 3.5;
double d2 = 4.4;
pageContext.setAttribute("d1", d1);
pageContext.setAttribute("d2", d2);
%>
<fmt:formatNumber value="${d1 }" pattern="0.00"/><br/>
<fmt:formatNumber value="${d2 }" pattern="#.##"/>