JSP标准标签库

JSP标准标签库

JSP中可以通过Java代码来获取信息,但是过多的Java代码会使JSP页面非常复杂。为此,Sun公司制定了一套标准标签库JSTL。

JSTL入门

什么是JSTL

从JSP1.1规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性。为此,许多Web应用厂商都定制了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商制定可能是不同的,这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择,为了解决这个问题,Sun公司制定了一套标准标签库(Java Server Pages Standard Tag Library),简称JSTL。
JSTL虽然被称为标准标签库,而实际上这个标签库是由5个不同功能的标签库共同组成的。在JSTL1.1规范中,为这5个标签库分别指定了不同的URI以及建议使用的前缀。

标签库标签库的URI前缀
Corehttp://java.sun,com/jsp/jstl/corec
I18Nhttp://java.sun.com/jsp/jstl/fmtfmt
SQLhttp://java.sun.com/jsp/jstl/sqlsql
XMLhttp://java.sun.com/jsp/jstl/xmlxml
Functionshttp://java.sum.com/jsp/jstl/functionsfn

1、Core
Core是一个核心标签库,它包括实现Web应用中通用操作的标签。例如,用于输出文本内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。
2、I18N
I18N是一个国际化/格式化标签库,它包括实现Web应用程序的国际化标签和格式化标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、使日期按照本地格式显示等。
3、SQL
SQL是一个数据库标签库,它包括用于访问数据库和对数据库操作的标签。例如,从数据库中获取数据库连接、从数据库表中检索数据等。由于在软件分层开发模型中,JSP页面仅作为表示层,一般不会在JSP页面中直接操作数据库,因此JSTL中提供的这套标签库不经常用。
4、XML
XML是一个操作XML文档的标签库,它包括对XML文档中的数据进行操作的标签。例如,解析XML文件、输出XML文档中的内容、以及迭代处理XML文档中的元素。XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单。
5、Functions
Functions是一个函数标签库,它提供了一套自定义EL函数,包括JSP页面制作者经常要用到的字符串操作。例如,提取字符串的子字符串、获取字符串的长度。

安装和测试JSTL

1、下载JSTL包
从apache网站下载JSTL的jar包。
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
在这里插入图片描述
解压可以看到lib文件夹下有两个jar文件
在这里插入图片描述
其中jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)
2、安装JSTL
将这两个文件复制到项目的WEB-INF下lib下
在这里插入图片描述
在这里插入图片描述
3、测试JSTL
test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@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>
	<c:out value="Hello World!"></c:out>
</body>
</html>

在这里插入图片描述

JSTL中的Core标签库

<c:out>标签

在JSP页面中,最常见的操作就是向页面输出一段文本信息,为此,Core标签库提供了一个<c:out>标签,该该标签可以将一段文本内容或表达式的结果输出到客户端。如果<c:out>标签输出的文本内容中包括需要进行转义的特殊字符,例如>,<,&,’,"等,<c:out>标签会默认对它们进行HTML编码转换后再输出。
<c:out>有两种语法
语法1:没有标签体的情况

<c:out value="value" [default="defaultValue"] [escapeXml="{true|falue}"]/>

语法2:有标签体的情况,在标签体中指定输出的默认值。

<c:out value="value" [escapeXml="{true|falue}"]>
	defaultValue
</c:out>

1)value属性用于指定输出的文本内容
2)default属性用于指定当value属性为null时所输出的默认值,该属性是可选的(方括号中的属性都是可选的)。
3)escapeXml属性用于指定是否将>,<,&,’,"等特殊字符进行HTML编码转换后再输出,默认值为true。需要注意的是,只有当value属性值为null时,<c:out>标签才会输出默认值,如果指定默认值,则默认值输出空字符串。
1、使用<c:out>标签输出默认值
使用<c:out>标签输出默认值有两种方式,一是通过使用<c:out>标签地default属性输出默认值,二是通过使用<c:out>标签地标签体输出默认值。
c_out1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	username属性值为:
	<c:out value="${param.username }" default="unknown"/><br>
	username属性值为:
	<c:out value="${param.username }">
		unknown
	</c:out>
</body>
</html>

在这里插入图片描述
因为参数中没有username属性所有输出了默认值
get传递username
在这里插入图片描述
2、使用<c:out>标签的escapeXml属性对特殊字符进行转义
c_out2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	<c:out value="${param.username }" escapeXml="false">
		<meta http-equiv="refresh" content="0;url=http://www.baidu.com"/>
	</c:out>
