JSTL概述

JSTL,也就是JSP Standard Tags Library,JSP标准标签库,封装了JSP标签的通用功能。JSTL标签通常和EL表达式一起使用,能够实现一些JSP页面基本功能,减轻JSP程序设计的复杂程度。

JSTL的环境配置

1、在tomcat官方网站下载JSTL的jar包。

Step1:

java tsc 标签 打印_标签库

step2:

java tsc 标签 打印_JSTL_02

step3:

java tsc 标签 打印_标签库_03

2、将下载完成的jar包导入项目中。intelij idea集成开发环境下,新建lib文件夹,然后点击File->Project Structure,在Libraries中添加lib库目录,在Artifacts中将项目添加到output root中。如果是Eclipse环境,操作方法类似。

java tsc 标签 打印_标签库_04


java tsc 标签 打印_sql_05

3、在JSP页面中使用taglib指令导入标签库

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 导入标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>TestMyJSP</title>
</head>
<body>
</body>
</html>

JSTL核心标签

1、使用jstl核心标签需要导入核心标签库:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

2、jstl核心标签:

标签

功能

<c:out>

用于在JSP中显示数据,就像<%= … >

<c:set>

用于保存数据

<c:remove>

用于删除数据

<c:catch>

用来处理产生错误的异常状况,并且将错误信息储存起来

<c:if>

与我们在一般程序中用的if一样

<c:choose>

本身只当做<c:when>和<c:otherwise>的父标签

<c:when>

<c:choose>的子标签,用来判断条件是否成立

<c:otherwise>

<c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行

<c:import>

检索一个绝对或相对 URL,然后将其内容暴露给页面

<c:forEach>

基础迭代标签,接受多种集合类型

<c:forTokens>

根据指定的分隔符来分隔内容并迭代输出

<c:param>

用来给包含或重定向的页面传递参数

<c:redirect>

重定向至一个新的URL

<c:url>

使用可选的查询参数来创造一个UR

每个标签都具有一些属性,查询相应文档或网站可以获得每个标签的具体信息。
3、一般用途的标签
(1)<c:out>标签
类似于JSP<%= … %>或${ … }
语法格式:

<c:out value="值或者EL表达式" escapeXML="true|false"  default="默认值"/>
<c:out value="值或者EL表达式" escapeXML="true|false" >默认值</c:out>

属性:value,值或者EL表达式,显示的内容;escapeXml,表示是否转义特殊字符,默认为true;default表示默认值,如果value计算的结果为null,显示默认值,如果没有默认值显示空串。
(2)<c:set>标签
设置域变量或者JavaBean的属性值
语法格式:

<!-- 设置域变量的值 -->
<c:set value="值或者EL表达式" var="域变量名" scope="page|request|session|application"/>
<c:set var="域变量名" scope="page|request|session|application">值或者EL表达式</c:set>
<!-- 设置JavaBean的值 -->
<c:set target="EL表达式表示的JavaBean对象" property="属性名" value="属性值"/>
<c:set target="EL表达式表示的JavaBean对象" property="属性名" >属性值</c:set>

属性:value要设置的值,var表示域变量名,scope表示作用域,target表示JavaBean对象,property表示属性名。
(3)<c:remove>标签
用于删除域变量
语法格式:

<c:remove var="变量名" scope="page|request|session|application"/>

(4)<c:exception>标签
允许页面作者以统一的方式来处理任何操作抛出的异常。我们将可能抛出异常的代码,放置在开始标签<c:catch>与结束标签</c:catch>之间,如果其中的代码抛出异常,异常将被捕获,并被保存到var所标识的域变量中,该变量总是具有page作用域,如果没有异常发生,则var标识的域对象将被移除。如果没有指定var属性,那么异常只是简单地被捕获,异常信息并不会被保存。
语法结构:

<c:catch var="保存异常信息的域变量">
	嵌套的动作
</c:catch>

4、控制流程标签
<c:if>、<c:forEach>、<c:choose>、<c:when>、<c:otherwise>、<c:forTokens>

<!-- if动作元素 -->
<c:if test="bool expression">
	jsp元素或标记
</c:if>
<!-- forEach动作元素,基于集合的遍历 -->
<c:forEach var="top" items="${paramValues.topping}">
 	${top}<br/>
</c:forEach>
<!-- forEach动作元素,基于计数器 -->
<c:forEach begin="1" end="100" step="2">
 	${top}<br/>
