JSTL
JSTL简介
从JSP 1.1规范开始JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性,因此自定义标签在WEB应用中被广泛使用。许多WEB应用厂商都开发出了自己的一套标签库提供给用户使用,这导致出现了许多功能相同的标签,令网页制作者无所适从,不知道选择哪一家的好。为了解决这个问题,Apache Jakarta小组归纳汇总了那些网页设计人员经常遇到的问题,开发了一套用于解决这些常用问题的自定义标签库,这套标签库被SUN公司定义为标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL。使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WEB容器厂商按JSTL标签库的标准提供自己的实现,以获取最佳性能。由于JSTL是在JSP 1.2规范中定义的,所以JSTL需要运行在支持JSP 1.2及其更高版本的WEB容器上,例如,Tomcat 5.5。
jstl标签的组成:
标签库功能描述 标签库的URI 建议前缀
核心标签库 http://java.sun.com/jsp/jstl/core c
XML标签库 http://java.sun.com/jsp/jstl/xml x
国际化/格式化标签库 http://java.sun.com/jsp/jstl/fmt
fmt
数据库标签库 http://java.sun.com/jsp/jstl/sql
sql
EL自定义函数 http://java.sun.com/jsp/jstl/functions fn
核心标签库的介绍:
下面对JSTL的各个标签库进行简单的介绍:
(1)核心标签库中包含了实现WEB应用中的通用操作的标签。例如,用于输出一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。
(2)国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。
(3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。
(4)XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用于WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。
(5)JSTL中提供的一套EL自定义函数包含了JSP页面制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。
.JSTL的物理组成
完整的JSTL应包含SUN公司提供的jstl.jar 包和WEB容器产商提供的JSTL实现包,以Apache Jakarta 小组提供的JSTL实现包为例,完整的JSTL包含jstl.jar、standard.jar 和 xalan.jar 三个 jar 包。sun 公司提供的jstl.jar 包封装了 JSTL所要求的一些API 接口和类,Apache Jakarta 小组编写的 JSTL API 实现类封装在standard.jar包中。由于 JDK 在 JDK 1.5 版本中才引入了 XPath API,而 apache Jakarta 小组开发的 JSTL API 是在 JDK1.5 之前推出的,所以 apache Jakarta 小组在 JSTL 中使用的是他们自己开发的 XPath API,这些 API 封装在 xalan.jar 包中。Standard.jar 包中包括核心标签库、国际化/格式化标签库、数据库标签库中的标签和标准的EL自定义函数的实现类,xalan.jar 包中包括 JSTL 解析 XPath 的相关 API 类,standard标准库中存在对应对应的el自定定义的实现类,实现的过程的创建对象的形式
El表达的本质就是一堆的函数库,自定义的函数进行实现的获取值的操作。
jstl的标准使用环境:
1. 概念:JavaServer Pages Tag Library JSP标准标签库
* 是由Apache组织提供的开源的免费的jsp标签 <标签>
2. 作用:用于简化和替换jsp页面上的java代码
3. 使用步骤:
1. 导入jstl相关jar包
2. 引入标签库:taglib指令: <%@ taglib %>
3. 使用标签
4. 常用的JSTL标签
1. if:相当于java代码的if语句
1. 属性:
* test 必须属性,接受boolean表达式
* 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
* 一般情况下,test属性值会结合el表达式一起使用
2. 注意:
* c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
2. choose:相当于java代码的switch语句
1. 使用choose标签声明 相当于switch声明
2. 使用when标签做判断 相当于case
3. 使用otherwise标签做其他情况的声明 相当于default
3. foreach:相当于java代码的for语句
遍历:
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="cn.tedu.domain.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入jstl标准标签库 核心库中已经进行包含了对应的标签的标准库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<%--
jstl是对应的标签库,jstl中的标准标签库中存在封装了对应el自定义的函数,可以接收el表达式中的对象的获取关系
核心库中保存了对应的web常用的标签和标签库色关系
--%>
<title>jstl01,遍历标签和判断标签</title>
</head>
<body>
<%
/*编写一个集合,存储用户的信息*/
List<User> list=new ArrayList<User>();
list.add(new User("张三",18,new Date()));
list.add(new User("张四",18,new Date()));
list.add(new User("张五",18,new Date()));
list.add(new User("张六",18,new Date()));
/*将集合存储在request域中---存储对应的键值的表示情况*/
/*其中对应的数据 request等基于http协议的对象都是由服务器进行创建的,如果没有配置对应的服务器,
* 服务器中的api是不能够进行支持对象的操作的,基于http协议构建的服务器对象
* */
request.setAttribute("list",list);
%>
<%--实现隔行换色的效果--%>
<table align="center" width="50%">
<caption>个人信息表</caption>
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
<th>日期</th>
<%--实现对应的遍历的操作 var 临时对象 varStatus循环的状态 count表示循环的次数。index表示循环的索引--%>
<c:forEach items="${requestScope.list}" var="user" varStatus="s">
<%-- if标签,开始进行判断奇偶数的换色的效果 不存在对应的else标签--%>
<c:if test="${s.index%2==0}">
<%--偶数进行设定颜色--%>
<tr bgcolor="#ffe4c4">
<%--count是循环的次数--%>
<%--index是开始遍历的索引值--%>
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.date}</td>
</tr>
</c:if>
<c:if test="${s.count%2==0}">
<%--奇数进行设定颜色--%>
<tr bgcolor="#a52a2a">
<td>${s.count}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.date}</td>
</tr>
</c:if>
</c:forEach>
</table>
</body>
</html>
判断:if标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="cn.tedu.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl-if标签</title>
</head>
<body>
<%
/*存储对应的对象信息,在本次的页面中进行存储*/
/*编写一个集合,存储用户的信息*/
List<User> list=new ArrayList<User>();
list.add(new User("张三",18,new Date()));
list.add(new User("张四",18,new Date()));
list.add(new User("张五",18,new Date()));
list.add(new User("张六",18,new Date()));
/*将集合存储在request域中---存储对应的键值的表示情况*/
/*其中对应的数据 request等基于http协议的对象都是由服务器进行创建的,如果没有配置对应的服务器,
* 服务器中的api是不能够进行支持对象的操作的,基于http协议构建的服务器对象
*
*c:out标签表示的是对应的向浏览器进行输出对象的对象
*
*
* */
pageContext.setAttribute("list",list);
%>
<%--进行对象的获取,获取全部是偶数编号的对象--%>
<%--注意隐式对象的创建存在于,jsp中的隐式九大隐式对象和el中的域对象是不一样的el中全部是scope对象--%>
<%--判断集合list不为空--%>
<c:if test="${not empty pageScope.list}">
<%--进行遍历--%>
<c:forEach items="${pageScope.list}" var="user" varStatus="s">
${s.index}
${s.count}
${user.name}
${user.age}
${user.date}
</c:forEach>
</c:if>
</body>
</html>
choose,set map out remove标签:
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: SuperMan
Date: 9/26/2020
Time: 5:02 PM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl_choose标签</title>
</head>
<body>
<%
/*存储一个数字*/
pageContext.setAttribute("number",78);
/*存储一个集合列表对象*/
Map<String,String> map=new HashMap<>();
map.put("1","a");
map.put("2","b");
map.put("3","c");
map.put("4","d");
request.setAttribute("map",map);
%>
<%--
choose:相当于switch
when:相当于case ---->test是必须的属性,连接着对应的boolean表达式,正确则进行通过
otherwise:相当于default 默认值
--%>
<c:choose>
<c:when test="${pageScope.number==1}">星期一</c:when>
<c:when test="${pageScope.number==2}">星期二</c:when>
<c:when test="${pageScope.number==3}">星期三</c:when>
<c:when test="${pageScope.number==4}">星期四</c:when>
<c:when test="${pageScope.number==5}">星期五</c:when>
<c:otherwise>周末</c:otherwise>
</c:choose>
<c:set var="name" scope="request" value="${pageScope.number}"/>
<%--在jsp中可以进行设置域的属性--%>
<%--获取设置的域属性的值--%>
<%--演示移除域的属性
var:对应的属性的名称,操控域中的属性的名称
--%>
<c:remove var="name" scope="request"/>
${requestScope.name}
<%--进行遍历map容器对象通过键值对的方式进行遍历对象
el表达式的好处:当获取的值是空值哦的时候,返回的是空字符串,体验感更强
--%>
<c:forEach items="${requestScope.map}" var="map" varStatus="m" >
<%--开始通过键值对来进行获取对应的对象--%>
${m.index}:${map.key}:${map.value}
</c:forEach>
</body>
</html>
out标签:
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="cn.tedu.domain.User" %>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: SuperMan
Date: 9/26/2020
Time: 4:47 PM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl03_c:out</title>
</head>
<body>
<%
List<User> list=new ArrayList<User>();
list.add(new User("颤三",56,new Date()));
list.add(new User("颤三",56,new Date()));
list.add(new User("颤三",56,new Date()));
list.add(new User("颤三",56,new Date()));
/*存入当前的pageContext域中*/
pageContext.setAttribute("list",list);
%>
<%--实现使用c:out标签进行读取
value标签是确定的标签,是必须的标签,能存
--%>
<c:out value="${pageScope.list.get(1)}"/>
<c:out value="你好,世界"/>
</body>
</html>