javaWeb之JSTL标签库之核心标签库

一、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 &ltc:out&gt标签的介绍

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>

运行结果展示:
<c:out>结果展示

5.2 &ltc:set&gt标签的介绍

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>

运行结果展示:
<c:set>运行结果

5.3&ltc:remove&gt标签介绍

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>

运行结果展示:
<c:remove>标签的运行结果

5.4&ltc:catch&gt标签介绍

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>

运行结果展示
<c:catch>标签运行结果展示

5.5&ltc:if&gt标签介绍

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>标签运行结果展示:
<c:if>标签运行结果展示

5.6&ltc:choose&gt&ltc:when&gt&ltc:otherwise&gt标签介绍

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>的案例结果展示:
<c:choose><c:when><c:otherwise>的运行结果

5.7&ltc:forEach&gt标签介绍

5.7.1、<c:forEach>标签的功能

  • 主要用来遍历集合(Collection)
    5.7.2、<c:forEach>标签的属性
属性描述
var存储从集合中取出的变量(临时变量具体下标下的具体值)
items指定要遍历那个集合
varStatus集合中具体下标具体值的信息
beginend
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>
	&nbsp;&nbsp;&nbsp;&nbsp;所在位置,即索引:<c:out value="${w.index }" />
		<br>
	&nbsp;&nbsp;&nbsp;&nbsp;总共已经迭代的次数:<c:out value="${w.count }" />
		<br>
	&nbsp;&nbsp;&nbsp;&nbsp;是否为第一位:<c:out value="${w.first }" />
		<br>
	&nbsp;&nbsp;&nbsp;&nbsp;是否为最后一位:<c:out value="${w.last }" />
		<br>
	</c:forEach>
</body>
</html>

<c:forEach>标签的运行结果展示
<c:forEach>标签的运行结果

5.8&ltc:forTokens&gt标签介绍

5.8.1、<c:forTokens>标签的功能
该标签用于遍历字符串,并根据给定的字符模式将字符串截取。
5.8.2、<c:forTokens>标签的属性

属性描述
var存储丛集和中取出的变量(临时变量具体下标下的具体值)
items指定要遍历那个集合
delims指定以什么样的模式进行分割
varStatus集合中具体下标具体值的信息
beginend
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>标签的结果展示
<c:forTokens>标签的结果

5.9&ltc:import&gt标签介绍

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>表签的结果展示:
<c:import>表签运行结果
在这里插入图片描述

5.10&ltc:url&gt标签介绍

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>标签的运行结果展示
<c:url>标签的运行结果

5.11&ltc:redirect&gt标签介绍

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&ltc:param&gt标签介绍

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>标签的运行结果
<c:param>标签的运行结果

六、自定义标签和简单标签的入门

自定义标签的概述

  • 减少页面使用代码
  • 提高安全性、方便开发 、提高代码的可维护性
  • 自定义标签 一般很少用,只有一些比较成熟的公司才会去进行本公司的标签的开发

标签体系结构

JSTL自定义标签的体系结构

传统标签:

  • 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>

运行结果展示:
运行结果

参考自:https://www.cnblogs.com/xdp-gacl/p/3943390.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值