1、,Web开发技术基础(java) - JSTL, 计算机信息软件 部核心,什么是标记,一般为:body或: ,示例标记:,比如:使用标记的优点:提高Web应用的可重用性和可靠性。使页面清晰、简洁,易于阅读和理解。,动作(标记)库的分类:,标准动作 定制动作 开发人员自己实现的标记库 第三方软件厂商提供的标记库 JSTL标记库 各种web框架专用的标记库 Struts标记库 Spring标记库 Webwork标记库 ,自定义标签概述,JSP提供了自定义标签的机制,让设计人员可以自行建立自已的标签,并且在网页上直接使用,这种弹性的设计让JSP的标签功能可以无限的延伸。 自定义标记库是一个或多个自定
2、义标记的集合。使用自定义标记库可以提高Web应用的可重用性和可靠性。使页面清晰、简洁,易于阅读和理解。,自定义标记的方式,传统标记类 简单标记类 标记文件,JSTL简介,JSTL简介,JSTL 全名为 JavaServer Pages Standard Tag Library, 是由 JCP(Java Community Process)所指定的标准规格,它主要提供给 Java Web 开发人员一个标准通用的标签函数库。 Web 程序开发人员能够利用 JSTL 和 EL 来开发 Web 程序,取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性
3、。,JSTL简介,JSTL 是一个标准的已制定好的标签库,可以应用于各种领域,如:基本输入输出、流程控制、循环、XML 文件剖析、数据库查询及国际化和文字格式标准化的应用等。JSTL 所提供的标 签函数库主要分为五大类: (1)核心标签库 (Core tag library) (2)I18N 格式标签库 (I18N-capable formatting tag library) (3)SQL 标签库 (SQL tag library) (4)XML 标签库 (XML tag library) (5)函数标签库 (Functions tag library),taglib, 作用:将自定义的标记
4、引入到JSP页面中,供在需要的地方使用。,JSTL简介,JSTL的安装,JSTL主要由Apache组织的Jakarat Project所实现,因此需要到http:/jakata.apache.org/builds/jakarta-taglibs/realeases/standard/下载将jstl.jar和 standard.jar复制到web应用WEB-INF/lib目录下,然后就可以在JSP页面中使用JSTL了 注意:JSTL1.1以上的版本必须在支持 Servlet 2.4 且 JSP 2.0 以上版本的 Container 才可使用。,测试JSTL是否安装成功,测试你的第一个使用到 J
5、STL 的网页你使用的浏览器是:,JSTL -核心标签库,核心标签库 (Core tag library),首先介绍的核心标签库(Core)主要有:基本输入输出、流程控制、迭代操作和 URL 操作。详细的分类如表所示:,主要用来显示数据的内容,就像是 一样,例如:Hello ! 语法: 语法 1:没有本体(body)内容语法 2:有本体内容默认值, 的属性,表格中的 EL 字段,表示此属性的值是否可以为 EL 表达式,例如:Y 表示 attribute = “$表达式“为符合语法的,N 则反之。,主要用来将变量储存至 JSP 范围中或是 JavaBean 的属性中。 语法 语法 1:将 val
6、ue 的值储存至范围为 scope 的 varName 变量之中语法 2:将本体内容的数据储存至范围为 scope 的 varName 变量之中 本体内容 :,语法 3:将 value 的值储存至 target 对象的属性中语法 4:将本体内容的数据储存至 target 对象的属性中 本体内容Target为JavaBeans或Map类型,使用时的注意事项,语法 3 和语法 4 会产生异常错误,有以下两种情况:target 为 nulltarget 不是 java.util.Map 或 JavaBean 对象 假若 value 为 null 时:将由储存变量改为移除变量语法 1:由 var 和
7、scope 所定义的变量,将被移除 若 scope 已指定时,则 PageContext.removeAttribute(varName, scope) 若 scope 未指定时,则 PageContext.removeAttribute(varName)语法 3: 假若 target 为 Map 时,则 Map.remove(property) 假若 target 为 JavaBean 时,property 指定的属性为 null 说明 使用时,var 主要用来存放表达式的结果;scope 则是用来设定储存的范围, 例如:假若 scope=“session”,则将会把数据储存在 sessio
8、n 中。 如果中没有指定 scope 时,它会 默认存在 Page 范围里。,的属性,主要用来移除变量。 语法 ,属性:,说明 必须要有 var 属性,即要被移除的属性名称,scope 则可有可无,例如:若我们不设定 scope,则将会从 Page、 Request、Session 及 Application 中顺序寻找是否存在名称为 number 的数据,若能找到时, 则将它移除掉,反之则不会做任何的事情。,主要用来处理产生错误的异常状况,并且将错误信息储存起来。 语法 欲抓取错误的部分 ,属性:,说明 主要将可能发生错误的部分放在和之间。如果真的发生错误,可以将错误信息储存至 varNam
9、e 变量中,例如: /可能发生错误的部分另外,当错误发生在和之间时,则只有和之间的程序 会被中止忽略,但整个网页不会被中止。,流程控制,流程控制分类中包含四个标签:、和,的用途就和我们一般在程序中用的 if 一样。 语法 语法 1:没有本体内容(body)语法 2:有本体内容具体内容 ,的属性以及使用说明,属性,说明标签必须要有 test 属性,当 test 中的表达式结果为 true 时,则会执行本体内容;如 果为 false,则不会执行。例如:$param.username = = admin,如果 param.username 等于 admin 时,结果为 true;若它的内容不等于 a
10、dmin 时,则为 false。 除了 test 属性之外,还有另外两个属性 var 和 scope。当我们执行的时候,可以 将这次判断后的结果存放到属性 var 里;scope 则是设定 var 的属性范围。哪些情况才会用到 var和 scope 这两个属性呢?例如:当表达式过长时,我们会希望拆开处理,或是之后还须使用此结果时,也可以用它先将结果暂时保留,以便日后使用。,本身只当做 和 的父标签。 语法本体内容( 和 ) ,的使用说明,限制 的本体内容只能有: 空白 1 或多个 0 或1个 说明 若使用和来做流程控制时,两者都必须为的子标签,即:, 的用途就和我们一般在程序中用的 when
11、一样。 语法本体内容 ,的使用说明,限制必须在和之间在同一个中时,必须在之前 说明 必须有 test 属性,当 test 中的表达式结果为 true 时,则会执行本体内容;如果为false 时,则不会执行。,在同一个 中,当所有 的条件都没有成立时,则执行 的 本体内容。 语法本体内容 ,限制 必须在 和 之间 在同一个 中时, 必须为最后一个标签 说明 在同一个 中,假若所有 的 test 属性都不为 true 时,则执行 的本体内容。,迭代操作,迭代(Iterate)操作主要包含两个标签:和。, 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,
12、就会持续重复执行的本体内容。 语法 语法 1:迭代一集合对象之所有成员本体内容语法 2:迭代指定的次数本体内容 ,的属性,的使用说明,限制 假若有 begin 属性时,begin 必须大于等于 0 假若有 end 属性时,必须大于 begin 假若有 step 属性时,step 必须大于等于 0 Null 和 错误处理 假若 items 为 null 时,则表示为一空的集合对象 假若 begin 大于或等于 items 时,则迭代不运算 说明 如果要循序浏览一个集合对象,并将它的内容显示出来,就必须有 items 属性,的使用说明,除了支持数组之外,还有标准 J2SE 的集合类型,例如:Arr
13、ayList、List、LinkedList、Vector、Stack 和 Set 等等;另外还包括 java.util.Map 类的对象,例如:HashMap、Hashtable、Properties、Provider 和 Attributes。 还有 begin、end 和 step 这三种属性:begin 主要用来设定在集合对象中开始的位 置(注意:第一个位置为 0);end 用来设定结束的位置;而 step 则是用来设定现在指到的成员和下 一个将被指到成员之间的间隔。 另外,还提供 varStatus 属性,主要用来存放现在指到之成员的相关信息。例如: 我们写成 varStatus=“
14、s”,那么将会把信息存放在名称为 s 的属性当中。varStatus 属性还有另外四 个属性:index、count、first 和 last。, 用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。 语法本体内容 ,的属性,使用说明,限制 假若有 begin 属性时,begin 必须大于等于 0 假若有 end 属性时,必须大于 begin 假若有 step 属性时,step 必须大于等于 0 Null 和 错误处理 假若 items 为 null 时,则表示为一空的集合对象 假若 begin 大于或等于 items 的大小时,则迭代不运算 说明 的 begin
15、、end、step、var 和 varStatus 用法都和一样,因此只介绍 items 和 delims 两个属性:items 的内容必须为字符串;而 delims 是用来分割 items 中定义的字符串之字符。,URL 操作,JSTL 包含三个与 URL 操作有关的标签,它们分别为:、和。 它们主要的功能是:用来将其他文件的内容包含起来、网页的导向,还有 url 的产生。, 可 以 把 其他 静 态 或 动 态 文 件 包含 至 本 身 JSP 网 页 。它 和 JSP Action 的最大的差别在于:只能包含和自己同一个 web application 下的文件;而 除 了 能包含 和自
16、 己 同 一个 web application 的文 件 外, 亦 可 以包含 不同 web application 或者是其他网站的文件。,语法,语法 语法 1:本体内容语法 2:本体内容 ,的属性,使用说明,Null 和 错误处理 假若 url 为 null 或空时,会产生 JspException 说明 首先中必须要有 url 属性,它是用来设定被包含网页的地址。它可以为绝对地址或是相对地址,使用绝对地址的写法如下:就会把 http:/ 的内容加到网页中。 另外也支持 FTP 协议,假设现在有一个 FTP 站点,地址为 .tw, 它里面有一个文件 data.txt,那么可以写成如下方式将
17、其内容显示出来:如果是使用相对地址,假设存在一个文件名为 Hello.jsp,它和使用的网页存在于同一个 webapps 的文件夹时,的写法如下: ,使用说明,如果以“/”开头,那么就表示跳到 web 站点的根目录下,以 Tomcat 为例,即 webapps 目录。 假设一个文件为 hello.txt,存在于 webapps/examples/images 里,而 context 为 examples,可以写成以下方式将 hello.txt 文件包含进我们的 JSP 页面之中:接下来如果要包含在同一个服务器上,但并非同一个 web 站点的文件时,就必须加上 context属性。假设此服务器上
18、另外还有一个 web 站点,名为 others,others 站点底下有一个文件夹为 jsp,且里面有index.html 这个文件,那么就可以写成如下方式将此文件包含进来: ,使用说明,除此之外,也提供 var 和 scope 属性。当 var 属性存在时,虽然同样会把其他文件的内容包含进来,但是它并不会输出至网页上,而是以 String 的类型储存至varName 中。scope 则是设定 varName 的范围。储存之后的数据,我们在需要用时,可以将它取出来,代码如下:另外,可以在的本体内容中使用,它的功用主要是:可以将参数传递给被包含的文件,它有两个属性 name 和 value,这两
19、个属性都可以使用 EL,所以我们写成如下形式:这样的做法等于是包含一个文件,并且所指定的网址会变成如下: http:/?test=1234,主要用来产生一个 URL 语法 语法 1:没有本体内容语法 2:本体内容代表查询字符串(Query String)参数标签 ,的属性,说明 在这里我们直接使用例子来说明。可 以发 现 也 可 以 搭 配使 用,上面执行 结果 将 会 产生 一 个 网 址 为http:/?param=value,我们更可以搭配 HTML 的使用,如下:“Java 爱好者 另外还有三个属性,分别为 context、var 和 scope。context 属性和之前的 相同,可
20、以用来产生一个其他 web 站点的网址。如果有 var 属性时,则网址会被存到 varName 中,而不会直接输出网址。,可以将客户端的请求从一个 JSP 网页导向到其他文件。 语法 语法 1:没有本体内容语法 2:本体内容代表查询字符串(Query String)参数,属性及使用说明,说明 url 就是设定要被导向到的目标地址,它可以是相对或绝对地址。例如:我们写成如下:那么网页将会自动导向到 http:/。另外,我们也可以加上 context 这个属性,用来导向至其他 web 站点上的文件,例如:导向到 /others 下的 /jsp/index.html 时,写法如下:的功能不止可以导向
21、网页,同样它还可以传递参数给目标文件。在这里我们同样使用来设定参数名称和内容。,JSTL -SQL标签库,JSTL中的SQL标记库也提供了与数据库交换的能力。要使用SQL标记库,必须先使用taglib指令导入它,其语法格式如下: ,SQL标记库,使用SQL标记访问数据库的主要步骤如下: 1. 指定数据源 2. 进行查询或更新操作 3. 对返回的结果进行处理,使用SQL标记访问数据库的步骤,使用标记来指定数据源,其语法为:url属性用于指定连接的url。如连接Oracle数据库时的url为:jdbc:oracle:thin:ip:port:sid driver属性用于指定驱动程序,如Oracle
22、数据库的驱动程序为:oracle.jdbc.driver.OracleDriver user属性和password属性则分别用于指定用户名和密码。 scope属性指定该设置的有效范围 (注意:如果使用了var属性,则只是将该数据源保存到一个变量中),SQL标记访问数据库步骤1指定数据源,使用标记可以进行数据库查询,其语法为: 也可以将查询语句放在标记本体中,如:sql属性指定需要执行的SQL查询语句;属性var指定存储查询结果对象的变量名;还有scope属性指定有效范围。,SQL标记访问数据库步骤2进行查询或更新操作,如果前面执行的是查询操作,则会将返回的结果保存在一个Result类型的变量中
23、(返回的结果一般是一个二维表) 该变量一般有如下几个属性:rows:一个Map对象的数组rowsByIndex:一个对象数组的数组columnNames:列名的数组rowCount:返回结果的行数limitedByMaxRows:查询是否有最大行数限制-boolean型,SQL标记访问数据库步骤3处理返回的结果,查询的结果一般是一个二维表,假如保存在变量x中,并且该表中有三个字段name、sex、score。则输出该表信息的方法为:(1). 使用rows属性$temp.name、$temp.sex、$temp.score(2). 使用rowsByIndex属性$temp0、 $temp1 、
24、$temp2 ,另两个属性的使用方法如下:(1). 可以使用columnNames属性输出各列的名称$temp(2). 可以使用rowCount属性输出返回结果的行数$x.rowCount,使用进行数据库的更新操作,如创建表、插入和删除记录等。其常用语法为:也可以将更新语句放到标记本体中更新语句可选var属性用于指定修改操作影响的数据记录行数。,和这两个标记用来动态地设定变量 说明: 假如我们的SQL指令需要一些动态变量,我们可以写成如下形式:select * from user where id=$userid如上的写法则会出现一些问题: 当userid的内容为jason or userid
25、jason时则会所有的结果都会出来,为此 我们将上面的语句改成如下即可:select * from user where id=?只是用来设置日期相关的参数,如timeStamp、date、time,有的时候,我们单个事务需要多条sql语句才能执行,这些SQL语句要么全部执行要么一个也不执行,这个时候我们可以使用标记。 语法:多个和标记,一个将JDBC连接数据库 改为使用SQL标记连接的例子 (参见下面三页),JDBC连接的例子:“ ); rs.close(); stmt.close(); con.close(); %,使用SQL标记库连接的例子-1姓名:$temp0性别:$temp1分数:$
26、temp2 ,使用SQL标记库连接的例子-2姓名:$temp.name性别:$temp.sex分数:$temp.score ,另一个将JDBC连接数据库 改为使用SQL标记连接的例子 (参见下两页),JDBC连接的例子:,使用SQL标记库连接的例子-3,课堂练习,使用SQL标记更改前面课堂练习中的用户注册功能,1用户注册 2用户登录 3图书信息管理(图书信息增删改查),综合实例图书信息管理系统,作业,编写上面的HTML页面1.htm 设计并写出相应的表结构 使用JDBC编写JSP页面1.jsp,将以上页面的数据存入数据库中 使用SQL标记改写1.jsp,附录常见JDBC驱动程序和URL,JDB
27、CODBC桥: Driversun.jdbc.odbc.JdbcOdbcDriver URLjdbc:odbc:数据源名 oracle Driveroracle.jdbc.driver.OracleDriver URLjdbc:oracle:thin:主机名:1521:数据库名 SQLServer Drivercom.microsoft.jdbc.sqlserver.SQLServerDriver URLjdbc:microsoft:sqlserver:/主机名:1433;DatabaseName=数据库名 MySql Driverorg.gjt.mm.mysql.Driver URLjdbc
28、:mysql:/主机名:3306/数据库名 DB2 Drivercom.ibm.db2.jdbc.app.DB2Driver URLjdbc:db2:/主机名:50002/数据库名 返回,JSTL -I18N标签库,I18N应用背景,随着电子商务以及其他Web应用的普及,确保世界各地的客户能够使用其本地语言方便地访问这些服务就变得非常重要。 JSTL的格式标记库提供了国际化的标记集,用于处理和解决国际化相关的问题。,应用的国际化和本地化:世界各地的客户能够使用其本地语言方便的访问各种组织提供的Web应用服务,也就是针对特定语言和地区来定义应用。 JSTL的格式标记库提供了国际化标记集,用于处理
29、和解决与国际化相关的问题。 国际化(I18N):Internationalization 本地化(L10N):Localization I18N标记可以指定特定的本地属性(Local),控制数据的显示格式。 I18N标记提供对资源包(Resource Bundles)的访问,资源包中包含了特定语言的相关项目。,I18简介,I18N主要包含国际化、消息和数字日期格式化等标签,在JSP页面中使用JSTL国际化标记库时,需要先使用taglib指令导入它,语法格式如下: ,国际化,国际化类别的标记中包含两个标签,一个是设定语言区域的另一个则是设定请求字符串编码的,用来设置用户的语言地区 语法:说明:
30、ll:为两个字母代表语言代码,例如:zh(中文)CC:代表国家代码,例如:CN(中国) 其中value的取值为地区代码,具体的取值参见http:/www.w3.org/WAI/ER/IG/ert/iso639.htm,默认情况下,I18N标记依据浏览器的设定来确定本地属性值。使用标记会覆盖浏览器本地属性设置。 在Web应用的web.xml文件中,可以使用标记设置整个Web应用默认的本地属性。,属性说明,注:当value值为null时,则使用默认的区域设置,用来设置字符串的编码,具体的作用和request内置对象的setCharacterEncoding()方法的功能完全相同 语法:说明:该标记
31、只有一个value属性,如果没有设定value属性,则它会自动去寻找合适的编码方式 默认的编码格式:ISO-8859-1 对于非ISO-8859-1的字符(如:中文),需要显式指定字符集编码。 例如:,消息标记库,消息标记库中包含四个标记:。他们的主要作用为获取系统设定的语言资源,使用这些标记可以让我们轻易地使我们的Web应用支持国际化。,资源文件,资源包:为了能够在浏览器端用本地属性指定的语言显示内容,一般需要开发人员为需要支持的每个本地属性都提供一个资源集合,通常称为资源包。 资源包中包含标准的“键-值”对表示的本地属性。 资源包可以用java类实现,也可以用一个文本的属性文件(资源文件)
32、实现: 一种方式是使用java类实现的资源包 具体实现见P183 一种是使用纯文本实现的资源文件 具体实现见P185,资源包的命名:文件名中只有后缀的本地属性串不同。 资源包的内容:文件内容使用相同的键名,不同语言的键值。 示例1:用java实现的资源包,P183-184,Resources_zh.java和Resource_en.java 示例2:用资源文件实现的资源包,P185-186,ResourceProps_en.properties和zh.properties,主要用来设定本体内容的数据源 语法:本体内容注:如果basename为null、空或找不到资源文件时,在网页上会产生”?”
33、的错误信息,的属性,说明:basename属性设置要使用资源的名称,如如果资源文件的名称为MyResource.properties,那么basename的值为MyResource。注意千万不可以有任何文件类型。,可以用来设定默认的资源文件,或者将其设置到指定的属性范围中去。 语法:注意:若basename为null、空或者无法找到资源文件时,在网页上会产生”?”错误信息,Basename设定要使用的资源文件,和相同,如果没有设定var时,那么设定好的资源文件会成为默认的资源文件,让在同一个网页或同一个属性范围内都可以直接使用此资源文件。相反,如果设定var时,那么将会将资源文件存储到varN
34、ame中,当使用时,必须使用bundle这个属性来指定。如:如果没有指定var,则只需写成:,会从从指定的资源中把指定的关键字获取出来 语法: 语法1: ,语法2:语法3:索引,注:若key为null或空是,在网页上产生“?”的错误信息, 若找不到资源文件,在网页上灰产生”?”的错误信息 说明:如果没有key属性,那么将会自动从本体内容中寻找关键字,再从关键字中寻找对应的结果,显示在页面中。Bundle属性则是指定使用的资源文件,var和scope用来存储要显示的信息。如果有var属性,该标记则不会把结果显示在页面中,而是将结果存储在varname中,要进行显示则必须使用或$EL表达式,当我们
35、从资源文件获取内容时,有时候需要动态设置参数,就是用来提供这些参数 语法1:通过value属性设置参数值语法2:通过本体设定参数值本体内容说明:value如果没有设定要给予的参数,那么就会默认去获取本体内容当作要传递的参数,Prefix用来设置前置关键字,例如当properties文件的内容如下时: Requestinfo.label.method=Method Requestinfo.label.protocol=Protocol 我们就可以使用如下的方式使其内容显示出来:,数字、日期格式化,数字、日期格式化共包含6个标签,分别为,他们分别用来解析或格式化数字、日期以及货币等。一般用于将数字
36、、日期等转换成指定地区或自定义的显示格式。,语法:本体内容,如:格式化的时间,日期等作用:指定时区,其本体内容会以指定时区的时间格式来解析和显示。由于该标记的设置只影响其本体内容,也称暂时时区。 timeZone是时区的ID,例如:America/Los_Angeles,GMT-8等。 如果value的值为空或null,则默认为GMT时区。,语法:作用:将value属性指定的时区值存储到一个var变量中。变量的有效范围由scope指定,默认页内有效。 如果value的值为空或者null,则默认为GMT时区。 如果没有使用var指明变量,则value的值保存在当前配置变量(javax.servl
37、et.jsp.jstl.fmt.timeZone)中,作为有效范围内的默认时区。,会依据设定的区域将数字改为适当的格式。 语法 语法1:没有本体内容示例:formatNum.jsp,语法2:本体为欲格式化的内容欲格式化的数字 ,的属性,关于的说明,当无法确定区域时,则输出的格式为Number.toString() 如果pattern为null或者空时,则pattern将会被忽略 详细的pattern设定可以参考http:/ currencyCode为货币代码,如美元就是USD,详细的货币代码可以至http:/www.bsi- 语法: 语法1:没有本体的内容 ,语法2:有本体的内容待转换为字符串
38、的字符串 ,的属性,说明:若pattern为null或空时,pattern将被忽略示例:parseNum.jsp,作用:以指定的时区格式化显示日期对象(java.util.Date)。 语法:,value指定需要格式化显示的日期和时间。 type指定给定的数据的处理方式为日期、时间还是日期时间都处理。 dateStyle和timeStyle指定日期和时间的显示格式。 Pattern属性指定自定义格式,如“dd/MM/yyy”等。见P197 timeZone指定时区,如果没有指定,默认使用本地属性中的时区。 示例:formatDate1.jsp,fomatDate2.jsp,作用:将字符串表示的
39、日期和时间解析成日期对象(java.util.Date)。 语法:,value属性指定需要解析成日期对象的字符串。该属性可以省略,由本体来指定要解析的内容。 解析结果可以使用属性var指定的变量存储。变量的有效范围由scope指定。如果没有var属性,解析结果会输出到JSP页面,否则不会输出。 属性parseLocale指定本地属性的值。类型为java.util.Locale。 示例:parseDate.jsp,JSTL -EL函数标签库,主要内容,1 JSTL标准函数 2 自定义函数,JSTL的标记库提供了大量的标准函数,其中大部分都是字符串处理函数。在JSP页面中使用JSTL的函数标记库时
40、,需要先使用taglib指令导入它,语法格式如下: ,JSTL标准函数,获取字符串长度函数length 改变字符串大小写函数toLowerCase, toUpperCase 获取字符串的子串函数substring, substringAfter, substringBefore 去除字符串两头的空格函数trim 替换字符串中的子串函数replace 检查字符串是否包含指定的子串函数indexOf, startsWith, endsWith, contains, containsIgnoreCase 分割字符串函数split,合并字符串函数join 字符串中XML标记的转义处理函数escapeX
41、ml,JSTL中的主要函数,length函数用于获取字符串长度或集合(包括数组、Enumeration、List、Map等)中元素的个数,其语法为:fn:length( string|collection )例:length.jsp,length函数,toLowerCase函数用于将字符串转换为全是小写字母,toUpperCase函数用于将字符串转换为全是大写字母,其语法为:fn:toLowerCase(string)fn:toUpperCase(string)例:stringConvert.jsp,toLowerCase和toUpperCase函数,substring函数用于返回某个字符串指
42、定位置上的子串,其语法为:fn:substring(string, startPos, endPos)如:$fn:substring(“Abracada”, 2, 5)的返回值为“rac”(说明:字符串中的字符编号是从0开始的;返回的子串是从开始位置到结束位置-1的子串;另,如果结束位置大于字符串长度,则取字符串长度,如果开始位置小于0,则取0),substring函数,substringAfter函数用于获取指定的子串之后的字符串,其语法为:fn: substringAfter( string, string_to_find )如:$fn: substringAfter(“http:/”,
43、“http:/”)返回的结果为“”(说明:如果第二个参数子串在第一个参数字符串中出现多次,则返回第一次出现后的部分;如果第二个参数子串在第一个参数字符串中没有出现,则返回空字符串“”),substringAfter函数,substringBefore函数用于获取指定的子串之前的字符串,其语法为:fn:stringBefore( string, string_to_find )如:$fn:stringBefore(“http:/”, “:/”)返回的结果为“http”(说明:如果第二个参数子串在第一个参数字符串中出现多次,则返回第一次出现前的部分;如果第二个参数子串在第一个参数字符串中没有出现,
44、则返回空字符串“”),substringBefore函数,例:subString.jsp,EL函数是可以嵌套使用的比如: $ fn:toUpperCase( fn:substring(“abcdefgh”, 2, 6) ) 返回的结果为“CDEF”,EL函数的嵌套使用,练习使用前面讲过的length、toLowerCase、toUpperCase、substring、substringAfter、substringBefore等函数; 输出字符串“Real romance love letter!”的长度,并将位于子串“love”后面的所有字符转换成大写字母输出。,课堂练习(一),trim函数
45、用于去除字符串两端的空格,并返回处理后的结果。其语法为:fn:trim(string)如:$fn:trim(“ Hello 2008 ”)返回的结果为“Hello 2008”(如果参数为null,则返回空字符串“”) 例:trim.jsp,trim函数,replace函数用于将字符串中的某个子串替换为指定的字符串,并将替换后的结果字符串返回。其语法为:fn:replace(string, string_tofind, string_replace)如果三个参数中的任何一个为null,都作为空字符串“”处理。(例子参见下页),replace函数,例1:$fn:replace(“Abracadab
46、ra”, “bra”, “ZZZ”)返回的结果为“AZZZcadaZZZ”。例2:$fn:replace(“Abracadabra”, “bra”, “”)相当于删除原字符串中的“bra”子串,返回结果为“Acada”。例3:$fn:replace(“Abracadabra”, “”, “ZZZ”)返回原字符串“Abracadabra”。,indexOf函数返回指定的子串在原字符串中第一次出现的位置。其语法为:fn:indexOf(string, string_tofind)如果指定的子串在原字符串中不存在,则返回-1例如:$fn:indexOf(“Acbracadabra”, “bra”)的
47、返回值为2,$fn:indexOf(“Acbracadabra”, “kzam”)的返回值为-1。,indexOf函数,startsWith函数在指定的字符串是以给定子串开始的情况下返回true,否则返回false。其语法为:fn:startsWith(string, string_tofind)两个参数中任何一个为null,都作为空字符串“”处理(例子参见下页),startsWith函数,例1:$fn:startsWith(“Abracadabra”, “Abr”)返回的结果为true例2:$fn:startsWith(“Abracadabra”, “bra”)返回的结果为false例3:
48、$fn:startsWith(“Abracadabra”, “”)返回的结果为true(如果第二个参数为“”,则返回的结果总是true),endsWith函数在指定的字符串是以给定子串结束的情况下返回true,否则返回false。其语法为:fn:endsWith(string, string_tofind)两个参数中任何一个为null,都作为空字符串“”处理(例子参见下页),endsWith函数,例1:$fn:endsWith(“Abracadabra”, “bra”)返回的结果为true例2:$fn:endsWith(“Abracadabra”, “ada”)返回的结果为false例3: $fn:endsWith(“Abracadabra”, “”)返回的结果为true(如果第二个参数为“”,则返回的结果总是true),