</body>
</html>

escapeXml的属性值设置是false,所以标签不会为特殊字符进行HTML转换。
将escapeXml的属性值设置是为true。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	<c:out value="${param.username }" escapeXml="true">
		<meta http-equiv="refresh" content="0;url=http://www.baidu.com"/>
	</c:out>
</body>
</html>

在这里插入图片描述
可以看到字符串被转换了。

value属性识别的相关实验

value中输出空字符串

<c:out value="" escapeXml="false">
	1231
</c:out>

在这里插入图片描述
显示了空字符串,没有视为null
value中输出"null"字符串
在这里插入图片描述
显示了"null"字符串,没有视为null
value中是用EL表达式和字符串混合输出

<c:out value="${param.username} " escapeXml="false">
	1231
</c:out>

在这里插入图片描述
EL表达式后增加一个空格,${param.username}获取到的是null,null与” “做字符串连接得到的是” “,不是null所有没有输出默认值。
value中使用<%=%>标签输出null

	<c:out value="<%=null%>" escapeXml="false">
		1231
	</c:out>

在这里插入图片描述
输出了默认值。
value中的<%=%>标签可以使用隐式对象。

	<c:out value="<%= request.getParameter(\"name\")%>" escapeXml="false">
		1231
	</c:out>

在这里插入图片描述
观察jsp翻译的Servlet可以看到,当value值使用<%=%>标签时,业务逻辑直接放在了”主函数“中(_jspService()中),而没有像value值为EL表达式或字符串时,”主函数“中调用自定义函数,在自定义函数中实现业务逻辑,这样的好处是可以使用原本JSP提供的JSP隐式对象。
value中使用<%=%>标签输出null并拼接字符串

	<c:out value="<%=null%> " escapeXml="false">
		1231
	</c:out>

在这里插入图片描述
后接字符串报错。

	<c:out value=" <%=null%>" escapeXml="false">
		1231
	</c:out>

在这里插入图片描述
前接字符串,视为字符串输出。
value中使用<% %>标签

	<c:out value="<%int i=0;%>" escapeXml="false">
		1231
	</c:out>

在这里插入图片描述
视为字符串输出。
综上,<c:out>的value的属性值只能识别EL表达式,和<%= %>标签,且只有输出为null时才能输出默认值。

<c:set>标签

在程序开发时,通常需要设置一些属性信息,为了方便设置这些信息,Core标签库提供了一个<c:set>标签,该标签用于设置域对象属性的值,或者设置对象中用于存储数据的Map对象、JavaBean对象属性的值。标签有4种语法。
语法1:使用value属性设置域对象某个属性的值

<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>

语法2:标签体设置指定域中某个属性的值

<c:set var="varName" [scope="{page|request|session|application}"]>
	body content
</c:set>

语法3:使用value属性设置某个域对象属性的值

<c:set value="value" target="target" property="propertyName"/>

语法4:使用标签体设置某个域对象属性的值

<c:set target="target" property="propertyName">
	body content
</c:set>

1)value属性用于设置属性的值
2)var属性用于指定要设置的域对象属性的名称
3)scope属性用于指定属性所在的域对象
4)target属性用于指定要指定要设置属性的对象,这个对象必须是JavaBean对象或Map对象
5)property属性用于指定要为当前对象设置属性名称(访问途径是JavaBean的setXxxx()方法)
1、使用<c:set>标签设置域对象中某个属性的值
c_set1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	session域中username属性的值为:
	<c:set var="userName" value="root" scope="session"/>
	<c:out value="${userName }"/>
	<hr/>
	session域中bookname属性的值为:
	<c:set var="bookName" scope="session">
		Java web
	</c:set>
	<c:out value="${bookName }"/>
</body>
</html>

在这里插入图片描述
2、使用<c:set>标签设置UserBean对象和Map对象中某个属性的值
在使用<c:set>标签设置UserBean对象中某个属性的值之前,需要先创建一个User.java程序,用于封装一个User对象

package JCTL;

