JSP标准标签库(JSTL)
##JSP标准标签库简介:
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
JSTL库安装:
Apache Tomcat安装JSTL 库步骤如下:
从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.zip 包并解压,将jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。
接下来我们在 web.xml 文件中添加以下配置:
1 |
|
使用任何库,必须在每个JSP文件中的头部包含<taglib>标签。
核心标签:
核心标签是最常用的JSTL标签。引用核心标签库的语法如下:
1 | <%@ taglib prefix="c" |
标签 | 描述 |
---|---|
< 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> | 使用可选的查询参数来创造一个URL |
格式化标签:
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
1 | <%@ taglib prefix="fmt" |
标签 | 描述 |
---|---|
< fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
< fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
< fmt:parseDate> | 使用指定的风格或模式格式化日期和时间 |
< fmt:setLocale> | 解析一个代表着日期或时间的字符串 |
< fmt:bundle> | 绑定资源 |
< fmt:setLocale> | 指定地区 |
< fmt:setBundle> | 绑定资源 |
< fmt:timeZone> | 指定时区 |
< fmt:setTimeZone> | 指定时区 |
< fmt:message> | 显示资源配置文件信息 |
< fmt:requestEnconding> | 设置request的字符编码 |
SQL标签:
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
1 | <%@ taglib prefix="sql" |
标签 | 描述 |
---|---|
< sql:setDataSource> | 指定数据源 |
< sql:query> | 运行SQL查询语句 |
< sql:update> | 运行SQL更新语句 |
< sql:param> | 将SQL语句中的参数设为指定值 |
< sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
< sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
XML 标签
JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:
1 | <%@ taglib prefix="x" |
在使用xml标,必须将XML 和 XPath 的相关包拷贝至你的 Tomcat 安装目录\lib下:
XercesImpl.jar
xalan.jar
标签 | 描述 |
---|---|
<x:out> | 与<%= … >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
x:transform> | 将XSL转换应用在XML文档中 |
x:param | 与<x:transform>共同使用,用于设置XSL样式表 |
JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
1 | <%@ taglib prefix="fn" |
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首位的空白符 |
JSP连接数据库
SELECT操作实例:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
运行结果:
INSERT操作实例:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
运行结果:
JSP JavaBean
JavaBean是特殊的Java类,使用J ava语言书写,并且遵守JavaBean API规范。
接下来给出的是JavaBean与其它Java类相比而言独一无二的特征:
- 提供一个默认的无参构造函数。
- 需要被序列化并且实现了Serializable接口。
- 可能有一系列可读写属性。
- 可能有一系列的”getter”或”setter”方法。
JavaBean属性:
一个JavaBean对象的属性应该是可访问的。这个属性可以是任意合法的Java数据类型,包括自定义Java类。
一个JavaBean对象的属性可以是可读写,或只读,或只写。JavaBean对象的属性通过JavaBean实现类中提供的两个方法来访问:
方法 | 描述 |
---|---|
getPropertyName() | 举例来说,如果属性的名称为myName,那么这个方法的名字就要写成getMyName()来读取这个属性。这个方法也称为访问器。 |
setPropertyName() | 举例来说,如果属性的名称为myName,那么这个方法的名字就要写成setMyName()来写入这个属性。这个方法也称为写入器。 |
一个只读的属性只提供getPropertyName()方法,一个只写的属性只提供setPropertyName()方法。
JavaBean程序示例:
这是StudentBean.java文件:
1 | package com.runoob; |
访问JavaBean:
jsp:useBean 标签可以在JSP中声明一个JavaBean,然后使用。声明后,JavaBean对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。jsp:useBean标签的语法格式如下:
1 | <jsp:useBean id="bean 的名字" scope="bean 的作用域" typeSpec/> |
其中,根据具体情况,scope的值可以是page,request,session或application。id值可任意只要不和同一JSP文件中其它jsp:useBean中id值一样就行了。
访问 JavaBean 对象的属性:
在 jsp:useBean 标签主体中使用 jsp:getProperty/ 标签来调用 getter 方法,使用 jsp:setProperty/ 标签来调用 setter 方法,语法格式如下:
1 | <jsp:useBean id="id" class="bean 编译的类" scope="bean 作用域"> |
name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。
接下来给出使用以上语法进行属性访问的一个简单例子:
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
JSP自定义标签
自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。
JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。
你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。
创建”Hello”标签
接下来,我们想创建一个自定义标签叫作ex:Hello,标签格式为:
1 | <ex:Hello /> |
要创建自定义的JSP标签,你首先必须创建处理标签的Java类。所以,让我们创建一个HelloTag类,如下所示:
1 | package servlet; |
以下代码重写了doTag()方法,方法中使用了getJspContext()方法来获取当前的JspContext对象,并将”Hello Custom Tag!”传递给JspWriter对象。
编译以上类,并将其复制到环境变量CLASSPATH目录中。最后创建如下标签库:<Tomcat安装目录>webapps\ROOT\WEB-INF\custom.tld。
1 | <taglib> |
接下来,我们就可以在JSP文件中使用Hello标签:
1 | <%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%> |
以上程序输出结果为:
1 | Hello Custom Tag! |
JSP表达式语言
JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。
一个简单的语法
典型的,当您需要在JSP标签中指定一个属性值时,只需要简单地使用字符串即可:
1 | <jsp:setProperty name="box" property="perimeter" value="100"/> |
JSP EL允许您指定一个表达式来表示属性值。一个简单的表达式语法如下:
1 | ${expr} |
其中,expr指的是表达式。在JSP EL中通用的操作符是 . 和 {} 。这两个操作符允许您通过内嵌的JSP对象访问各种各样的JavaBean属性。
举例来说,上面的jsp:setProperty标签可以使用表达式语言改写成如下形式:
1 | <jsp:setProperty name="box" property="perimeter" |
当JSP编译器在属性中见到”${}”格式后,它会产生代码来计jsp算这个表达式,并且产生一个替代品来代替表达式的值。
您也可以在标签的模板文本中使用表达式语言。比如jsp:text标签简单地将其主体中的文本插入到JSP输出中:
1 | <jsp:text> |
现在,在jsp:text标签主体中使用表达式,就像这样:
1 | <jsp:text> |
在EL表达式中可以使用圆括号来组织子表达式。比如${(1 + 2) 3}等于9,但是${1 + (2 3)} 等于7。
想要停用对EL表达式的评估的话,需要使用page指令将isELIgnored属性值设为true:
1 | <%@ page isELIgnored ="true|false" %> |
这样,EL表达式就会被忽略。若设为false,则容器将会计算EL表达式。
EL中的基础操作符
EL表达式支持大部分Java所提供的算术和逻辑操作符:
操作符 | 描述 | ||
---|---|---|---|
. | 访问一个Bean属性或者一个映射条目 | ||
[] | 访问一个数组或者链表的元素 | ||
( ) | 组织一个子表达式以改变优先级 | ||
+ | 加 | ||
- | 减或负 | ||
* | 乘 | ||
/ or div | 除 | ||
% or mod | 取模 | ||
== or eq | 测试是否相等 | ||
!= or ne | 测试是否不等 | ||
< or lt | 测试是否小于 | ||
> or gt | 测试是否大于 | ||
<= or le | 测试是否小于等于 | ||
>= or ge | 测试是否大于等于 | ||
&& or and | 测试逻辑与 | ||
\ | \ | or or | 测试逻辑或 |
! or not | 测试取反 | ||
empty | 测试是否空值 |