您的位置:首页 > Web前端 > JavaScript

Servlet&JSP 第七章 使用JSTL

2017-06-12 12:35 471 查看

一、JSTL简介

1、JSTL简介

不仅提供了条件判断的逻辑标签,还提供了对应JSP标准标签的扩展标签以及更多的功能标签。

(1)JSTL提供的标签库(五大类):

核心标签库:提供条件判断、属性访问、URL及错误处理等标签。

I18N兼容格式标签库:提供数字、日期等的格式化功能,以及区域、信息、编码处理等国际化功能的标签。

SRL标签库:提供基本的数据库查询、更新、设置数据源等功能的标签。

XML标签库:提供XML解析、流程控制、转换等功能的标签。

函数标签库:提供常用字串处理的自定义EL函数标签库。

(2)要使用JSTL标签库,必须在JSP网页上使用taglib指示元素定义前置名称与uri参考。

例1、要是用核心标签库,可以进行如下定义:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


2、核心标签库

(1)流程处理标签

当JSP页面必须根据某个条件来安排网页输出时,则可以使用流程标签。例如。想要依用户输入的名称、密码请求参数,来决定是否显示这个画面,或是想要用表格输出是个数据等。

<c:if>标签:可根据某个表达式的结果,决定是否显示Body的内容。<c:if>标签的test属性中可以放置EL表达式,如果表达式的结果为true,则会将<c:if>Body输出。<c:if>标签没有对应的<c:else>标签。如果想要在某条件式成立时显示某些内容,不成立时就显示另一内容,则可以使用<c:choose>、<c:when>及<c:otherwise>标签。

<c:when>及<c:otherwise>标签必须放在<c:choose>标签中。当<c:when>及<c:otherwise>标签的test运算结果为true时,会输出<c:when>的Body内容,而不理会<c:otherwise>内容。<c:choose>标签中可以有多个<c:when>标签,此时会从上往下进行测试,如果有个<c:when>标签的test运算结果为true就输出其Body内容,之后的<c:when>就不会做测试,如果所有的<c:when>测试都不成立,就回输出<c:otherwise>的内容。

<c:forEach>标签:<c:forEach>标签的items属性可以是数组、Collection、Iterator、Enumeration、Map与字符串,每次会依序从items指定的对象中取出一个元素,并指定给var属性设置的变量,之后就可以在<c:forEach>标签Body中使用var属性所设置的变量来取得该元素。

如果items指定的是Map,则设置给var的对象会是Map.Entry,这个对象有getKey()与getValue()方法,可以取得键与值。

例2、<c:forEach var="item" items="${someMap}" >
Key:${item.key}<br>
Value:${item.value}<br>
</c:forEach>

如果items指定的是字符串,则必须是个以逗号区隔的值,<c:forEach>会自动以逗号来切割字符串,每个切割出来的字符串指定给var。

例3、<c:forEach var="token" items="Jacva,C++,C,JavaScript">
${token}<br>
</c:forEach>
如果希望自行指定切割依据,则可以使用<c:forToken>。

例4、<c:forToken var="token" delims=":" items="Java:C++:C:JavaScript">
${token}<br>
</forToken>

2、错误处理标签

(1)如果要在发生异常的网页直接捕捉异常对象,可以使用<c:catch>将可能产生异常的网页段落包括起来。若异常真的发生,这个异常对象会设置给var属性所指定的名称,这样才有机会使用这个异常对象。

(2)只有设置isErrorPage=“true”的JSP网页才会有exception隐式对象,代表错误发生的来源网页传进来的Throwable对象。

3、网页导入、重定向、URL处理标签

(1)<c:import>标签:可以在运行时动态导入另一个页面,也可以搭配<c:param>在导入另一个网页时带有参数。除了导入目前Web应用程序中的网页之外,<c:import>标签还可以导入非目前Web应用程序中的网页。

例5、<c:import url="http://openhome.cc" charEncoding="BIG5" />


charEncoding属性用来指定要导入的网页的编码,如果要被导入的网页编码与目前网页编码不同,就必须使用charEncoding属性加以指定,导入的网页才不至于出现乱码。

(2)<c:redirect>标签:进行重定向,如果重定向时需要参数,也可以通过<c:param>标签来设置。

(3)<c:url>标签:会在用户关闭Cookie功能时,自动用Session ID做URL重写。

4、属性处理与输出标签

(1)<c:set>标签:属性设置标签。如果想要在page、request、session、application等范围设置一个属性,或者想要设置Map对象的键与值,则可以使用<c:set>标签。

