1.JSTL简介
> JSP2.0以后,不再推荐在页面中使用脚本片段和表达式
> 使用EL表达式去替换JSP表达式
> 使用标签来替换脚本片段
> 所谓的标签就是指以标签的形式去调用Java代码。
> JSTL是JSP的标准标签库
> JSTL的标准由sun公司定义,而由Apache公司实现
> 我们如果想在项目中使用JSTL,需要导入两个jar包:
taglibs-standard-impl-1.2.1.jar
taglibs-standard-spec-1.2.1.jar
> JSTL为我们提供了一些常用的标签,供我们日常开发使用(if 、 if...else 、遍历 、 日期格式化)
2.标签库
> core :核心标签库
核心标签库是JSTL中使用的最多的标签库,它为我们提供如if if else 遍历等等一些常用标签 ,核心标签库我们也称为c标签 .
> fn : 函数标签库
函数标签库里定义了一些字符串相关的操作,函数标签库需要结合EL表达式一起使用。
> fmt : 国际化/格式化标签库
fmt主要主要用来语言、日期、数字等内容的国际化操作。
> sql : 数据库标签库
用来在JSP中操作数据库,执行增删改查的操作(已淘汰)
> xml : xml标签库
用来在JSP中解析xml文档的(已淘汰)
3.JSTL的使用:
(1) 先使用taglib指令导入要使用的标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
taglib指令需要两个属性:
uri:标签库的唯一标识,通过uri来导入指定的标签库
prefix: 标签的前缀,通过前缀去使用标签
(2) 使用标签
<prefix:标签名></prefix:标签名>
4. JSTL原理:
实际上JSTL中标签最终都会转换为一段Java代码
每个JSTL中的标签实际上都对应着一个Java类,我们在使用标签时,实际上就是去调用的这个类的方法。
JSTL中有一个xml配置文件,专门来映射标签和标签处理器类之间关系
每一个标签库都有一个tld文件为其映射,标签的前缀,uri地址,标签名,标签的属性都是在tld文件中进行映射.
5.核心标签库
核心标签库也叫c标签,是JSTL中最常用的标签库,它里面定义了if else forEach等等这些标签。
使用方式:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--使用taglib将标签库引入到jsp页面中
uri是标签库的唯一标识,作用相当于java中的全类名
--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("name", "唐僧");
request.setAttribute("hello", "哈喽");
request.setAttribute("code", "<script>alert('hello')</script>");
%>
<%--out标签用来将一个属性在页面中输出 --%>
<%--value 用来指定要输出的内容,可以是一个EL表达式
default 可以指定一个默认值,当value值不存在时,将显示默认值
--%>
<c:out value="${hello }" default="该值为空"></c:out>
<hr />
<%-- ${code} --%>
<%--escapeXml:表示是否自动转义特殊字符,需要一个布尔值,默认值是true自动转义 --%>
<c:out value="${code}" escapeXml="true"></c:out>
<hr />
<%-- set标签用于向域中设置一个属性
var 指定一个属性名
value 指定一个属性值
默认是将属性设置进page域中
scope 指定要向哪个域中添加属性page request session application
--%>
<c:set var="age" value="沙和尚" scope="application"></c:set>
${sessionScope.age }
<hr />
<%--remove用于从域中移除一个属性
var用来指定要移除的属性名
默认会移除所有域中的指定属性
通过scope属性来指定要移除属性的域page request session application
--%>
<c:remove var="age" scope="application"/>
${applicationScope.age }
</body>
</html>
6.函数标签库
导入函数标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
函数标签库需要结合EL表达式一起使用。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String[] strs = {"a","b","c","d"};
//将strs放入到域中
pageContext.setAttribute("strs", strs);
%>
<!-- contains用来判断一个字符串中是否包含另一个 -->
fn:contains : ${fn:contains("hello","He") } <br />
<!-- 判断一个字符串中是否包含另一个并忽略大小写 -->
fn:containsIgnoreCase : ${fn:containsIgnoreCase("hello","He") }<br />
<!-- 转义特殊字符 -->
${fn:escapeXml("<script></script>") }<br />
<!-- join用于将一个字符数组转换为一个字符串 -->
${fn:join(strs,",") }<br />
<!-- 将一个字符串拆根据指定字符串分为一个字符串数组 -->
${fn:split("a,b,c,d",",")[2] }<br />
<!-- 将字母转换为小写 -->
${fn:toLowerCase("ABCD") }<br />
</body>
</html>
7.基础练习
例题1:if choose
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--
if标签和Java中的if功能类似
if标签需要一个test属性,test属性需要一个布尔值,可以接收一个EL表达式
如果test的值为true,则标签体中的内容会执行
如果test的值为false,则标签体中的内容不会执行
--%>
<c:if test="${empty param.username }">
<h3>请求输入一个用户名!</h3>
</c:if>
<c:if test="${!empty param.username }">
<h3>谁让你输入用户名的!</h3>
</c:if>
<hr />
<%--choose标签的作用和Java中的if else类似 --%>
<%--choose标签中可以有when子标签,它的用法和if标签一致 --%>
<%--choose标签中可以有otherwise标签,它的作用和else一样,当所有的when标签都没执行时,则otherwise执行 --%>
<%--在一个choose标签可以写多个when标签,但是只会有一个执行,当一个满足条件以后,其余将不再判断
choose标签只能有一个otherwise也可以没有
when和otherwise必须做完choose标签的子标签使用
--%>
<c:choose>
<c:when test="${param.score == 100 }">
<h3>恭喜您,考了100分!</h3>
</c:when>
<c:when test="${param.score >= 90 }">
<h3>你的分数是A级!</h3>
</c:when>
<c:when test="${param.score >= 80 }">
<h3>你的分数是B级!</h3>
</c:when>
<c:when test="${param.score >= 70 }">
<h3>你的分数是C级!</h3>
</c:when>
<c:when test="${param.score >= 60 }">
<h3>你的分数是D级!</h3>
</c:when>
<c:otherwise>
<h3>恭喜您,不及格!</h3>
</c:otherwise>
</c:choose>
</body>
</html>
例题2:forEatch
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--forEach标签可以实现一些for循环的功能 --%>
<%--1.用来遍历一组数
begin:表示遍历开始的位置,最小值是0,不能小于0
end:表示遍历结束的位置
for(int i=1 ; i<=10 ; i++)
var:指定的一个变量的名字
step:指定是遍历时的步长,每次自增的大小
forEach会执行多次,需要遍历几个数就执行几次
每次执行时,都会将当前遍历到的数,以var指定的名字,放入到域对象中
--%>
<c:forEach begin="1" end="10" step="1" var="index">
<a href="#">${index }</a>
</c:forEach>
<hr />
<%--遍历一个集合 --%>
<%
//创建一个List
List<String> list = new ArrayList<String>();
//向list添加数据
list.add("刘备");
list.add("关羽");
list.add("张飞");
list.add("赵云");
//将list放入到域中
pageContext.setAttribute("list", list);
%>
<hr />
<%--items:要遍历的集合,一般会使用EL表达式 --%>
<%--var:需要指定一个变量的名字 --%>
<%--遍历集合时,集合中有几个元素,则标签体就会执行几次,每次执行时都会讲集合中一个元素放入到page域中,使用var指定的属性名
for(String hero : list)
varStatus可以用来获取元素遍历的状态,我们可以为该属性指定一个名字
然后可以通过EL表达式获取到表示遍历状态的对象
last:判断当前元素是否是最后一个
first:判断当前元素是否是第一个
index:获取当前遍历元素的索引
count:获取当前遍历元素的次序
--%>
<c:forEach items="${list}" var="hero">
${hero}
</c:forEach>
<c:forEach items="${list}" var="hero" varStatus="vs">
${vs.last } -- ${vs.first } -- ${vs.count } -- ${vs.index } -- ${hero } <br />
</c:forEach>
<hr />
<%
//创建一个Map
Map<String,String> map = new HashMap<String,String>();
//向map中添加数据
map.put("name", "孙悟空");
map.put("age", "18");
map.put("address", "花果山");
//将map放入到域中
pageContext.setAttribute("map", map);
%>
<%--遍历map时,读取的是map中的键值对结构,我们可以通过对象.key获取键,对象.value获取值 --%>
<c:forEach items="${map}" var="user">
${user.key } -- ${user.value } <br />
</c:forEach>
</body>
</html>
例题3:url
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- url可以自动为绝对路径加上项目名 -->
<c:url value="/index.jsp"></c:url>
<a href='<c:url value="/index.jsp"></c:url>'>去主页</a>
<hr />
<!-- var属性可以指定一个变量的名字,如果指定了var,则url地址不会直接在页面中输出 -->
<!-- 而是以一个属性的方式,保存到域对象中,我们可以额通过EL表达式来获取 -->
<!-- 还可以使用param标签在地址中附加请求参数,可以自动对中文参数进行URL编码-->
<c:url value="/if.jsp" var="url">
<c:param name="username" value="sunwukong"></c:param>
<c:param name="age" value="18"></c:param>
<c:param name="teacher" value="唐僧"></c:param>
</c:url>
${url }
<hr />
<!-- redirect用于请求的重定向,url指定重定向的地址 -->
<!-- 它会自动为绝对路径加上项目名,所以这里就不用加了 -->
<c:redirect url="/forEach.jsp">
<c:param name="username" value="sunwukong"></c:param>
<c:param name="age" value="18"></c:param>
<c:param name="teacher" value="唐僧"></c:param>
</c:redirect>
</body>
</html>