</c:forEach>
<!-- 基于choose、when、otherwise的多路分支 -->
<c:choose>
	<c:when test="${param.payment=='visa'}">
		Visa
	</c:when>
	<c:when test="${param.payment=='mc'}">
		mc
	</c:when>
	<c:when test="${param.payment=='discover'}">
		discover
	</c:when>
	<c:otherwise>
		Check
	</c:otherwise>
</c:choose>
<!-- 迭代字符串中由分隔符分割的各成员 -->
<c:forTokens items="zhangsan:lisi:wangwu" delims=":" var="name">
	${name}
</c:forTokens>
<c:forTokens items="zhangsan:lisi:wangwu" delims=":" var="name"
	begin='1' end='2' step='1'>
	${name}
</c:forTokens>
<c:forTokens items="zhangsan:lisi:wangwu" delims=":" var="name"
	varStatus="保存迭代状态域变量范围的名字" begin='1' end='2' step='1'>
	${name}
</c:forTokens>

5、URL相关标签
(1)<c:import>标签
功能:用于导入基于URL的资源,这个标签类似于jsp:include动作元素,区别在于<c:import>不仅可以导入同一个Web应用程序的资源,还可以导入不同Web应用程序的资源,甚至是其它网站的资源。
语法:

<!-- 资源内容作为String对象被导出 -->
<!-- context、var、scope、charEncoding可以缺省 -->
<c:import url="url" context="上下文名称t" var="资源句柄域变量" scope="page|request|session|application" charEncoding="字符集">
	可选内容为<c:param>子标签
</c:import>
<!-- 资源的内容作为Reader对象被导出 -->
<!-- context、varReader、charEncoding可以缺省 -->
<c:import url="url" context="上下文名称t" varReader="资源句柄域变量" charEncoding="字符集">
	可选内容为调用Reader对象的其他动作
</c:import>

属性:url,要导入资源的url;context,当使用相对url访问某个资源的时候,指定其上下文的名称;var,被导出的保存了导入资源内容的域变量名称,这个域变量的类型是String,不接受动态的值;scope,域变量var的jsp范围,不接受动态的值;charEncoding,字符编码;varReader,被导出的保存了资源内容的域变量的名字,这个域变量的类型是Reader,不接受动态的值。
空值处理与异常:如果url为空、null或者无效,会抛出异常
注意:
a. 导出的Reader对象只能在<c:import>以及</c:import>之间有效
b. 使用相对URL可以在同一个上下文中直接引用文件名;访问外部上下文时,则必须以"/"开头;使用绝对URL时,当前执行环境中的一切对被导入的资源都是无效的。需要注意的是,要跨Web应用程序访问资源,需要在当前应用程序的元素设置中指定crossContext属性值为true。

<context path="/ch17" docBase="F:\JSPLesson\ch17" reloadable="true" crossContext="true"/>

示例:

<c:import url="a.jsp"/><!-- 使用相对url导入同一上下文的资源 -->
<c:import url="/b.jsp"/><!-- 使用相对url导入同一Web容器的资源 -->
<c:import url="/hello.jsp" context="/ch17"/><!-- 使用url属性和context属性导入资源 -->
<c:import url="/max.jsp" context="/ch17"><!-- 在内容体中使用<c:param>子标签 -->
	<c:param name="num1" value="23"/>
	<c:param name="num2" value="16"/>
</c:import>
<c:import url="http://www.sunxin.org?keyword=computer"/><!-- 使用绝对路径导入资源 -->
<c:import url="ftp://ftp.sunxin.org/copyright"/>

(2)<c:url>标签
功能:使用正确URL重写规则构造一个URL
语法:

<c:url value="value" context="context" var="varName" scope="page|request|session|application"/>
<c:url value="value" context="context" var="varName" scope="page|request|session|application">
	<c:param>子标签
</c:url>
<!-- 其中除了value属性,其它属性都是可以缺省的 -->

属性:value,要处理的url;context,使用相对url标识一个外部资源的时候,指定其上下文的名字;var,被导出的保存了处理后url的域变量的名字,这个域变量的类型是String,不接受动态的值;scope,var的JSP范围,不接受动态的值。
示例:

<c:url value="http://www.sunxin.org/register" var="MyURL">
    <c:param name="name" value="${param.name}"/>
    <c:param name="email" value="${param.email}"/>
</c:url>
<!-- 执行的结果为产生一个如下的链接 -->
<!-- <a href="http://www.sunxin.org/register?name=lisi&email=sunxin%40sunxin.org>Register</a> -->

<c:url value="/abc/a.jsp"/>

(3)<c:redirect>标签
功能:将客户的请求重定向到另一个资源。
语法:

