EL和JSTL

EL和JSTL

EL

概述

EL主要用于接收数据,相当于request.getAttribute()方法。

主要用于获取后端传递到页面的数据 和 运算

语法格式为:${表达式}

注意:

  1. 必须先经过servlet 进行数据存储,跳转到jsp页面 可以获取数据。
  2. jsp默认支持el表达式的。如果要忽略el表达式
    1. 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
    2. ${表达式} :忽略当前这个el表达式

语法

一、${域名称.键名}:从指定域中获取指定键的值
域名称:

  1. pageScope --> pageContext
  2. requestScope --> request
  3. sessionScope --> session
  4. applicationScope --> application(ServletContext)
  • 大部分请求我们都只直接使用 ${} 进行获取,会先在request中获取,如果没有再去sessio中,还没有再去servletContext中
    如果 request和session都有相同的属性,那么就需要通过域来指定 你要获取谁的

二、${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

三、获取对象、List集合、Map集合的值

  1. 对象:${域名称.键名.属性名}
    本质上会去调用对象的getter方法
  2. List集合:${域名称.键名[索引]}
  3. 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>

##运算

  1. 算数运算符: + - * /(div) %(mod)
  2. 比较运算符: > < >= <= == !=
  3. 逻辑运算符: &&(and) ||(or) !(not)
  4. 空运算符: 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) }

常用:

  1. split(str,",") 以指定字符分隔字符串
  2. length(hello) 内容长度
  3. endsWith(file.name,’.txt’) 判断是否是指定字符串结尾
  4. 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>
上一篇:[DUBBO] publishProvider interfaceName is empty.


下一篇:1.4字符串string