上一篇博客的传送门:Servlet 入门到精通(二)
EL 表达式
概述
Expression Language 表达式语言,是一种在 JSP 页面获取数据的简单方式。只能获取数据,不能设置数据。主要用于替换和简化jsp页面中java代码的编写。
语法
在JSP页面的任何静态部分均可通过: ${expression}来获取到指定表达式的值。
需要注意的是,使用Idea创建jsp页面时需手动在page指令中允许使用EL表达式。
<%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %>
使用
容器相应操作
获取请求参数的值
获取initParam的值
对象操作
集合操作
cookie的操作
运算和常量部分
注意事项
- EL表达式不能出现在 Java 代码块、表达式块等JSP动态代码部分
- EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
- EL不会抛出空指针异常,只会不显示
- EL不会抛出数组越界异常,只会不显示
- EL不具有对字符串进行处理的能力
JSTL标准标签库
JSTL(Java server pages Standarded Tag Library,JSP 标准标签库)是由JCP(Javacommunity Proces)所制定的标准规范,它主要提供给 Java Web 开发人员一个标准通用的标签库,并由 Apache 的 Jakarta 小组来维护。开发人员可以利用这些标签取代JSP页面上的 Java代码,从而提高程序的可读性,降低程序的维护难度。
JSTL的分类
根据JSTL标签所提供的功能,一般将其分为5个类别:
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
JSTL的引入
maven项目中引入依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
如果是 Tomcat10需要引入
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>2.0.0</version>
</dependency>
具体页面中引入相应标签
<!--核心标签 核心标签是最常用的 JSTL标签-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!--格式化标签 格式化标签用来格式化并输出文本、日期、时间、数字-->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!--SQL标签 SQL标签库提供了与数据库进行交互的标签-->
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!--XML 标签 XML标签库提供了创建和操作XML文档的标签-->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
<!--JSTL函数 JSTL包含一系列标准函数,大部分是通用的字符串处理函数-->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
以下错误如何解决?
有时我们在使用JSTL标签库时会出现红色警告,并且我们的标签库快捷提示也无法使用,这个原因是因为我们对应的tld文件未下载成功或者未成功加载。以下跟着关为来告诉大家如何解决这样的问题。
1、找到Maven中JSTL依赖的位置
2、在Idea中点击File--->Setting
3、将uri书写到第一个文本框,选择c.tld路径到第二个文本框
4、这里JSTL就OK了
注意:还有一种方式,就是将 jstl 的依赖包复制到 Tomcat 的 lib 文件夹中。
JSTL的实现
容器操作
<!--
像容器中存放内容
var:Key
value:Value
scope:具体容器 page|request|session|application 默认page
-->
<h1>JSTL对容器的操作</h1>
<c:set var="A" value="abc" scope="session"/>
<c:set var="B" value="abcd" scope="application"/>
<c:set var="C" value="abcde" scope="request"/>
<!--从对应容器中删除具体的Key-->
<c:remove var="B" scope="application"/>
<!--获取具体容器中的内容 如果容器中不存在内容 显示default的内容-->
<c:out value="${A}" default="缺省值"/>
<c:out value="${B}" default="缺省值"/>
<c:out value="${C}" default="缺省值"/>
<h1>为什么不用EL</h1>
${A}..${B}..${C}
<h2>如果容器中没有这个值,EL表达式不显示</h2>
分支操作
<!--单层if分支结构 test:条件-->
<c:if test="${NUM%2==0}">
${NUM} 是偶数!
</c:if>
<hr/>
<!--多层if结构-->
<!--通过when和otherwise实现了if-else操作-->
<c:choose>
<c:when test="${NUM%2==0}">
${NUM} 是偶数!
</c:when>
<c:otherwise>
${NUM} 是奇数!
</c:otherwise>
</c:choose>
<hr/>
<c:choose>
<c:when test="${NUM==100}">
${NUM} ,完美!
</c:when>
<c:when test="${NUM>85}">
${NUM} ,优秀!
</c:when>
<c:when test="${NUM==60}">
${NUM} ,及格!
</c:when>
<c:otherwise>
${NUM} ,比较差!
</c:otherwise>
</c:choose>
循环操作
<!--
for循环
for(int i=1;i<=10;i++){
输出i;
}
var:变量名 begin:初始值 end:最终值 step:自增
step:必须大于0
-->
<c:forEach var="i" begin="1" end="10" step="1">
${i}
</c:forEach>
<hr/>
<%
// 这是一个集合
pageContext.setAttribute("LIST",new EmpService().findAll());
%>
<!--
foreach循环
var:迭代对象
items:需要迭代的集合
varStatus:游标变量 x.count x.index
-->
<c:forEach var="emp" items="${LIST}" varStatus="j">
${j.count}..${j.index}..${emp}..${emp.ename}<br/>
</c:forEach>
跳转操作
<!--
重定向操作
response.sendRedirect(3.jsp?a=111&b=admin);
-->
<c:redirect url="guanwei.jsp">
<c:param name="a" value="111"/>
<c:param name="b" value="admin"/>
</c:redirect>
格式化操作
<!--
时间格式化
value:需要格式化的日期
pattern:格式化规则
var:格式化之后的名字
-->
<fmt:formatDate value="${DATE}" pattern="yyyy年MM月dd日 HH:mm:ss" var="DATE2" scope="page"/>
${DATE}<br/>
${DATE2}<br/>
<hr/>
<!--
格式化数字
var:格式化之后的名字
value:需要格式化的数字
pattern:格式化规则
-->
<fmt:formatNumber var="num" pattern="#.##" value="${10/3}" scope="page"/>
JSTL相关API
因为时间关系,我们这里只讲解了常用了标签,需要了解更多的童鞋可以参考以下标签库,此API出自于菜鸟教程。
核心标签
标签 | 描述 |
---|---|
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |
格式化标签
标签 | 描述 |
---|---|
<fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 指定时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置request的字符编码 |
数据库标签
标签 | 描述 |
---|---|
<sql:setDataSource> | 指定数据源 |
<sql:query> | 运行SQL查询语句 |
<sql:update> | 运行SQL更新语句 |
<sql:param> | 将SQL语句中的参数设为指定值 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
XML标签
标签 | 描述 |
---|---|
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |
函数标签
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首尾的空白符 |
休息休息,继续我们Servlet的学习--Servlet 入门到精通(四)