<c:redirect url="value" context="context"/>
<c:redirect url="value" context="context">
	<c:param>子标签
</c:redirect>

(4)<c:param>标签
功能:为url添加请求参数
语法:

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

说明:如果value是空,则param标签什么也不做。

格式化标签

标签

描述

<fmt:formatNumber>

使用指定的格式或精度格式化数字

<fmt:parseNumber>

解析一个代表着数字,货币或百分比的字符串

<fmt:formatDate>

使用指定的风格或模式格式化日期和时间

<fmt:parseDate>

解析一个代表着日期或时间的字符串

<fmt:bundle>

绑定资源

<fmt:setLocale>

指定地区

<fmt:setBundle>

绑定资源

<fmt:timeZone>

指定时区

<fmt:setTimeZone>

指定时区

<fmt:message>

显示资源配置文件信息

<fmt:requestEncoding>

设置request的字符编码

SQL标签

1、导入标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

2、使用SQL标签连接数据库的示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 1、导入标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>TestMyJSP</title>
</head>
<body>
	<!-- 2、设置数据源 -->
    <sql:setDataSource url="jdbc:mysql://localhost:3306/helloworld?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"
                       driver="com.mysql.cj.jdbc.Driver"
                       user="root"
                       password="ljh_5098_CHD"/>

    <!-- 3、操作数据库 -->
    <!-- 利用sql:query标签执行查询 -->
    <sql:query var="result">
        select * from student where Sname = ?
        <sql:param value="藤原拓海"/><!-- 替代sql语句中的? -->
    </sql:query>
    <!-- 输出查询结果 -->
    <table>
        <c:forEach var="item" items="${result.rows}">
            <tr>
                <td><c:out value="${item.Sno}"/></td>
                <td><c:out value="${item.Sname}"/></td>
                <td><c:out value="${item.Ssex}"/></td>
                <td><c:out value="${item.Sage}"/></td>
                <td><c:out value="${item.Sdept}"/></td>
            </tr>
        </c:forEach>
    </table>

	<!-- 利用sql:update标签执行数据更新语句 -->
    <sql:update>
        update student set Sname='高桥凉介' where sname='藤原拓海'
    </sql:update>
    <!-- 构造一个java.util.Date对象并存储到一个域变量中 -->
    <fmt:parseDate value="2019-05-29" var="public_date" pattern="yyyy-MM-dd"/>
    <!-- 执行查询语句 -->
    <sql:query var="result">
        select *,? date from student<!-- 在查询语句中使用占位符? -->
        <sql:dateParam value="${public_date}" type="date"/><!-- 使用sql:dateParam标签将Date对象格式化为一个时间字符串 -->
    </sql:query>
    <!-- 输出查询结果 -->
    <table>
        <c:forEach var="item" items="${result.rows}">
            <tr>
                <td><c:out value="${item.date}"/></td>
                <td><c:out value="${item.Sno}"/></td>
                <td><c:out value="${item.Sname}"/></td>
                <td><c:out value="${item.Ssex}"/></td>
                <td><c:out value="${item.Sage}"/></td>
                <td><c:out value="${item.Sdept}"/></td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

3、相关标签
(1)<sql:setDataSource>标签
功能:设置并初始化数据库连接
语法:

<!-- 使用url连接数据库 -->
<sql:setDateSource url="jdbcURL" 
		driver="驱动程序" 
		user="username" 
		password="password"
		var="数据源句柄域变量"
		scope="var指定的变量所处的JSP范围"/>
<!-- 使用数据源连接数据库 -->
<sql:setDateSource dataSource="dataSource"
		driver="驱动程序" 
		user="username" 
		password="password"
		var="数据源句柄域变量"
		scope="var指定的变量所处的JSP范围"/>

属性:dataSource,指定数据源;url,指定jdbcURL;driver,指定数据库驱动程序;user,指定数据库用户名;password,指定用户密码;var,数据库资源句柄域变量;scope,指定var变量的JSP范围。
说明:属性dataSource的值有两种形式,一种是指定数据源JNDI名的相对路径,另一种是指定DriverManager类所需要的参数,语法格式为:url, driver, username, password。var和scope属性是缺省的,如果制定了数据源句柄域变量,则后面的步骤中都要指定,如果缺省,则设置的数据源将被保存到java.servlet.jsp.jstl.sql.dataSource配置变量。
(2)<sql:query>标签
功能:执行SQL语言的DQL语句
语法:

<!-- 没有标签体 -->
<sql:query sql="查询语句" 
		var="varName" 
		scope="page|request|session|application"
		dataSource="dataSource"
		maxRows="maxRows"
		startRow="startRows"/>
