EL和JSTL
EL
概述
EL主要用于接收数据,相当于request.getAttribute()方法。
主要用于获取后端传递到页面的数据 和 运算
语法格式为:${表达式}
注意:
- 必须先经过servlet 进行数据存储,跳转到jsp页面 可以获取数据。
- jsp默认支持el表达式的。如果要忽略el表达式
- 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
- ${表达式} :忽略当前这个el表达式
语法
一、${域名称.键名}:从指定域中获取指定键的值
域名称:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
- 大部分请求我们都只直接使用 ${} 进行获取,会先在request中获取,如果没有再去sessio中,还没有再去servletContext中
如果 request和session都有相同的属性,那么就需要通过域来指定 你要获取谁的
二、${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
三、获取对象、List集合、Map集合的值
- 对象:${域名称.键名.属性名}
本质上会去调用对象的getter方法 - List集合:${域名称.键名[索引]}
- Map集合:
${域名称.键名.key名称}
${域名称.键名[“key名称”]}
如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>El测试</title>
</head>
<body>
<h2>普通字符串</h2>
<%= request.getAttribute("name")%><br>
<%--两种获取数据方式是一样的--%>
${name}<br>
${requestScope.name}<br>
${sessionScope.name}<br>
<h2>单个对象 对象.名字</h2>
${user.username}
<h2>集合 对象[下标].名字</h2>
<%--下标越界获取不到--%>
${users[1].username}
<h2>集合 对象.get(下标).名字</h2>
<%--get(下标):超出下标时,报错,越界异常--%>
${users.get(1).username}
<h2>Map 对象.Key</h2>
${map.k1}
<h2>Map 对象["key"] </h2>
${map["k2"]}
</body>
</html>
##运算
- 算数运算符: + - * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>El测试</title>
</head>
<body>
<h2>运算支持</h2>
1+1 = ${1+1} <br>
10 /5 = ${10/5} -- 10 div 5 = ${10 div 5} <br>
10 %5 = ${10%5 } -- 10 mod 5 = ${10 mod 5} <br>
<h2>empty</h2>
<%--没有传递v1 肯定为empty true--%>
v1 : ${empty v1}<br>
<%--true--%>
v2 : ${empty v2}<br>
<%--true--%>
v3 : ${empty v3}<br>
<%--false--%>
v4 : ${empty v4}<br>
<%--false v5是null 肯定是空,但是not 就等于取反--%>
v5 : ${not empty v5}<br>
</body>
</html>
JSTL
概述
JSTL : JSP Standard Tag Library (JSP标准标签库)
在jsp中引入
核心标签库 <%@ 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” %>
核心标签库
主要就是逻辑判断和循环等,如 <c:if> , <c:forEach>
需要引入 <%@taglib prefic=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JstlCore</title>
</head>
<body>
<h2>普通字符串</h2>
${hello}
<c:out value="${hello}"></c:out><br>
<%--如果没有和以通过default设置默认值--%>
<c:out value="${hello_1}" default="没有数据"></c:out><br>
<%--也可以卸载标签中,设置默认值--%>
<c:out value="${hello_1}">没有数据</c:out>
<h2>带样式的字符串</h2>
<%--${h1}会进行解析,而out不会进行解析--%>
<c:out value="${h1}"></c:out><br>
<%--可以通过excapeXml进行设置,是否逃脱解析,true就是不解析,false是解析--%>
<c:out value="${h1}" escapeXml="false"></c:out><br>
<h2>设置和删除</h2>
<%--等于 session.setAttribute("password","root");--%>
<c:set value="root" var="password" scope="session"></c:set>
${password} ==
<%--等于 session.removeAttribute--%>
<c:remove var="password"></c:remove>
${password} --
<h2>流程控制 - if</h2>
<!-- 可以使用 > < 也可以使用 gt和lt eq >= <= == le ge != ne 没有else
eq == , lt < , gt > , ge >= , le <= , ne !=
-->
<c:if test="${v1 == v2 }">哇~是真的</c:if>
<c:if test="${v1 ne v2 }">哇~是真的</c:if>
<h2>流程控制 - c:hosse,c:when,c:otherwise</h2>
<%--相当于switch--%>
<c:choose>
<%--相当于case--%>
<c:when test="${v1 > v2 }">v1 大于 v2</c:when>
<c:when test="${v1 == v2 }">v1 等于 v2</c:when>
<%--相当于default--%>
<c:otherwise>v1 小于 v2</c:otherwise>
</c:choose>
<h2>循环 - forEach</h2>
<table border="1">
<tr>
<th>编号</th>
<th>姓名</th>
</tr>
<%--判断是否为空--%>
<c:choose>
<c:when test="${empty users}">
<tr>
<td colspan="2" align="center">没有找到合适的数据</td>
</tr>
</c:when>
<c:otherwise>
<%--说明不为空,遍历users 把每个元素赋值给user--%>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.username}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<h2>map遍历</h2>
<c:forEach items="${map}" var="entry">
${entry.key}:${entry.value}<br>
</c:forEach>
</body>
</html>
格式化标签库
最重要的就是时间格式化以及数字格式化,如 < fmt:formatNumber> < fmt:formatDate>
需要引入 <%@taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
如:
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>JstlFormat</title>
</head>
<body>
<h2>日期格式化</h2>
today(default) : ${today }<br>
<%--默认样式:2021-3-19--%>
today(default):<fmt:formatDate value="${today}"/><br>
today(type=time):<fmt:formatDate value="${today}" type="time"/><br>
today(type=both):<fmt:formatDate value="${today}" type="both"/><br>
today(dateStyle=short):<fmt:formatDate value="${today}" type="both" dateStyle="short"/><br>
today(dateStyle=medium):<fmt:formatDate value="${today}" dateStyle="medium"/>
today(dateStyle=long):<fmt:formatDate value="${today}" dateStyle="long"/><br>
today(dateStyle=full):<fmt:formatDate value="${today}" dateStyle="full"/><br>
today(pattern=yyyy/MM/dd HH:mm:ss SSS):<fmt:formatDate value="${today}" pattern="yyyy/MM月dd HH:mm:ss SSS"/><br>
<fmt:formatDate value="${today}" var='aa' pattern="yyyy/MM月dd HH:mm:ss SSS"/>
xxxxxxxxxxxxxxxxxxxxxxx ${aa}<br>
<h2>数字格式化</h2>
default:<fmt:formatNumber value="${n}"/><br>
pattern="###,###.#####":<fmt:formatNumber value="${n}" pattern="###,###.#####"/><br>
pattern="###,###.#####":<fmt:formatNumber value="${n}" pattern="###,###.0000"/><br>
<%--取消千分位--%>
groupingUsed="false":<fmt:formatNumber value="${n}" groupingUsed="false"/><br>
<%--设置最大整数 为 最小整数为 最大小数为 最小小数位--%>
<fmt:formatNumber value="${n}" maxIntegerDigits="15" minIntegerDigits="12" maxFractionDigits="6" minFractionDigits="4"/><br>
<h2>货币</h2>
type="currency":<fmt:formatNumber value="${n}" type="currency"/><br>
type="currency" currencySymbol="$":<fmt:formatNumber value="${n}" type="currency" currencySymbol="$"/><br>
<h2>百分比</h2>
<%--可以四舍五入--%>
<fmt:formatNumber value="${p}" type="percent" minFractionDigits="2" maxFractionDigits="2"/>
</body>
</html>
函数标签库
类似于常用类,就是一些封装好的方法。
使用的时候需要加上fn: 如 ${fn:length(hello) }
常用:
- split(str,",") 以指定字符分隔字符串
- length(hello) 内容长度
- endsWith(file.name,’.txt’) 判断是否是指定字符串结尾
- indexOf(‘filename.txt’,’.’) 搜索 . 出现的位置
需要引入 <%@taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
如:
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<html>
<head>
<title>JstlFn</title>
</head>
<body>
<%--长度--%>
${fn:length(hello)}<br>
<%--返回该元素的起始索引,未找到返回-1--%>
${fn:indexOf(hello," ")}
<%--以指定字符串分割,返回字符串数组--%>
<c:forEach items="${fn:split(str,\"#\")}" var="v">
${v}<br>
</c:forEach>
${tl:sayHi("张三") }<br>
${tl:sayHi(hello) }<br>
</body>
</html>
自定义函数标签库
java文件:
public class MyFunction {
//自定义函数必须是公共的静态的
public static String hi(String username){
return "嗨~"+username;
}
}
需要在web->WEB-INF中创建文件夹,文件后缀为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>tledu functions library</description>
<!-- 显示的名字 -->
<display-name>tledu functions</display-name>
<!-- 版本 -->
<tlib-version>1.0</tlib-version>
<!-- 前缀 -->
<short-name>tl</short-name>
<uri>http://www.tledu.com/functions</uri>
<function>
<!-- 调用的名字 -->
<name>sayHi</name>
<!-- 找到对应的类 -->
<function-class>com.tledu.function.MyFunction</function-class>
<!-- 调用类中的哪个方法 -->
<function-signature>java.lang.String hi(java.lang.String)</function-signature>
<!-- 案例 -->
<example>
${tl:sayHi(username)}
</example>
</function>
</taglib>
在jsp中调用:
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="tl" uri="http://www.tledu.com/functions"%>
<html>
<head>
<title>JstlFn</title>
</head>
<body>
<%--长度--%>
${fn:length(hello)}<br>
<%--返回该元素的起始索引,未找到返回-1--%>
${fn:indexOf(hello," ")}
<%--以指定字符串分割,返回字符串数组--%>
<c:forEach items="${fn:split(str,\"#\")}" var="v">
${v}<br>
</c:forEach>
${tl:sayHi("张三") }<br>
${tl:sayHi(hello) }<br>
</body>
</html>