例6、用户登录后,在session范围中设置一个login属性,代表用户已经登录:
<c:set var="login" value="caterpillar" scope="session" />     //var用来设置属性名称,value用来设置属性值                                                  用EL来进行设置:                                                                                                                                          <c:set var="login" value="${user}" scope="session" />     //如果${user}运算的结果是User类的实例,则保存的属性是User


例7、<c:set var="details" scope="session" >
caterpillar,openhome.cc,caterpillar.onlyfun.net
</c:set>


<c:set>标签不设置scope时,则会以page、request、session、application的范围寻找属性名称,如果在某个范围找到属性名称,则在该范围设置属性,如果在所有范围都没有找到属性名称,则会在page属性范围新增属性。

<c:set>标签也可以用来设置JavaBean的属性或Map对象的键与值,要设置JavaBean或Map对象,必须使用target属性进行设置。

例8、<c:set target="${user}" property="name" value="${param.name}" />                                                                                      如果${user}运算出来的结果是个JavaBean,则调用setName()方法并将请求参数name的值传入,如果${user}运算出来的结果是个Map,则就以property属性作为键,而value属性作为值来调用Map对象的put()方法。

(2)<c:remove>标签:移除某个属性

例9、<c:remove var="login" scope="session" />
(3)<c:out>标签:输出指定的文字。<c:out>会自动将角括号、单引号、双引号等字符用替代字符取代,这个功能由<c:out>的escapeXml属性来控制,默认是true,如果设置为false,就不会做替代字符的取代。可以用default属性设置EL运算结果为null时默认显示值。

例10、<c:out value="${param.a}" default="0" />

二、I18N兼容格式标签库

应用程序根据不同的国家用户,呈现不同的语言、数字格式、日期格式等,这成为本地化。如果一个应用程序在设计时,可以在不修改应用程序的情况下,根据不同的用户直接采用不同的语言。数字格式、日期格式等,这样的设计考量称为国际化,简称I18N。JSTL提供了I18N兼容格式标签库,可协助Web应用程序完成国际化功能,提供数字、日期等格式功能,以及区域、信息、编码处理等国际化功能的标签。

1、I18N基础

(1)关于Java字符串

Java的字符串是Unicode,所以写下一个英文字符或写下一个中文字符,都是两个位元组。当使用javac脚本没有指定-encoding选项时,或使用操作系统默认编码,如果文本编辑器是使用UTF-8编码,那么编译时就要指定-encoding为UTF-8,这样编译器才会知道用何种编译读取.java的内容。

例11、>javac -encoding UTF-8 Main.java


(2)关于ResourceBundle

对于日后可能变动的文字信息,可以考虑将信息移至程序之外,方法是使用java.util.ResourceBundle来作信息绑定。首先准备一个.properties文件,.properties文件必须放置在Classpath的路径设置下,文件中编写的是键、值配对,之后在程序中可以使用键来取得对应的值。ResourceBundle的静态getBundle()方法会取得一个ResourceBundle的实例,所给定的自变量名称是信息文件的主档名,getBundle()会自动找到对应的.properties文件,取得ResourceBundle实例后,可以使用getString()指定键来取得文件中对应的值。如果日后想要改变显示的信息,只要改变.properties文件的内容就可以了。

(3)关于国际化

国际化的三个重要概念是地区信息、资源包与基础名称。

地区信息代表了特定的地理、政治或文化区,地区信息可由一个语言编码与可选的地区编码来指定。其中语言编码是ISO-639定义,由两个小写字母表示。地区编码则由两个大写字母表示,定义在ISO-3166。地区信息的对应类是Locale,在创建Locale时,可以指定语言编码与地区编码。

例12、创建代表中国的Locale
Locale locale=new Locale(“zh”,”CN”);

资源包中包括了特定地区的相关信息,ResourceBundle对象就是JVM中资源包的代表对象。代表同一组信息但不同地区的各个资源包共享系统的基础名称,使用ResourceBundle的getBundle()时指定的名称,就是在指定基础名称。例如,ResourceBundle的getBundle()时若指定“messages”,则会尝试用默认的Locale(由Locale.getDefault()取得的值)取得.properties文件。例如,若默认的Locale代表zh_CN,则ResourceBundle的getBundle()时若指定“messages”,则会尝试取得messages_zh_CN.properties文件中的信息,若找不到,再尝试找messages.properties文件中的信息。

JDK工具程序native2ascii程序会将非ASCII字符转换为Unicode编码表示,如果想将Unicode编码表示的.properties转回回文,则可以使用-reverse自变量。

例13、>native2ascii -reverse -encoding UTF-8 messages_zh_CN.properties messages_zh_CN.txt


2、信息标签

要使用JSTL的I18N兼容格式标签库,必须在JSP网页上使用taglib指示元素定义前置名称与uri引用。惯例上使用I18N兼容格式标签库时,会使用fmt作为前置名称。