<!-- 有标签体,在标签体中指定查询参数 -->
<sql:query sql="带?的查询语句"
		var="varName" 
		scope="page|request|session|application"
		dataSource="dataSource"
		maxRows="maxRows"
		startRow="startRows">
		<sql:param>子标签
</sql:query>
<!-- 有标签体,在标签体中指定查询语句和参数 -->
<sql:query var="varName" 
		scope="page|request|session|application"
		dataSource="dataSource"
		maxRows="maxRows"
		startRow="startRows">
		sql="带?的查询语句"
		<sql:param>子标签
</sql:query>

属性:sql,查询语句;dataSource,指定数据源;maxRows,指定最大行数,若指定为-1表示没有上限;startRows,指定结果集起始的行数,首行的索引为1;var,scope同上。
说明:如果指定了dataSource就不能在<sql:transaction>中嵌套。
取得查询结果集的方式:
①接口方法:getColumnNames()、getRowCount()、getRows()、getRowsByIndex()、isLimitedByMaxRows()
②属性:columnNames集合、rowCount、rows集合、rowsByIndex集合、limitedByMaxRows集合,可以通过对象点、数组下标等方法取得各个属性值。
(3)<sql:param>标签
功能:设置sql语句中标记为?的参数的值。该标签作为<sql:query>和<sql:update>标签的子标签使用。
语法:

<sql:param value="参数值"/>
<sql:param>参数值</sql:param>

(4)<sql:dateParam>标签
功能:用java.util.Date对象的值设置SQL语句中标记为?的参数。
语法:

<sql:dateParam value="value" type="timestamp|time|date"/>
<sql:dateParam type="timestamp|time|date">
	value
</sql:dateParam>

属性:value,用时间或日期值指定参数的值,对应数据库中数据结构TIMESTAMP、TIME、DATE;type,dateParam标签会根据type的值将value转换成不同的类型(java.util.TimeStamp、java.util.Time、java.util.Date)。
示例:

<!-- 构造一个java.util.Date对象并存储到一个域变量中 -->
<fmt:parseDate value="2019-05-29" var="public_date" pattern="yyyy-MM-dd"/>
<!-- 执行查询语句 -->
<sql:query var="result">
    select *,? date from student<!-- 在查询语句中使用占位符? -->
    <sql:dateParam value="${public_date}" type="date"/><!-- 使用sql:dateParam标签将Date对象格式化为一个时间字符串 -->
</sql:query>

(5)<sql:update>标签
功能:执行DML和DDL语言。
语法:

<sql:update sql="sql语句" 
		dataSource="数据源" 
		var="varName" 
		scope="page|request|session|application"/>
<sql:update sql="带?的sql语句" 
		dataSource="数据源" 
		var="varName" 
		scope="page|request|session|application">
	<sql:param>子标签
</sql:update>
<sql:update dataSource="数据源" 
		var="varName" 
		scope="page|request|session|application">
	sql语句
	<sql:param>子标签
</sql:update>

属性:sql,sql语句;dataSource,数据源域变量;var,数据库资源域变量;scope,var的JSP范围。如果指定了scope必须指定var,如果指定了dataSource属性就不能作为sql:transaction的子标签。
示例:

<!-- 例1 -->
<sql:setDataSource dataSource="jdbc/bookstore" var="ds"/>
<sql:update sql="update bookinfo set amount=amount-5 where id=1" dataSource="${ds}"/>
<!-- 例2 -->
<sql:update>
	insert into bookinfo values(?,?,?,?,?,?,?)
	<sql:param>8</sql:param>
	<sql:param>Java实例入门</sql:param>
	<sql:param>小明</sql:param>
	<sql:param>小明出版社</sql:param>
	<sql:param>2005-05-23</sql:param>
	<sql:param>55.00</sql:param>
	<sql:param>23</sql:param>
<!-- 例3 -->
<sql:update var="result"><!-- 删除的行数是${result} -->
	delete from bookinfo where id>0 and id<3
</sql:update>

(6)<sql:transaction>标签
功能:为子标签<sql:query>和<sql:update>建立事务处理上下文。
语法:

<sql:transaction dataSource="dataSource" isolation=isolationLevel>
	<sql:query>和<sql:update>子标签语句
</sql:transaction>

隔离级别:参考数据库知识。read_uncommited不禁止脏读、不可重复读、幻读,read_commited禁止脏读,repeatable_read禁止脏读和不可重复读,serializable称为可串行化,禁止三种情况。

其他JSTL标签

I18N、XML、Functions不常使用,不再提及。