public class User {
	public String username;
	public String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

c_set2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="JCTL.User,java.util.*"%>
    <%@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>
	<jsp:useBean id="user" class="JCTL.User"/>
	<c:set value="root" target="${user}" property="username"/>
	User对象的username属性的值为:<c:out value="${user.username }"/><br>
	<c:set value="123" target="${user}" property="password"/>
	User对象的password属性的值为:<c:out value="${user.password }"/>
	<hr>
	<%
		HashMap map=new HashMap();
		request.setAttribute("preferences", map);
	%>
	<c:set target="${preferences}" property="color" value="green"/>
	Map对象中color关键字的值为:<c:out value="${preferences.color }"/>
</body>
</html>

注:1、访问jsp之前一定要重新部署Web应用,虽然jsp修改不需要重新部署也可生效,但是User类需要重新编译,这个问题卡了半天,太冤了!
在这里插入图片描述
2、一个<c:set>标签不能同时设置servlet域对象和自定义域对象设置值。
当同时设置时

	<jsp:useBean id="user" class="JCTL.User"/>
	<c:set var="username" value="root" target="${user}" property="username"/>
	User对象的username属性的值为:<c:out value="${user.username }"/><br>
	默认page域中的username属性的值:${username},${pageScope.username }

在这里插入图片描述
可以看到set忽略了对User对象的username属性进行设置。
3、当value的值设置为null时,会将原本的属性删除。

	<jsp:useBean id="user" class="JCTL.User"/>
	<c:set var="username" scope="session" value="root"/>
	<c:set var="username" scope="session" value="<%=null %>"/>
	User对象的username属性的值为:
	<c:out value="${user.username }">
		默认值
	</c:out><br>

在这里插入图片描述
可以看到默认值被输出了。

<c:remove>标签

要在JSP页面中删除域对象中的属性,就需要使用Core标签库提供的<c:remove>标签。

<c:remove var="varName" [scope="{page|request|session|application}"]/>

1)var属性用于指定要删除的属性名称
2)scope属性用于指定要删除属性所属的域对象,它们的值都不能接收动态值。实际上,<c:reomve>标签与<c:set>标签将value属性的值设置为null的作用是相同的。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	<c:set value="root" var="username" scope="session"/>
	username:<c:out value="${username }"/><hr>
	<c:remove var="username"/>
	username:<c:out value="${username }"/><hr>
</body>
</html>

注:当<c:remove>标签不设置scope时会删除page、request、session中所有符合属性名的属性。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	<c:set value="root1" var="username" scope="page"/>
	<c:set value="root2" var="username" scope="request"/>
	<c:set value="root3" var="username" scope="session"/>
	<c:set value="root4" var="username" scope="application"/>
	pageScope.username:<c:out value="${pageScope.username }"/><br>
	requestScope.username:<c:out value="${requestScope.username }"/><br>
	sessionScope.username:<c:out value="${sessionScope.username }"/><br>
	applicationScope.username:<c:out value="${applicationScope.username }"/><hr>
	<c:remove var="username"/>
	<c:set value="root4" var="username" scope="application"/>
	pageScope.username:<c:out value="${pageScope.username }"/><br>
	requestScope.username:<c:out value="${requestScope.username }"/><br>
	sessionScope.username:<c:out value="${sessionScope.username }"/><br>
	applicationScope.username:<c:out value="${applicationScope.username }"/><hr>
</body>
</html>

在这里插入图片描述

<c:catch>标签

在操作JSP页面时,偶尔也会出现一些异常,为了捕获这些异常,Core标签库中提供了一个<c:catch>标签,该标签用于捕获嵌套在<c:catch>标签体中出现的异常

<c:catch [var="varName"]>
	Nested actions
</c:catch>

上述格式语法中,可以看到<c:catch>标签有一个var属性,该属性用于标识<c:catch>标签捕获的异常对象,其值是一个静态的字符串,不支持动态属性值。<c:catch>标签会将捕获的异常对象以指定的名称保存到page域对象中,如果不指定var属性,则<c:catch>标签仅捕获异常,不在page域中保存异常对象。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@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>
	<c:catch var="myex">
		<%
			int i=10;
			int j=0;
			System.out.println(i+"/"+j+"="+i/j);
		%>
	</c:catch>
	异常:<c:out value="${myex }"/><br>
	异常:<c:out value="${myex.message }"/><br>
	异常:<c:out value="${myex.cause }"/><br>
	异常:<c:out value="${myex.stackTrace }"/><br>
</body>
</html>

在这里插入图片描述

<c:if>标签

在程序开发中,经常需要使用if语句进行条件判断,如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的<c:if>标签。
语法1:没有标签体的情况

<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]/>

语法2:有标签体的情况,在标签体中指定要输出的内容

<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]>
	body content
</c:if>

1)test属性用于设置逻辑表达式
2)var属性用于指定存储逻辑表达式变量的名字。
3)scope属性用于指定var变量的作用范围,默认值为page。如果属性test的计算结果为ture,那么标签体将被执行,否则标签体不会被执行。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@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>
	<c:set value="1" var="visitCount" property="visitCount"/>
	<c:if test="${visitCount==1 }" var="result">
		判断结果是${result }
	</c:if>
</body>
</html>

在这里插入图片描述

<c:choose>标签

<c:choose>标签没有属性,在它的标签体中只能嵌套一个或多个<c:when>标签和零个或一个<c:otherwise>标签,并且同一个<c:choose>标签中所有的<c:when>子标签必须出现在<c:otherwise>子标签之前

<c:choose>
	Body content(<when>and<otherwise>subtags)
</c:choose>

<c:when>标签

<c:when>标签只有一个test属性,该属性的值为布尔类型。test属性支持动态值,其值可以是一个条件表达式,如果条件表达式的值为true,就执行这个<c:when>标签体的内容

<c:when test="testCondition">
	Body content
</c:when>

<c:otherwise>标签

<c:otherwise>标签没有属性,它必须作为<c:choose>标签的最后分支出现,当所有的<c:when>的标签的test条件都不成立时,才执行和输出<c:otherwise>标签体的内容

<c:otherwise>
	conditional block
</c:otherwise>

c_choose.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	<c:choose>
		<c:when test="${empty param.username }">
			unKnown user.
		</c:when>
		<c:when test="${param.username=='root' }">
			${param.username } is manager.
		</c:when>
		<c:otherwise>
			${param.username } is employee.
		</c:otherwise>
	</c:choose>
</body>
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	<c:choose>
		<c:when test="<%=true %>">
			第一
		</c:when>
		<c:when test="<%=true %>">
			第二
		</c:when>
		<c:otherwise>
			false
		</c:otherwise>
	</c:choose>
</body>
</html>

可以看到当choose中有多个when值为true时,仅会输出第一个值为true的标签体。
在这里插入图片描述

<c:forEach>标签

在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个<c:forEach>标签,该标签专门用于迭代集合对象中的元素,如Set、List、Map、数组等
语法1、迭代包括多个对象的集合

<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
	body content
</c:forEach>

语法2、迭代指定范围内的集合

<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
	body content
</c:forEach>

1)var属性用于指将当前迭代到的元素保存到page域中的名称。
2)items属性用于指定将要迭代的集合对象
3)varStatus用于指定当前迭代状态信息的对象保存到page域中的名称
4)begin属性用于指定从集合中第几个元素开始迭代,begin的索引值从0开始,如果没有指定items属性,就从begin指定的指开始迭代,直到迭代结束为止。
5)step属性用于指定迭代的步长,即迭代因子的增量。
1、使用<c:forEach>标签迭代数组
c_foreach1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@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>
	<%
		String[] fruits={"1","2","3","4"};
	%>
	String数组中的元素:<br>
	<c:forEach var="name" items="<%=fruits %>">
		${name }<br>
	</c:forEach>
</body>
</html>

在这里插入图片描述
2、使用<c:forEach>标签迭代Map集合
在迭代Map类型的集合时,迭代出的每个元素的类型都为Map.Entry,Map.Entry代表Map集合中的一个条目项,其中,getKey()方法可获得条目项的关键字,getValue()方法可获得条目项的值。
c_foreach2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@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>
	<%
		Map userMap=new HashMap();
		userMap.put("Tom","123");
		userMap.put("Make","123");
		userMap.put("Lina","123");
	%>
	HashMap集合中的元素:<br>
	<c:forEach var="entry" items="<%=userMap %>">
		${entry.key }&nbsp;${entry.value }<br>
	</c:forEach>
</body>
</html>

在这里插入图片描述
3、使用<c:forEach>标签指定迭代集合对象的范围和步长
c_foreach3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@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>
coloesLisr集合(指定迭代范围和步长)<br>
	<%
		List colorsList=new ArrayList();
		colorsList.add("1");
		colorsList.add("2");
		colorsList.add("3");
		colorsList.add("4");
		colorsList.add("5");
	%>
	<c:forEach var="num" items="<%=colorsList %>" begin="1" end="3" step="2">
		${num }&nbsp;
	</c:forEach>
</body>
</html>

在这里插入图片描述
4、使用<c:forEach>标签获取迭代集合中元素的状态信息
<c:forEach>标签的varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含从集合中取出元素的状态信息。使用<c:forEach>标签的varStatus属性可以获取以下信息
1)count:表示元素在集合中的序号,从1开始计数。
2)index:表示当前元素在集合中的索引,从0开始计数。
3)first:表示当前是否为集合中的第一个元素。
4)last:表示当前是否为集合中的最后一个元素。
c_foreach4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
    <%@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 style="text-align:center;">
	<%
		List userList=new ArrayList();
		userList.add("11");
		userList.add("22");
		userList.add("33");
	%>
	<table border="1">
		<tr>
			<td>序号</td>
			<td>索引</td>
			<td>是否为第一个元素</td>
			<td>是否为最后一个元素</td>
			<td>元素的值</td>
		</tr>
		<c:forEach var="num" items="<%=userList %>" varStatus="status">
			<tr>
				<td>${status.count }</td>
				<td>${status.index }</td>
				<td>${status.first }</td>
				<td>${status.last }</td>
				<td>${num }</td>
			</tr>
		</c:forEach> 
	</table>
</body>
</html>

在这里插入图片描述

<c:forTokens>标签

标签和<c:forEach>标签类似,都可以完成迭代功能,只不过<c:forTokens>标签用于迭代字符串中用指定分隔符分隔的字符串,并且能重复执行标签体

<c:forTokens items="StringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
	body content
</c:forTokens>

1)items:用于指定将要分隔的字符串
2)delims:属性用于指定具体的分割符,可以是一个或多个
3)var:用于指定当前迭代的元素保存到page域中的属性名称
4)varStatus:用于指定当前迭代状态信息的对象保存到page域中的属性名称
5)begin:指定从集合中第几个元素开始
6)end:结束位置
7)step:步长

<c:param>标签

在开发一个Web应用程序时,通常会在JSP页面中完成URL的重写以及重定向等特殊功能,为了完成这些功能,在Core标签库中,也提供了相应功能的标签。

<c:param>标签用于获取URL地址中的附加参数,它通常需要嵌套在<c:url>标签中使用。
语法1、使用value属性指定参数的值

<c:param name="name" value="value">

语法2、在标签体中指定参数的值

<c:param name="name">
	paramter value
</c:param>

1)name属性用于指定参数的名称
2)value属性用于指定参数的值,当使用标签为一个URL地址附加参数时,他会自动对参数值进行URL编码。

<c:url>标签

在访问一个JSP页面时,通常会在URL中传递一些参数,为了方便完成这种功能,Core标签库中提供了一个<c:url>标签,该标签可以在JSP页面中构造一个新的URL地址,实现URL的重写。
语法1、没有标签实体的情况

<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>

语法2、有标签实体的情况,在标签体中指定构造URL参数

<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
	<c:param>标签
</c:url>

1)value属性用于指定构造的URL
2)context属性用于指定导入同一服务器下其他Web应用的名称
3)var属性用于指定将构造的URL地址保存到域对象的属性名称
4)scope属性用于指定将构造好的URL保存到域对象中。
c_url.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@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>
	<c:url var="myURL" value="http://localhost:8080/chapter08/register.jsp">
		<c:param name="username" value="张三"/>
		<c:param name="password" value="123"/>
	</c:url>
	<a href="${myURL }">register.jsp</a>
</body>
</html>

在这里插入图片描述
可以看到参数被设置到了URL后,并且张三也被转码了。

<c:redirect>标签

标签用于将请求重定向到其他的Web资源,相当于在Java程序中执行力response.sendRedirect()方法。
语法1、没有标签体的情况

<c:redirect url="url" [context="context"]>

语法2、有标签体的情况,在标签体中指定重定向时的参数

<c:redirect url="url" [context="context"]>
	<c:param>subtags
</c:redirect>

可以看到在提交时也有机会进行参数的增加,设置。
1)url属性用于指定要转发或重定向到目标资源的URL地址,可以使用相对路径和绝对路径(可以设置外部网站URL)
2)context属性用于指定重定向到同一个服务器中其他Web应用的名称(以"/“开头,”/“表示webapps目录)
注:如果使用了context参数,那么url只能使用绝对路径(以”/“开头,”/"表示Web应用的根目录)

JSTL中的Functions标签库

为了简化JSP页面中对字符串的操作,JSTL的Functions标签库中提供了一套自定义EL函数。

fn:toLowerCase函数与fn:toUpperCase函数

在程序开发中,经常需要将指定的字符串进行大小写转换,为了方便在JSP页面中完成这种操作,Function标签库提供了两个函数,分别是fn:toLowerCase和fn:toUpperCase。
fn:toLowerCase函数
函数用于将一个字符串中包括的所有字符转化为小写形式

fn:toLowerCase(String source)

fn:toUpperCase函数
函数用于将一个字符串中包括的所有字符转化为大写形式

fn:toUpperCase(String source)

fn:trim函数

在Functions标签库中,提供了一个fn:trim函数,该函数用于删除一个字符串中开头和末尾的空格

fn:trim(String source)

fn:escapeXml函数

在开发一个JSP页面时,为了防止用户再页面中输入特殊的字符而产生不良的影响,通常需要对特殊字符进行转义,为了解决这个问题,Functions标签库提供了一个fn:escapeXml函数,该函数专门用于将字符串中的"<"、">"、"""、"&"等特殊字符进行转义。

fn:escapeXml(String source)

fn:length函数

在程序开发中,最常见的一个操作就是统计字符串中字符的个数,以及集合和数组中元素的个数,为了在JSP页面中完成这种功能,Functions标签库提供了一个fn:length函数,该函数用于返回字符串中字符的个数,或者集合中数组中元素的个数

fn:length(source)

函数接收一个参数,这个参数可以是任意类型的数组、Collection、Enumeration或Map等类型的实例对象或字符串。

fn:split函数

函数可以按照指定的分隔符,将一个字符串分割成字符串数组,并将这个字符串数组返回

fn:split(String source String delimiter)->String[]

注:delimiter中可以写入多个字符,当delimiter字符串中有多个字符时,函数会将每个字符作为分隔符,分隔字符串。

fn:join函数

该函数与fn:split函数功能相反,该函数可以通过指定的分隔符,将一个字符串数组中的所有元素合并为一个字符串

fn:join(String source[],String spearator)->String

fn:indexOf函数

该函数用于返回指定字符串在一个字符串中第一次出现的索引

fn:indexOf(String source,String target)->int

source用于指定源字符串,target用于指定目标字符串。
如果源字符串包括目标字符串,那么,fn:indexOf函数会返回目标字符串在源字符串中第一次出现的索引值,如果源字符串中不包括目标字符串,则返回-1,如果目标字符串为空,则返回0。

fn:contains函数

该函数专门用于判断一个字符串中是否包含指定字符串

fn:contains(String source,String target)->boolean

source用于指定源字符串,target用于指定目标字符串。
如果源字符串包含目标字符串,则fn:contains函数返回true,否则返回false。如果目标字符串为空,则fn:contains函数总是返回true。需要注意的时,fn:contains函数在比较两个字符串是否相等时对大小写比较敏感。

fn:containslgnoreCase函数

函数在判断一个字符串是否包括指定字符串时,对大小写比较敏感,然而有些时候我们并不关心大小写问题,此时就可以使用Functions标签库中提供的fn:containslgnoreCase函数。

fn:containslgnoreCase(String source,String target)->boolean

fn:startsWith函数与fn:endsWith函数

1、fn:startsWith函数
函数用于判断一个字符串是否以指定字符串开始

fn:startsWith(String source,String target)

2、fn:endsWith函数
函数用于判断一个字符串是否以指定字符串结束

fn:endsWith(String source,String target)

fn:replace函数

函数用于将一个字符串中包括的指定字符串替换为其他字符串,并返回替换后的字符串

fn:replace(String source,String before,String after)->String 

fn:substring、fn:substringAfter与fn:substringBefore函数

1、fn:substring函数
函数用于截取一个字符串中指定字符串并返回截取到的子字符串

fn:substring(String source,int beginIndex,int endIndex)->String

索引从0开始
2、fn:substringAfter函数
函数用于截取并返回指定字符串之前的子字符串

fn:substringAfter(String source,String target)->String

如果源字符串不包括子字符串,则返回空字符串
3、fn:substringBefore函数
用于截取并返回指定字符串之后的子字符串

fn:substringBefore(String source,String target)->String

如果源字符串不包括子字符串,则返回空字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值