例14、<%@taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt”%>


(1)<fmt:bundle>、<fmt:message>标签

<fmt:bundle>指定basename属性为“XXX”,这表示默认的信息文件为XXX.properties,使用<fmt:message>的key属性则指定信息文件中的哪条信息。也可使用<fmt:setBundle>标签设置basename属性,设置的作用域默认是整个页面都有作用,如果额外有<fmt:bundle>设置,则会以<fmt:bundle>的设置为主。

如果信息中有些部分必须动态决定,则可以使用占位字符先代替。<fmt:message>有个bundle属性,可用以指定LocalizationContext对象,可以在创建LocalizationContext对象时指定ResourceBundle与Locale对象。

例15、cc.openhome.forUser=Hi!{0}!It is {1,date,long} and {2,time,full}


如果想设置占位字符的真正内容,则使用<fmt:param>标签。

3、地区标签

(1)在Java EE中使用ResourceBundle时根据基础名称取得对应的信息文件:

使用指定的Locale对象取得信息文件;

使用Locale.getDefault()取得的对象取得信息文件;

使用基础名称取得信息文件;

(2)在JSTL中决定信息文件的顺序:

使用指定的Locale对象取得信息文件;

根据浏览器Accept-Language标头指定的偏好地区顺序,这可以使用HttpServletRequest的getLocales()来取得;

根据后备地区信息取得信息文件;

使用基础名称取得信息文件;

(3)如果要共享Locale信息,则可以使用<fmt:setLocale>标签,在value属性上指定地区信息。<fmt:setLocale>会调用HttpServletResponse的setLocale()设置响应编码。<fmt:bundle>、<fmt:setBundle>或<fmt:message>也会调用HttpServletResponse的setLocale()设置响应编码。如果使用了setCharacterEncoding()或setContentType()时指定了charset,则setLocale()就会被忽略。

(4)<fmt:requestEncoding>标签用来设置请求对象的编码处理,它会调用HttpServletRequest的setCharacterEncoding(),所以必须在取得任何请求参数之前使用。

(5)<fmt:message>等标签会使用LocalizationContext取得地区与资源包信息,<fmt:setLocale>会在属性范围中设置LocalizationContext,如果想要使用代码设置LocalizationContext对象,则可以通过javax.servlet.jsp.jstl.core.Config的set()方法来设置。

(6)在设置LocalizationContext时可以指定属性范围,<fmt:message>会自动在四个属性范围中依次搜寻LocalizationContext,找到的话就使用,如果后续有使用<fmt:setLocale>或指定<fmt:message>的bundle属性,则以后续指定为主。

(7)可直接指定属性名称默认指定LocalizationContext的方式。





4、格式标签

JSTL的格式标签可针对数字、日期与时间,搭配地区设置或指定的格式来进行格式化,也可以进行数字、日期、时间的解析。

(1)<fmt:formatDate>标签:默认用来格式化日期,可根据不同的地区设置来呈现不同的格式。dateStyle属性用来指定日期的详细程度,可设置的值有default、short、medium、long、full。如果想显示时间,则要在type属性上指定time或both,默认是date。timeStyle属性用来指定时间爱你的详细程度,可设置的值有default、short、medium、long、full。pettern属性可自定义格式,格式的指定方式与java.text.SimpleDateFormat的指示方式相同。timeZone属性可以进行时区设置。

例16、<fmt:formatDate value=”${now}” dateStyle=”full” /><br>
<fmt:formatDate value=”${now}” type=“time” timeStyle=”full” /><br>
<fmt:formatDate value=”${now}” pattern=“dd.MM.yy” /><br>


(2)<fmt:timeZone>标签:可指定时区,可使用字符串或java.util.TimeZone对象指定,如果需要全局的时区指定,则可以使用<fmt:setTimeZone>标签,也可以通过属性范围或Config对象来设置。

 


(3)<fmt:formatNumber>标签:默认用来格式化数字,可根据不同的地区设置来呈现不同的格式。type属性可设置的值有number(默认)、currency、percent,指定currency时会将数字按货币格式进行格式化,指定为percent时会以百分比格式进行格式化。currencySymbol属性可指定货币符号。Pattern属性指定格式的方式与java.text.DecimalFormat的说明相同。

例17、<fmt:formatNumber value=“123.456” /><br>
<fmt:formatNumber value=“123.456” type=“currency” /><br>
<fmt:formatNumber value=“123.456” type=“currency” currencySymbol=“新台币” /><br>
<fmt:formatNumber value=“123.456” type=“percent” /><br>
<fmt:formatNumber value=“123.456” pattern=“#,#00.0#” /><br>


(4)<fmt:parseDate>标签与<fmt:parseNumber>标签用来解析日期,可以在value属性上指定要解析的数值,可以依指定的格式将数值解析为原有的日期、时间或数字类型。

(5)格式化标签会使用<fmt:bundle>标签指定地区信息,格式化标签库也会设法在可取得的LocalizationContext中寻找地区信息(如使用<fmt:setLocale>设置)。如果格式化标签无法从LocalizationContext取得地区信息,则会自行创建地区信息。

(6)格式化标签寻找地区信息的顺序:

使用<fmt:bundle>指定的地区信息;

寻找LocalizationContext中的地区信息,也就是属性范围中有无javax.servlet.jsp.jstl.fmt.localizetionContext属性;

使用浏览器Accept-Language标头指定的偏好地区;

使用后备地区信息;

三、XML标签库

1、XPath、XSLT基础

(1)XPath路径表示

XPath是用来寻找XML文件中特定信息的语言,它使用路径表示来定义XML文件中的特定位置,以取得想要的信息。

(2)可以在路径表示上加上谓语,指定寻找特定的位置、属性、值的节点,谓语使用[]来表示。

(3)若不指定节点名称或属性名称,也可以使用*万用字符。例如,title{@*}表示有任意属性的<title>属性。/bookmarks/*表示选择<bookmarks>节点下的所有子元素。若要同时使用两个不同的表达式,则可以使用|符号。例如,//bookmark/title|//bookmark/url表示选择<bookmark>中<title>元素与<url>元素。







2、XSTL基础

XSTL是指XSL转换,主要是将XML文件转换为另一份XML文件、HTML或XHTML的语言。

(1)XSTL在选择元素时,使用XPath表达式。

3、解析、设置与输出标签

(1)若要使用JSTL的XML标签库,必须使用taglib只是元素进行定义。

例18、<%@taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml” %>


(2)要使用XML标签库处理XML文件,首先必须先解析XML文件,这通过<x:parse>标签来完成,解析的文件来源可以是字符串或Reader对象。若要指定String或Reader作为XML文件来源,必须使用<x:parse>的doc属性,var属性指定了解析结果要储存的属性名称,默认会储存在page属性范围,可以使用scope来指定保存范围,也可以在<x:parse>的Body放置XML进行解析。

例19、<c:import var=”xml” url=”bookmarks.xml” charEncoding=”UTF-8” />
<x:parse var=”bookmarks” doc=”${xml}” />


(3)完成XML文件的解析后,若要取得XML文件中的某些信息并加以输出,则可以使用<x:out>标签。Select属性必须指定XPath表达式,以$作为开头,后面接着<x:parse>解析结果储存时的属性名称,默认会从page范围取得解析结果。

例20、<x:out select=”$bookmarks//bookmark[2]/title” />


如果想要指定从某个属性范围取得解析结果,则可以使用XPath隐式变量绑定语法。

例21、<x:out select=”$pageScope:bookmarks//bookmark[2]/title” />


XPath隐式变量绑定语法中的隐式变量名称,不仅可以使用pageScope、requestScope、sessionScope与applicationScope,还可以使用其他EL隐式变量名称。

例22、通过请求参数来指定选择哪一个<bookmark>节点
<x:out select=”$bookmarks//bookmark[@id=$param:n]/title”scope=“session” />


(4)如果只是要取得值并储存至某个属性范围,则可以使用<x:set>标签。<x:set>默认将取得的结果储存至page属性范围,可以使用scope属性来指定为其他属性范围。

例23、<x:set var=”title” select=”$bookmarks//bookmark[2]/title” />


4、流程处理标签

XML标签库为了方便直接根据XML来处理页面逻辑,提供了<x:if>、<x:forEach>、<x:choose>、<x:when>、<x:otherwise>等标签。

(1)<x:if>标签是在select属性指定选择的元素存在时执行。

(2)如果想要选择的元素不只有一个,想要逐一取出元素做某些处理,则可以使用<x:forEach>标签。

5、文件转换标签

(1)如果已经定义好XSTL文件,则可以使用<x:transform>、<x:param>直接进行XML文件转换。

(2)<x:transform>的doc属性是XML文件,xslt属性是XSLT文件。

(3)<x:param>可以将指定值传入XSTL以设置<xsl:param>的值。

6、函数标签库

(1)字符串处理的相关函数:

改变字符串大小写:toLowerCase、toUpperCase

取得子字符串:substring、substringAfter、substringBefore

裁剪字符串前后空白:trim

字符串取代:replace

检查是否包括子字符串:startsWith、endsWith、contains、containsIgnoreCase

检查子字符串的位置:indexOf

切割字符串为字符串数组:split

连接字符串数组为字符串:join

替换XML字符:escapeXML
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: