一、JSTL标签库介绍
- JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。
- JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的。使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码
二、JSTL库的安装
- JSTL库的安装:Apache Tomcat安装JSTL(jstl属于apache,在以后的学习过程中大都是apache组织的) 库步骤如下:
- 从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。
官网下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ - 下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件直接扔到 /WEB-INF/lib/ 下(我的是myeclipse2017自带的jstl 1.2.2 Library)
- 在jsp文件中使用taglib指令导入jstl核心标签库(<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>)
三、JSTL标签库的分类
- 核心标签(用得最多)
- 国际化标签(I18N格式化标签)
- JSTL函数(EL函数)JavaWeb之el表达式总结
- 数据库标签(SQL标签,很少使用)
- XML标签(几乎不用)
四、核心标签库使用说明
从功能上大致可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。
- (1)表达式控制标签:out标签、set标签、remove标签、catch标签
- (2)流程控制标签:if标签、choose标签、when标签、otherwise标签
- (3)循环标签:forEach标签、forTokens标签
- (4)URL操作标签:import标签、url标签、redirect标签、param标签
五、核心标签库的具体说明
5.1 <c:out>标签的介绍
5.1.1、<c:out>标签的功能
- <c:out>的作用主要使用来进行数据对象(字符串和表达式等)的输出。
- 在使用java脚本的时候,常用的输出语法是:<% out.prinnt(“字符串”)%>或者<%=表达式%>,jstl的出现就是为了避免在jsp中减少使用java代码,因此在jsp标签中,数据对象的输出就使用<c:out>进行代替。
<c:out value="字符串">
<c:out value="EL表达式">
5.1.2、<c:out>标签的属性
属性 | 描述 |
---|---|
value | 指定要输出的内容值 |
escapeXml | 指定是否(>,<,&,、," 等特殊字符)进行HTML编码转化后再进行输出,默认值为true |
default | 指定当value的值为null时an所输出的对象 |
5.1.3、<c:out>标签的语法
有两种语法格式:
-
【语法一】<c:out value=“要显示的数据对象” [escapeXml=“true|false”] [default=“默认值”] >
-
【语法二】<c:out value=“要显示的数据对象” [escapeXml=“true|false”] >默认值</c:out>
-
这两种方式没有本质上的区别。[]表示不是必须的(可有可无)
5.1.4、<c:out>的使用案例
<%@ 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>c:out标签</title>
</head>
<body>
<!--(1)value属性,直接输出一个值字符串 -->
<H3>(1)value属性,直接输出一个字符串</H3>
1、
<c:out value="hello"></c:out>
<br>
<!-- (2)结合el表达式一起使用,page、session和application同request类似 -->
<H3>(2)结合EL表达式的JSTL标签的使用:</H3>
<%
request.setAttribute("name", "tom");
%>
2、
<c:out value="${ name}"></c:out>
<br>
<!-- (3)escapeXml="false"时表示html标签不进行转义,按照原样输出 -->
<H3>(3)escapeXml属性</H3>
<!-- escapeXml="false"时表示html标签不进行转义,按照原样不进行转义输出为true否则相反 -->
3.1、
<c:out value="<font color='red'>我是jstl标签库定义的转义之后输出</font>"
escapeXml="true"></c:out>
<br> 3.2、
<c:out value="<font color='red'>我是jstl标签库定义的维持原样输出</font>"
escapeXml="false"></c:out>
<br> 3.3、
<c:out
value="<a href='https://blog.csdn.net/SYJ_1835_NGE'>点击转跳到追梦逐星的CSDN</a>"
escapeXml="true"></c:out>
<br> 3.4、
<c:out
value="<a href='https://blog.csdn.net/SYJ_1835_NGE'>点击转跳到追梦逐星的CSDN</a>"
escapeXml="false"></c:out>
<H3>4、default属性,默认值的使用</H3>
<!-- 设定了默认值,el表达式${null}返回的是一个空值,所以有默认值存在的直接输出默认值 -->
4.1、
<c:out value="${null}" default="我是默认值"></c:out>
<br>
4.2、
<c:out value="${null}"></c:out>
<br>
4.3、
<c:out value="${null}"> 不指定default的默认值 </c:out>
<br>
4.4、
<c:out value="${null}"></c:out>
<br>
</body>
</html>
运行结果展示:
5.2 <c:set>标签的介绍
5.2.1<c:set>标签的功能
- <c:set>标签用于把某一个对象存在指定的域范围内,或者将某一个对象存储到Map集合中或者存储到JavaBean对象中。
5.2.2<c:set>标签的属性
属性 | 描述 |
---|---|
value | 用于指定属性值 |
var | 设置web域属性的名称(就是一个临时变量) |
target | 指定要为设置属性的对象,这个对象一般是javabean(person)对象或者是Map(map)集合 |
property | 指定要为当前对象设定的属性名称 |
scope | 用于指定的web域 |
5.2.3、<c:set>标签的语法
- 【语法一】<c:set var=“name1” value=“值1” [scope=“request|page|session|qpplication”] > </c:out>
- 解释:在指定范围内(scope),将值“值1”,赋值给变量name1。
- 【语法二】<c:set var=“name2” [scope=“request|page|session|qpplication”] >值2</c:out>
- 解释:在指定范围内(scope),将值“值1”,赋值给变量name1。
- 【语法三】<c:set target=“javabeand对象” value=“值3” property=“name3”></c:set>
- 解释:将javabean对象(eg:person1)属性值为(eg:username1)name3的赋值为“值3”,相当于setUserneme(“值3”);
- 【语法四】<c:set target=“javabeand对象” property=“name4”>值4</c:set>
- 解释:将javabean对象(eg:person2)属性值为(eg:username2)name4的赋值为“值4”,相当于setUserneme(“值4”);
- 【语法一】和【语法二】、【语法三】和【语法四】含义是一样知识value的位置不同,【语法一】和【语法二】在scope范围内进行存储值,【语法三】和【语法四】是在给指定的javabean进行赋值
5.2.4、<c:set>的使用案例
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:useBean id="s" class="cn.syj.Myclass.Bean.Student"></jsp:useBean>
<!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>c:set标签</title>
</head>
<body>
<H3>1、scope属性</H3>
<!-- 通过指定的scope进行赋值操作 -->
<c:set var="p" value="JSTL:追梦逐星" scope="page"></c:set>
${p }<br>
不是jstl标签的:<br>
<%
request.setAttribute("p", "java脚本实现:追梦逐星");
%>
<%=request.getAttribute("p") %>
<hr>
<h3>2、value 和 var</h3>
<!-- var就是一个变量,vlaue就是变量所赋予的值 -->
<c:set value="我是c:set标签的value属性" var="name"></c:set>
${name }
<br>
<hr>
<h3>3、target、property属性</h3>
<!-- target目标对象。property是指定那个属性 -->
<c:set target="${s}" property="password"> abcdef </c:set>
el表达式:${s.password }
<br> c:out标签的值:
<c:out value="${s.password }"></c:out>
<br>
<hr>
<h3>4、c:set操作map集合</h3>
<%
Map map = new HashMap();
request.setAttribute("map", map);
%>
<!-- 将属性为date值为zmzx设置存储到map集合中 -->
<c:set target="${map }" value="zmzx" property="date"></c:set>
${map.date}
</body>
</html>
运行结果展示:
5.3<c:remove>标签介绍
5.3.1、<c:remove>标签的功能
- <c:remove>标签主要用来从指定的JSP范围内移除指定的变量。
5.3.2、<c:remove>标签的属性
属性 | 描述 |
---|---|
var | 需要移除的指定变量 |
scope | 用于指定属性所在的web域 |
5.3.3、<c:remove>标签的语法
- <c:remove var=“temp” [scope=“page|request|session|application”] />
- 其中var属性是必须的,scope可以以省略
5.3.4<c:remove>标签的案例
<%@ 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>c:remove标签</title>
</head>
<body>
<c:set var="s" value="Tom" scope="request"></c:set>
我是设置后s的值:s=${s }
<br>
<c:remove var="s" />
我是移除属性s后的值:s=${s }
<br>
</body>
</html>
运行结果展示:
5.4<c:catch>标签介绍
5.4.1、<c:catch>标签的功能
- <c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常。
5.4.2、<c:catch>标签的属性
属性 | 描述 |
---|---|
var | 存储异常信息的变量 |
5.4.3、<c:catch>标签的语法
<c:catch var=“errorInfo”>
可能会出现的异常代码
</c:catch>
- 将捕获的异常对象存储在page域中
5.4.4<c:catch>标签的案例
<%@ 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>c:catch的标签实例</title>
</head>
<body>
<c:catch var="errorCatch" >
<%
int a = 10/0;
%>
</c:catch>
打印异常信息:<br>
${errorCatch }<br>
<c:out value="${errorCatch} "></c:out><br>
errorCatch.message:<c:out value="${errorCatch.message }" /><br>
errorCatch.getCause:<c:out value="${errorCatch.cause }" /><br>
errorCatch.getStackTrace:<c:out value="${errorCatch.stackTrace }" /><br>
</body>
</html>
运行结果展示
5.5<c:if>标签介绍
5.5.1、<c:if>标签的功能
- <c:if>标签和程序中的if语句作用相同,用来实现条件控制。
5.5.2、<c:if>标签的属性
属性 | 描述 |
---|---|
test | 决定处理标签中的条件表达式(true false) |
var | 指定test执行的结果,将其结果保存在scope域中 |
scope | 指定test的执行结果保存在那个web域中 |
5.5.3、<c:if>标签的语法
- 【语法一】<c:if test=“表达式” var=“变量(temp)” [scope=“page|request|session|application”] />
- 解释:在指定的web域中,将test执行的结果保存在var变量值中
- 【语法二】<c:if test=“表达式” var=“变量(temp)” [scope=“page|request|session|application”] >
需要指定的代码
</c:if> - 解释:在指定的web域中,将test执行的结果保存在var变量值中,如果test中的表达式成立就执行标签题里面的内容
5.5.4、<c:if>标签的案例
<%@ 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>c:if标签的使用</title>
</head>
<body>
<h3>1、test属性中的值成立的话直接显示结果</h3>
<c:if test="${10<12 }" >
我是jstl的if标签
</c:if>
<h3>2、根据test属性中的值是否成立,判断用户的权限</h3>
<form action="if.jsp" method="post">
用户名:<input type="text" name="username" value="${param.username }" /><br>
密码:<input type="password" name="password" value="${param.password }" /><br>
<input type="submit" value="登录" />
</form>
<hr>
<c:if test="${param.username=='admin'}&& ${!empty param.username }" var="admincheck">
<c:out value="欢迎"></c:out>
<c:out value="${ param.username}"></c:out>
登录成功
</c:if>
<c:if test="${param.username!='admin'}" var="admincheck">
请重新登录
</c:if>
<br>
<h3>显变量var中结果</h3>
${admincheck }
</body>
</html>
<c:if>标签运行结果展示:
5.6<c:choose><c:when><c:otherwise>标签介绍
5.6.1、<c:choose><c:when><c:otherwise>标签的功能
- <c:choose>、<c:when>和<c:otherwise>这3个标签通常情况下是一起使用的,<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。
- 使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “switch case” 的复杂条件判断结构。
5.6.2、<c:choose><c:when><c:otherwise>标签的属性
属性 | 描述 |
---|---|
test(位于shen中) | 里面存放表达式相当于if中()里面的内容 |
5.6.3、<c:choose><c:when><c:otherwise>标签的语法
<c:choose>
<c:when test="条件1">
//业务逻辑1
<c:when>
<c:when test="条件2">
//业务逻辑2
<c:when>
<c:when test="条件n">
//业务逻辑n
<c:when>
<c:otherwise>
//业务逻辑
</c:otherwise>
</c:choose>
5.6.4、<c:choose><c:when><c:otherwise>标签的案例
<%@ 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>choose_when_otherwise标签</title>
</head>
<body>
<c:set var="score" value="89"></c:set>
<!--
根据分数设置成绩梯度
score>90为优秀
90>=score>80为较好
80>=score>=60为良好
60>score为不及格
-->
<c:choose >
<c:when test="${score>90}" >
成绩优秀
</c:when>
<c:when test="${score>80 && score<=90 }">
成绩较好
</c:when>
<c:when test="${score>60 && score<=80 }">
成绩良好
</c:when>
<c:otherwise >
成绩不及格
</c:otherwise >
</c:choose>
</body>
</html>
<c:choose><c:when><c:otherwise>的案例结果展示:
5.7<c:forEach>标签介绍
5.7.1、<c:forEach>标签的功能
- 主要用来遍历集合(Collection)
5.7.2、<c:forEach>标签的属性
属性 | 描述 |
---|---|
var | 存储从集合中取出的变量(临时变量具体下标下的具体值) |
items | 指定要遍历那个集合 |
varStatus | 集合中具体下标具体值的信息 |
begin | end |
step | 步长,一次增加几个从集合中取出 |
varStatus的4中属性:
属性 | 描述 |
---|---|
index | 当前的索引值 |
count | 循环的次数 |
first | 是否是第一位 |
end | 是否是最后一位 |
5.7.3、<c:forEach>标签的语法
<c:forEach
var=”name”
items=”Collection”
varStatus=”StatusName”
begin=”begin”
end=”end”
step=”step”>
本体内容
</c:forEach>
5.7.4、<c:forEach>标签的案例
<%@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>forEach标签</title>
</head>
<body>
<h2>
<c:out value="forEach标签"></c:out>
</h2>
<%
List<String> list = new ArrayList<String>();
list.add(0, "北北");
list.add(1, "晶晶");
list.add(2, "欢欢");
list.add(3, "迎迎");
list.add(4, "妮妮");
request.setAttribute("list", list);
%>
<h3><c:out value="不指定begin和end,从第一个遍历到最后一个" /> </h3>
<c:out value="${list}" />
<br>
<h3> 简单的遍历List集合取出所有元素 </h3>
<c:forEach var="li" items="${list}">
<c:out value="${li }" />
<br>
</c:forEach>
<h3><c:out value="指定begin和end,从第一个遍历到最后一个,步长为2" /> </h3>
<!-- 简单的遍历List集合取出所有元素,间隔是2个位置取出一个 -->
<c:forEach items="${list}" var="li" step="2" begin="1" end="4">
<c:out value="${li }" />
</c:forEach>
<h3><c:out value="输出整个迭代的信息" /> </h3>
<c:forEach items="${list}" var="lis" step="1" begin="2" end="4"
varStatus="w">
<c:out value="${lis }" />的四种属性<br>
所在位置,即索引:<c:out value="${w.index }" />
<br>
总共已经迭代的次数:<c:out value="${w.count }" />
<br>
是否为第一位:<c:out value="${w.first }" />
<br>
是否为最后一位:<c:out value="${w.last }" />
<br>
</c:forEach>
</body>
</html>
<c:forEach>标签的运行结果展示
5.8<c:forTokens>标签介绍
5.8.1、<c:forTokens>标签的功能
该标签用于遍历字符串,并根据给定的字符模式将字符串截取。
5.8.2、<c:forTokens>标签的属性
属性 | 描述 |
---|---|
var | 存储丛集和中取出的变量(临时变量具体下标下的具体值) |
items | 指定要遍历那个集合 |
delims | 指定以什么样的模式进行分割 |
varStatus | 集合中具体下标具体值的信息 |
begin | end |
step | 步长,一次增加几个从集合中取出 |
5.8.3、<c:forTokens>标签的语法
<c:forTokens items=”strigOfTokens”
delims=”delimiters”
[var=”name”
begin=”begin”
end=”end”
step=”len”
varStatus=”statusName”] >
本体内容
</c:forTokens>
属性的用法和功能和forEach的一样不在多做解释
5.8.4、<c:forTokens>标签的案例
<%@ 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>forTolens标签</title>
</head>
<body>
<c:set var="str" value="aaaa,bbbb,cccc"/>
<c:forTokens items="${str }" delims="," var="s">
${s}<br>
</c:forTokens>
</body>
</html>
<c:forTokens>标签的结果展示
5.9<c:import>标签介绍
5.9.1、<c:import>标签的功能
- 该标签可以把其他静态或动态文件包含到本JSP页面
- 与include指令和动作展示的效果是一样的
- 与jsp:include的区别为:jsp:include只能包含同一个web应用中的文件。而<c:import>可以包含其他web应用中的文件,甚至是网络上的资源。
5.9.2、<c:import>标签的属性
属性 | 描述 |
---|---|
var | 临时变量 |
charEncoding | 页面显示的编码方式 |
scope | 用于指定属性所在的web域 |
url | 资源的路径 |
context | 用于在访问其他web应用的文件时,指定根目录 |
varReader | 还不知道具体的作用(可能一辈子也用不到几次) |
补充:
- 1)引用资源有两种方式:绝对路径和相对路径。
使用绝对路径的示例如下:<c:import url=”http://www.baidu.com”>
使用相对路径的示例如下:<c:import url=”index.jsp”>,index.jsp放在同一文件目录。 - 2)如果以“/”开头表示应用的根目录下。例如:tomcat应用程序的根目录文件夹为webapps。导入webapps下的文件bb.txt的编写方式为:<c:import url=”/bb.txt”>
如果访问webapps管理文件夹中其他web应用就要用context属性。 - 3)context属性用于在访问其他web应用的文件时,指定根目录。例如,访问root下的index.jsp的实现代码为:<c:import url=”/index.jsp” context=”/root”>
等同于webapps/root/index.jsp
5.9.3、<c:import>标签的语法
<--【语法1】:-->
<c:import
url=”url”
[context=”context”]
[value=”value”]
[scope=”page|request|session|application”]
[charEncoding=”encoding”]/>
<--【语法2】:-->
<c:import
url=”url”
varReader=”name”
[context=”context”]
[charEncoding=”encoding”]/>
5.9.4、<c:import>标签的案例
<%@ 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>c:import标签</title>
</head>
<body>
<c:catch var="error1">
<c:import url="http://wwww.baidu.com" charEncoding="utf-8" />
</c:catch>
<hr>
<h3>访问/day07/JSTL/index.jsp相对路径</h3>
<c:catch var="error2">
<c:import url="index.jsp" charEncoding="utf-8" />
</c:catch>
<hr>
</body>
</html>
<c:import>表签的结果展示:
5.10<c:url>标签介绍
5.10.1、<c:url>标签的功能
- <c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。
5.10.2、<c:url>标签的属性
属性 | 描述 |
---|---|
context | 用于在访问其他web应用的文件时,指定根目录 |
var | 指定将构造出的URL结果保存在指定的web |
value | 要构造的url值 |
scope | 指定的web域 |
5.10.3、<c:url>标签的语法
<--【语法1】:指定一个url不做修改,可以选择把该url存储在JSP不同的范围中。-->
<c:url
value=”value”
[var=”name”]
[scope=”page|request|session|application”]
[context=”context”]/>
<--【语法2】:配合 <c:param>标签给url加上指定参数及参数值,可以选择以name存储该url。-->
<c:url
value=”value”
[var=”name”]
[scope=”page|request|session|application”]
[context=”context”]>
<c:param name=”参数名” value=”值”>
</c:url>
5.10.4、<c: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>c:url标签</title>
</head>
<body>
<h2>不带参数的</h2>
<c:url var="myurl" value="/index.jsp" context="/day07" />
${myurl }
<br>
<a href="${myurl }">点击访问day7下的index.jsp</a>
<h2>带参数的超链接</h2>
<c:url value="https://blog.csdn.net/SYJ_1835_NGE" var="myurl1">
<c:param name="username" value="zmzx"></c:param>
<c:param name="password">123456</c:param>
</c:url>
<a href="${myurl1 }">点击访问CSDN首页带参数</a>
<h2>访问同一服务器下的其他的web应用</h2>
<c:url var="urlName" value="/index.jsp" scope="session" context="/day06" >
</c:url>
<a href="${urlName }">点击访问day6下的index.jsp</a>
</body>
</html>
<c:url>标签的运行结果展示
5.11<c:redirect>标签介绍
5.11.1、<c:redirectl>标签的功能
- 该标签用来实现请求的重定向。同时可以配合使用<c:param>标签在url中加入指定的参数。
5.11.2、<c:redirectl>标签的属性
属性 | 描述 |
---|---|
url | 指定到要转发或者重定向到的资源目标地址 |
context | 当要重定向到同一服务器下的不同web项目资源时,其值是指定的资源web项目 |
5.11.3、<c:redirectl>标签的语法
【语法1】:
<c:redirect url=”url” [context=”context”]/>
【语法2】:
<c:redirect url=”url”[context=”context”]>
<c:param name=”name1” value=”value1”>
</c:redirect>
5.11.4、<c:redirectl>标签的案例
<%@ 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>c:redirect</title>
</head>
<body>
<h3>带参数的重定向</h3>
<c:redirect url="https://blog.csdn.net/SYJ_1835_NGE" >
<c:param name="username" value="zmzx" />
<c:param name="password" >123456</c:param>
</c:redirect>
<h3>不带参数的重定向</h3>
<c:redirect url="https://blog.csdn.net/SYJ_1835_NGE" />
<h3>不带参数的重定向</h3>
<c:redirect url="/index.jsp" context="/day06" />
</body>
</html>
5.12<c:param>标签介绍
5.12.1、<c:param>标签的功能
当做属性用来传递
5.12.2、<c:param>标签的属性
属性 | 描述 |
---|---|
var | 就是一个临时变量 |
value | 属性值 |
name | 属性名称 |
5.12.3、<c:param>标签的语法
【语法一】<c:param name=“username” > zmzx </c:param>
【语法二】<c:param name=“password” value=“syj” />
5.12.4、<c:param>标签的案例
<%@page import="javafx.scene.control.Tab"%>
<%@ 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> param 标签的使用</title>
</head>
<body>
<c:url value="https://blog.csdn.net/SYJ_1835_NGE" var="URL" >
<c:param name="username"> zmzx </c:param>
<c:param name="password" value="syj" ></c:param>
</c:url>
${URL }<br>
<a href="${URL}">点击转到我的CSDN首页</a>
</body>
</html>
<c:param>标签的运行结果
六、自定义标签和简单标签的入门
自定义标签的概述
- 减少页面使用代码
- 提高安全性、方便开发 、提高代码的可维护性
- 自定义标签 一般很少用,只有一些比较成熟的公司才会去进行本公司的标签的开发
标签体系结构
传统标签:
- Tag接口、继承Tag接口的IterationTag接口、继承IterationTag接口的BodyTag接口
- 实现IterationTag的TagSupport类、实现BodyTag的BodyTagSupport类
简单标签:
- SimpleTag接口
- 实现SimpleTag接口的SimpleTagSupport类
快速开发简单标签入门的步骤:
- 1)创建一个类实现SimpleTag接口
- 2)在WEB-INF下创建一个tld文件,对类与标签进行描述,将自定义的类和jsp文件进行关联
- 3)在页面中导入自定义标签
对于tld文件编写的解释
- 我们可以参考导入的jar包中,有编写核心库的tld代码
- standard.jar下面有一个META-INF下的c.tld
- 简单的实现和分析:
<tag>
<description> </description>
<name> </name>
<tag-class> </tag-class>
<body-content> </body-content>
</tag>
- tag:一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 ,一个tag标记对应一个自定义标签
- description对自定义的tag标签进行描述
- name可以理解为就是一个标签名
- tag-class要关联的类
- body-content 简单标签(SampleTag)中标签体body-content的值只允许是empty(没有标签体内容)和scriptless(不允许使用脚本)
实现SimpleTag接口的分析
-
setJspContext方法
用于把JSP页面的pageContext对象传递给标签处理器对象 -
setParent方法
用于把父标签处理器对象传递给当前标签处理器对象 -
getParent方法
用于获得当前标签的父标签处理器对象 -
setJspBody方法
用于把代表标签体的JspFragment对象传递给标签处理器对象 -
doTag方法
用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。
案例
获得IP地址,获得资源名称:
mytag.tld文件:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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">
<!--taglib(标签库)的版本号 -->
<tlib-version>1.0</tlib-version>
<short-name>my</short-name>
<!--
13 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写,如这里的/Simpletag ,
14 在Jsp页面中引用标签库时,需要通过uri找到标签库
15 在Jsp页面中就要这样引入标签库:<%@ taglib prefix="my" uri="http://www.syj.cn/SimpleTag"%>
16 -->
<uri>http://www.syj.cn/SimpleTag</uri>
<!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 -->
<!-- 一个tag标记对应一个自定义标签 -->
<tag>
<!-- description用来添加对taglib(标签库)的描述 -->
<description>SimpleTag</description>
<!--
为标签处理器类配一个标签名,在Jsp页面中使用标签时是通过标签名来找到要调用的标签处理器类的
通过ip就能找到对应的cn.syj.Tag.SimpleTag.MyTagIP类
-->
<name>ip</name>
<!-- 标签对应的处理器类-->
<tag-class>cn.syj.Tag.SimpleTag.MyTagIP</tag-class>
<!--
tld文件中有四种标签体类型 :empty JSP scriptless tagdepentend
在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常
在传统标签中标签体body-content的值只允许是empty和JSP
如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的,
例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的
<gacl:sql>SELECT * FROM USER</gacl:sql>
在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可
-->
<body-content>empty</body-content>
</tag>
<tag>
<name>resource</name>
<tag-class>cn.syj.Tag.SimpleTag.MyResouce</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
MyTagIP.java
package cn.syj.Tag.SimpleTag;
import java.io.IOException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
//获得此电脑的IP地址
/**
* 步骤: 1、首先要得到HttpServletRequest对象request
* 2、request根据方法request.geeRemoteAddr()得到IP地址
*/
public class MyTagIP implements SimpleTag {
private PageContext context = null;
@Override
public void doTag() throws JspException, IOException {
HttpServletRequest request = (HttpServletRequest) context.getRequest();
JspWriter out = context.getOut();
out.write(request.getRemoteAddr());
}
@Override
public JspTag getParent() {
return null;
}
@Override
public void setJspBody(JspFragment jspBody) {
}
@Override
public void setJspContext(JspContext pc) {
this.context = (PageContext) pc;
}
@Override
public void setParent(JspTag parent) {
}
}
MyTagdemo1.java
package cn.syj.Tag.SimpleTag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
public class MyResouce implements SimpleTag{
private PageContext context = null;
@Override
public void doTag() throws JspException, IOException {
HttpServletRequest request = (HttpServletRequest) context.getRequest();
JspWriter out = context.getOut();
String uri = request.getRequestURI();//--/day08/myTag.jsp
String path = request.getContextPath();//--/day08
out.write(uri+"<br>");
out.write(path);
}
@Override
public JspTag getParent() {
return null;
}
@Override
public void setJspBody(JspFragment jspBody) {
}
@Override
public void setJspContext(JspContext pc) {
this.context = (PageContext) pc;
}
@Override
public void setParent(JspTag parent) {
}
}
myTag.jsp测试:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="my" uri="http://www.syj.cn/SimpleTag"%>
<!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>简单标签的开发入门</title>
</head>
<body>
你的IP地址是:
<my:ip />
<br>
你的资源路径是:
<my:resource/>
</body>
</html>
运行结果展示: