第十一章 JSP 标准标签库
回顾 自定义标签是用户定义的 JSP 语言元素 标签处理程序是一个对象,Web 容器调用此对象,以在执行 JSP 页面的过程中解释自定义标签 简单标签的处理程序必须实现 Tag 接口的 doStartTag() 和 doEndTag() 方法 标签库描述符 (TLD, Tag Library Descriptor) 包含库以及该库中所包含的每个标签的信息
目标 理解核心标签库 理解国际化和格式化标签 理解 SQL 标签库
JSTL 在web开发中,有许多功能都是开发人员经常要用到的,JSTL就是定义的一套标准的标签库 JSTL:JavaServer Page Standard Tag Library JSTL规范由sun公司规定,Apache的Jakarta小组负责实现。 JSTL1.0需要支持JavaServlet2.3和JSP1.2的Web容器, JSTL1.1需要支持javaServlet2.4和JSP2.0的Web容器 JSTL的目标是为了简化jsp页面的设计,为页面设计人员和程序开发人员的分工协作提供了便利
用于访问数据库、有条件地执行代码和支持国际化 JSTL Java Server Pages 标准标签库 (JSTL) 包含的各种标签可用于 JSP 页面中 JSTL 的优点 提供一组标准标签 可用于编写各种 动态 JSP 页面 用于访问数据库、有条件地执行代码和支持国际化
JSTL标签库 JSTL由5个不同功能的标签库组成 功能范围 URI 前缀 core(核心) http://java.sun.com/jsp/jstl/core c I18N http://java.sun.com/jsp/jstl/fmt fmt SQL http://java.sun.com/jsp/jstl/sql sql XML http://java.sun.com/jsp/jstl/xml x funcions http://java.sun.com/jsp/jstl/functions fn
配置JSTL(了解) 从http://www.apache.org/dist/jakarta/taglibs/standard/ 下载,下载的文件名为jakarta-taglibs-standard-current.zip 解压后,在lib目录下有两个jar包:jstl.jar和standard.jar Jstl.jar:JSTL规范中定义的类和接口 Standard.jar:对jstl的实现和jstl中5个标签库的tld文件 使用时将两个jar文件复制到 tomcat安装目录\common\lib目录下或者tomcat安装目录\shared\lib目录下,如果只是在当前Web应用程序中使用,可以将这两个文件复制到web应用程序\WEB-INF\lib下 Jbuilder2006中自带有标签库jar包
核心标签库 核心标签库包含以下标签: 核心标签库 通用标签 条件标签 迭代标签
通用标签 3-1 通用标签库用于操作 JSP 页面内的作用域变量 通用标签库中的标签: 通用标签 set remove out catch
通用标签 3-1-1 <c:out>计算一个表达式并将结果输出到当前的JspWrite对象。 类似于jsp的表达式<%=expression%>,或者EL表达式${el-expression} 用法见out.jsp
通用标签 3-1-2 <c:set>用于在某个范围(Request,Session,Application等)中设置某个值,或者设置某个对象的属性 用法见set.jsp
通用标签 3-1-3 <c:remove>用于删除某个变量或者属性 var属性:要删除的参数的名字 Scope属性:参数的范围,如果没有指定,相当于调用pageContext.remove(varName),如果指定了范围,则相当于调用pageContext.remove(varName,scope) 参考remove.jsp
通用标签 3-1-4 <c:catch>将可能抛出异常的代码放置在<c:catch>和</c:catch>之间,如果其中的代码抛出异常,异常将被捕获,并被保存到var所标识的范围变量中,该变量总是有page范围
remove 标签用于删除具有作用域的变量 通用标签 3-2 插入使用通用标签的指令 <%@ taglib uri=http://java.sun.com/jstl/core_rt prefix="c" %> <body> <c:set var= "example" value="${100+1}" scope="session" /> <c:out value="${example}"/> <c:remove var= "example" scope="session"/> </body> set 标签用于给变量设置值和作用域 out 标签显示值的结果 remove 标签用于删除具有作用域的变量
通用标签 3-3 在 JSP 页面中使用通用标签 set、out 和 remove 标签的用法 演示:示例 2 <body> <H1>欢迎来到 Shop Stop</H1> 该 JSP 页面在一个 session 作用域内的变量中存储 sessionvariable, 此 Web 应用程序中的其他 JSP 页面可以访问此变量. <p /> <c:set var="sessionvariable" value="${80+8}" scope="session" /> 在删除 sessionvariable 之前先显示它的值: <c:out value="${sessionvariable}"/> <c:remove var="sessionvariable" scope="session" /> <br/> 显示并删除后的 sessionvariable 的值. <br /> <c:out value=“${sessionvariable}”> sessionvariable为NULL </c:out> </body> 在 JSP 页面中使用通用标签 set、out 和 remove 标签的用法 演示:示例 2
条件标签 2-1 JSTL 提供条件标签以支持 JSP 页面中的各种条件 条件标签包括: 条件标签 if choose when otherwise
条件标签 2-1-1 <c:if>实现java语言中if语句的功能 <c:choose>、<c:when>、<c:otherwise>一起实现互斥条件的执行,类似于java语言的if/else语句 参见choose.jsp
条件标签 2-2 在 JSP 页面中使用条件标签。 if 和 choose 标签的用法。 演示:示例 3 <body> <c:if test="${pageScope.signalStrength < 5}"> <c:set var="signalFailure" value="true" scope="page" /> </c:if> <h1> 使用 If 和 Choose</h1> <c:choose> <c:when test="${pageScope.signalFailure == true}"> 信号断开 </c:when> <c:otherwise> 信号打开 </c:otherwise> </c:choose> </body> 在 JSP 页面中使用条件标签。 if 和 choose 标签的用法。 演示:示例 3
迭代标签库 3-1 在jsp开发中,迭代是经常使用的操作,如果使用Scriptlets,那么常常使用Iterator或者Enumeration来进行迭代 迭代标签用于多次计算标签体 迭代标签库中的标签有: 迭代标签 forEach forTokens
迭代标签库 3-1-1 <c:forEach>对于包含了多个对象的集合进行迭代,重复执行它的标签体,或者重复迭代固定的次数 参见forEach.jsp
迭代标签库 3-1-2 <c:forTokens>用于迭代字符串中由分隔符的各个成员 参见fortokens.jsp
forEach 标签将遍历对象集合并显示 1 到 4 之间的数字 迭代标签库 3-2 <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> <%! String [] numbers = { "1", "2", "3", "4" }; %> <c:set var="member" value="Joe:Petter;Ryan|John" scope="page" /> <BODY> <c:forEach var="numbering" items="<%= numbers %>"> <c:out value="${numbering}" /> </c:forEach> <c:forTokens items="${pageScope.member}" delims=":;|" var="membername"> <c:out value="${membername}" /> <br /> </c:forTokens> </BODY> forEach 标签将遍历对象集合并显示 1 到 4 之间的数字 forTokens 将遍历用所提供的分隔符分隔的值并显示所有的名称
迭代标签库 3-3 在 JSP 页面中使用各种迭代标签 forEach 和 forTokens 标签的用法 演示:示例 4 <body > <H1>显示产品与公司名称</H1> <c:forEach var="company" items="<%= names %>"> ${company} <br/> </c:forEach> <br/> <c:forTokens items="${pageScope.language}" delims=":;|" var="currentName" varStatus="status"> 产品编号为 #P000<c:out value="${status.count}" /> 是<c:out value="${currentName}" /> <br /> </c:forTokens> </body > 演示:示例 4
什么是国际化 在Internet上,大多数的资源都是英文的.为了让不同国家都能看懂,于是定制了多个语言的版本,通过不同的URL访问.如微软中国是:http://www.microsoft.com/china/ 微软日本是:http://www.microsoft.com/japan/ Java语言在其内部采用Unicode字符集,为建立国际化web应用程序奠定了基础 国际化是指:程序在不做任何修改的情况下,就可以在不同的地区和不同的语言环境下,按照当地的语言和格式习惯显示字符. 一个国际化的程序,当它运行在本地机上时,需要根据本地机的语言和地区设置显示相应的字符,这个过程就叫本地化,通常简称L10N
I18N与格式化标签库 3-1 I18N 与格式化标签库可用于创建国际化的 Web 应用程序 分成两部分,一部分是国际化,一部分是日期,时间和数字化. I18N 应用程序的特点是: 可以在全世界运行 支持多语言 可以快速本地化
I18N与格式化标签库 3-2 国际化 (I18N) 与格式化标签库中的标签有: I18N 与格式化标签 setLocale bundle setBundle message
I18N与格式化标签库 3-2-1 <fmt:setLocale>用于设置用户的本地语言环境,并将指定的Locale保存到javax.servlet.jsp.jstl.fmt.locale配置变量中去 应该在I18N标签库中的其他标签前使用<setLocale>标签,通常<setLocale>标签应该放置在页面的开始处 Value属性表示语言和地区代码,必须包含两个小写字母的语言代码,还可以包含两个大写字母的国家和地区代码,之间以”_”或者”-”分割如:”zh_CN”
I18N与格式化标签库 3-2-2 语 言 代 码 语言 代码 汉语(Chinese) zh 英语(English) en 德语(German) de 法语(French) fr 日语(Japanese) ja 朝鲜语(Korean) ko 语 言 代 码
I18N与格式化标签库 3-2-3 国 家 地 区 代 码 国家(地区) 代码 中国(China) CN 美国(United States) US 英国(Great Britain) GB 加拿大(Canada) CA 德国(Germany) DE 日本(Japan) JP 韩国(Korea) KR 台湾(Taiwan) TW 香港(Hongkong) HK 国 家 地 区 代 码
I18N与格式化标签库 3-2-5 <fmt:setBudle>创建一个I18N本地上下文环境,加载资源包到上下文中,资源包的名字通过basename指定.
I18N与格式化标签库 3-2-5 <fmt:message>从资源包中查找一个指定键的值,用于显示本地化的消息 见fmt1.jsp
I18N与格式化标签库 3-2-6 <fmt:formatNumber>按照区域或者定制的方式将数字的值格式化为数字,货币,或者百分数。
I18N与格式化标签库 3-3 在 JSP 页面中使用 I18N 标签库 setLocale 标签的用法: 演示:示例 5 <body> <H2>数字格式示例</H2> 将 <B>123.4</B> 格式化为: <fmt:formatNumber value="123.4" type="number" minFractionDigits="3" /><BR> <HR> <H2>货币格式示例</H2> <c:set var="salary" value="125000" /> 工资: <c:out value="${salary}"/><BR> <fmt:setLocale value="en_GB"/> 用本机的 <B>en_GB</B> 将工资格式化为: <fmt:formatNumber type="currency" value="${salary}" /><BR> <fmt:setLocale value=“zh_CN"/> 用本机的 <B>zh_CN</B> 将工资格式化为: </body> 在 JSP 页面中使用 I18N 标签库 setLocale 标签的用法: 演示:示例 5
SetBundle 示例 为资源包创建各种属性 在 JSP 页面中使用 <setBundle> 标签 演示:示例 6 <c:if test="${param.language == 'en‘ || param.language == null}"> <fmt:setLocale value="en" scope="session" /> </c:if> <c:if test="${param.language == 'sv'}"> <fmt:setLocale value="sv" scope="session" /> <c:if test="${param.language == 'de'}"> <fmt:setLocale value="de" scope="session" /> <fmt:setBundle basename="labels" scope="session" /> . . . <body bgcolor="white"> <fmt:message key="select_language" />: <form action="index.jsp"> <p> <c:set var="currLang" value="${pagesBundle.locale.language}" /> <input type="radio" name="language" value="en" <c:if test="${currLang == ‘en’}“>已检查</c:if>/> <fmt:message key="english" /><br> <input type="radio" name="language" value="sv" <c:if test="${currLang == 'sv'}">已检查</c:if>/> <fmt:message key="swedish" /><br> <input type="radio" name="language" value="de" <c:if test="${currLang == 'de'}">已检查</c:if>/> <fmt:message key="german" /><br> <input type="submit" value="<fmt:message key="new_language" />"> </form> </body> 为资源包创建各种属性 在 JSP 页面中使用 <setBundle> 标签 title=Industry Trends select_language= Select your preferred language new_language= New Language english=English swedish=Swedish german=German title=Industrietendenzen select_language=Wählen Sie die gewünschte Sprache new_language=Neue Sprache english=Englisch swedish=Schwedisch german=Deutsche title=Industri Trender select_language=Välj språk new_language=Nytt Språk english=Engelska swedish=Svenska german=Tyska submit=Rösta 演示:示例 6
SQL 标签库 3-1 通常我们会按照MVC架构模式来设计web应用程序,将对数据库的操作封装在作为模型的javaBean中。然而,在一些小型的、简单的应用中,可能需要在jsp页面中直接编写访问数据库的代码,这时可以使用sql标签库来完成
SQL 标签库 3-1 SQL 标签库用于从 JSP 页面访问和更新数据库。 SQL 标签库具有以下功能: 传递各种数据库查询 访问查询结果 数据库修改 执行各种数据库事务 使用标签库SQL标签库,要用taglib指令指定要引用的标签库 <%@taglib uri=“http://java.sun.com/jsp/jstl/sql” prefix=“sql”%>
SQL 标签库 3-2 SQL 标签库中的标签有: SQL 标签库 setDataSource query update transaction param 设置数据源 数据库查询 用于执行insert,update,delete语句 用于为<sql:query>和<sql:update>子标签建立事务处理上下文 用于设置SQL语句中标记问号(?)的参数值
SQL 标签库 3-3 在 JSP 页面中使用 SQL 标签库 setDataSource 和 update 标签的用法: 演示:示例 7 <body> <h1> 使用 SQL 标签库</h1> <c:set var = "valprice" value = "1000"/> <sql:setDataSource driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver" url = "jdbc:microsoft:sqlserver://localhost:1433;DataBaseName=sho pstop;" user="sa" password="" var="conn"/> <sql:transaction dataSource="${conn}"> <sql:update var="newTable"> CREATE TABLE ProductDetails ( ProductId int IDENTITY (1000, 1) NOT NULL primary key, ProductName varchar (20) NOT NULL , ProductType varchar (15) NOT NULL , Price varchar (5) NOT NULL , Brand varchar (25) NOT NULL , Description varchar (50) NOT NULL ) </sql:update> </sql:transaction> <sql:update var="newrow" dataSource="${conn}"> INSERT INTO ProductDetailss(ProductName, ProductType, Price, Brand, Description VALUES('牛仔裤 ', '衣服', '1000', 'Lee', '品质良好的牛仔裤') <sql:query var="products" dataSource="${conn}"> select * from ProductDetailss </sql:query> 在 JSP 页面中使用 SQL 标签库 setDataSource 和 update 标签的用法: 演示:示例 7
总结 JSTL 标签用于访问数据库、操作、设置和删除作用域变量和国际化标签 核心标签库是最常用的标签库 通用标签用于设置、删除和显示表达式的输出结果 条件标签用于有条件地执行标签 if 和 choose 标签用于有条件地执行标签 迭代标签用于多次执行标签体 forEach 和 forTokens 是迭代标签 I18N 与格式化标签库可用于创建国际化和标准化的 Web 应用程序 SQL 标签用于访问和更新数据库 SQL 标签适用于基于 Web 的小型应用程序