在JSP页面中使用标签库代替传统Java片段语文来实现页面显示逻辑已经不是新技术了,但是自定义的标签容易造成重复定义和非标准的实现,所以JSTL(JSP Standard Tag Library,JSP标准标签库)诞生了。JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的(标准是SUN制定,apache实现的,SUN收录了apache的实现)。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上。

Version

JSTL version

Requirements

Standard 1.2.3

JSTL 1.2

Servlet 2.5, JavaServer Pages 2.1

Standard 1.1

JSTL 1.1

Servlet 2.4, JavaServer Pages 2.0

Standard 1.0

JSTL 1.0

Servlet 2.3, JavaServer Pages 1.2

Sun 发布的标准 JSTL1.1 标签库有以下几个标签:

  • 核心标签库:包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
  • 格式化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
  • 数据库标签库:可以做访问数据库的工作。
  • XML 标签库:用来访问 XML 文件的工作,这是 JSTL 标签库的一个特点。
  • 函数标签库:用来读取已经定义的某个函数。

使用JSTL的步骤:

  • 在项目中引入jstl的相关jar包,确保jar存在:jstl.jar、standard。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
  • 在需要使用标签的JSP页面上使用taglib指令引入标签库。
  • 在需要使用标签的位置直接使用标签库。
数据库标签:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<!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>JSTL_SQL</title>
</head>
<body>

<!-- ****数据源【sql:setDataSource】****
    driver="要注册的JDBC驱动"
    url="数据库连接的JDBC URL"
    user="数据库用户名"
    password="数据库密码"
    dataSource=""
    var="代表数据库的变量"
    scope="var属性的作用域(page request session application),默认为page"
    这里需要先导入mysql驱动jar,导入方式可以有点不一样,这里需要将jar包加入到JRE目录下的lib/ext文件夹下,
    否则可能会出现No suitable driver found for jdbc异常
 -->
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost:3306/sso?useUnicode=true&characterEncoding=UTF-8"
     user="root"  password="123456"/>
${snapshot}
<!-- 输出:
org.apache.taglibs.standard.tag.common.sql.DataSourceWrapper@9c781ab 
-->

<hr>
<!-- ****SQL查询【sql:query】****
    sql="要执行的SQL语句,默认为主体内容"
    dataSource="数据源"
    maxRows="存储在变量中的最大结果数,默认无无穷大"
    startRow="开始记录的结果行数,默认为0"
    var="存储查询结果的变量"
    scope="var属性的作用域(page request session application),默认为page"
    rowCount属性。该属性统计结果集中有效记录的量,可以使用于大批量数据分页显示。
    查询结果属性:
        rows                结果数据,字段名={字段值···}
        rowsByIndex         常用得到数据库中数据的方式,从有效行的第一个元素开始遍历,到最后一个有效行的最后一个元素。
        columnNames         用于得到数据库中的字段名。
        limitedByMaxRows    用于判断是否受到了maxRows的限制
 -->
<sql:query dataSource="${snapshot}" var="result" maxRows="10" startRow="1">
    SELECT id,name from t_user;
</sql:query>
<c:forEach var="user" items="${result.rows}">
    ${user.id}、${user.name}<br>
</c:forEach>
<!-- 输出:
输出用户表从第2条开始的10条数据
-->

<hr>
<!-- ****SQL更新【sql:update】****
    sql="要执行的SQL语句,默认为主体内容"
    dataSource="数据源"
    var="存储影响行数的变量"
    scope="var属性的作用域(page request session application),默认为page"
 -->
<sql:update dataSource="${snapshot}" var="insert_count">
    INSERT INTO t_user (`name`, `account`, `password`, `birthday`) VALUES ('xiaogong', 'xg', '123456', now());
</sql:update>
insert_count: ${insert_count}
、
<sql:update dataSource="${snapshot}" var="update_count">
    UPDATE t_user SET name = 'xiaogong1' WHERE name = 'xiaogong';
</sql:update>
update_count:${update_count}
<!-- 输出:
insert_count: 1、update_count:1
-->

<hr>
<!-- ****SQL参数【sql:param】****
    value="参数值,默认为主体内容,如果为null值时,则将占位符设为SQL null"
 -->
<sql:update dataSource="${snapshot}" var="update_count">
    UPDATE t_user SET name = '小' WHERE name = ?
    <sql:param>xiaogong1</sql:param>
</sql:update>
update_count:${update_count}
<!-- 输出:
update_count:1
-->

<hr>
<!-- ****SQL日期参数【sql:dateParam】****
    value="参数值,默认为主体内容,如果为null值时,则将占位符设为SQL null"
    type="DATE (只有日期),TIME(只有时间), 默认TIMESTAMP (日期和时间)"
 -->
<sql:query dataSource="${snapshot}" var="result">
    SELECT id,name from t_user WHERE birthday < ?
    <sql:dateParam value="<%=new java.util.Date()%>"/>
</sql:query>
<c:forEach var="user" items="${result.rows}">
    ${user.id}、${user.name}<br>
</c:forEach>
<!-- 输出:
输出birthday小于当前时间的所有用户信息
-->

<hr>
<!-- ****SQL事务【sql:transaction】****
    dataSource="数据源"
    isolation="事务隔离等级 (READ_COMMITTED,,READ_UNCOMMITTED, REPEATABLE_READ或 SERIALIZABLE)"
 -->
<sql:transaction dataSource="${snapshot}">
    <sql:update var="update_count">
        UPDATE t_user SET name = 'xiaogong' WHERE name = 'xiaogong1'
    </sql:update>
    <sql:query var="result">
        SELECT id,name from t_user WHERE birthday < now()
    </sql:query>
</sql:transaction>
<!-- 输出:
以上这两个语句是在同一个事务中执行
-->

</body>
</html>