JSTL概述
JSTL,也就是JSP Standard Tags Library,JSP标准标签库,封装了JSP标签的通用功能。JSTL标签通常和EL表达式一起使用,能够实现一些JSP页面基本功能,减轻JSP程序设计的复杂程度。
JSTL的环境配置
1、在tomcat官方网站下载JSTL的jar包。
Step1:
step2:
step3:
2、将下载完成的jar包导入项目中。intelij idea集成开发环境下,新建lib文件夹,然后点击File->Project Structure,在Libraries中添加lib库目录,在Artifacts中将项目添加到output root中。如果是Eclipse环境,操作方法类似。
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不常使用,不再提及。