幻灯片2
本章主要内容
l EL表达式
l 为什么使用JSTL
l JSTL核心标记库
l 国际化/格式化标签
l EL
幻灯片3
1. EL表达式
l 1.1 为什么使用EL表达式
l 在JSP中完成动态信息输出的技术有三种:
l out对象;如:<%out.println(“ hello”);%>
l 表达式;如:<%=45%>
l 表达式语言;如:${45}
l EL(Expression Language)表达式既可以和JSP中的Java代码结合使用,也可以和JSTL结合使用,从而大量减少JSP页面中的Java代码量,增强程序的可读性。
幻灯片4
1.2 EL语法
l 1、语法结构
l ${expression}
l 2、[ ]与.运算符
l EL 提供“.“和“[ ]“两种运算符来存取数据。
l (1)当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:
l ${ user. My-Name}应当改为${user["My-Name"] }
l (2)如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
l ${sessionScope.user[data]}中data 是一个变量
幻灯片5
1.2 EL语法
l 3、变量
l EL存取变量数据的方法很简单,${username}。它的意思是取出某一范围中名称为username的变量。
l 没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
l 假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
幻灯片6
1.2 EL语法
l 4、运算符
l 1.算术运算符有五个:+、-、*或$、/或div、%或mod
l 注意:/运算结果为浮点数,若为整数需用fmt标签;使用英文运算符,运算符两边应有1个空格;
l 2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
l 如判断两个密码是否相等:${param.password1==param.password2}
l ${param.password1}== ${param.password2}是错误的
l 3.逻辑运算符有三个:&&或and、||或or、!或not
l 4.其它运算符有三个:Empty运算符、条件运算符、()运算符
例:${empty param.name}、 ${not empty param.name} 、${A?B:C}、${A*(B+C)}
幻灯片7
1.2 EL语法
l 5、类型转换
l 在EL中,变量会自动进行数据类型的转换;其中,null或者“”转换为0;
l 在程序中,设置变量的初始值使用request对象的setAttribute()方法。
幻灯片8
1.3 EL隐含对象
l 1.与范围有关的隐含对象。包含以下四个:
pageScope、requestScope、sessionScope 和applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;在EL中,这四个隐含对象只能用来取得范围属性值(即getAttribute(String name)),却不能取得其他相关信息。
l 例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
session.getAttribute("username") 取得username的值,
在EL中则使用下列方法
${sessionScope.username}
幻灯片9
1.3 EL隐含对象
l 2.与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如我们要取得用户的请求参数时,可以利用下列方法:
String request.getParameter(String name)
String[] request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}
param表明请求包含的参数为单一控件,paramValues表明请求包含的参数为控件数组。
幻灯片10
1.3 EL隐含对象
l 3.其他隐含对象
l cookie
l JSTL并没有提供设定cookie的动作,
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。
l header和headerValues
l header 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header[“User-Agent”]}。
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。
l initParam
l initParam取得设定web站点的环境参数(Context)
例:一般的方法String userid = (String)application.getInitParameter("userid");
可以使用 ${initParam.userid}来取得名称为userid
幻灯片11
1.3 EL隐含对象
l pageContext
l pageContext取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString} 取得请求的参数字符串
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath} 服务的web application 的名称
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
幻灯片12
1.4示例:
l 修改登录页面:
幻灯片13
1.5 用EL操作JavaBean:
1、生成一个JavaBean:
(1)<% Box box=new Box();
box.setLength(10); box.setWidth(20);
box.setHeight(30);
request.setAttribute(“box”,box); %>
(2)<jsp:useBean id=“box" class=“Box">
<jsp:setProperty name=“box" property=“length" value=“10"></jsp:setProperty>
<jsp:setProperty name=“box" property=“width" value=“20"></jsp:setProperty>
<jsp:setProperty name=“box" property=“height" value=“30"></jsp:setProperty>
</jsp:useBean>
2、操作JavaBean:
盒子的表面积是:${box.area}
或者 盒子的表面积是:${box[“area”]}
幻灯片14
2. JSTL
l 2.1 为什么使用JSTL
l (1)简化JSP和Web程序的开发。原来需要大量Java代码才能完成的功能,可以用少量的JSTL标签完成,且JSTL标签具有良好的可读性,易于理解;
l (2)开发接口统一,便于在各种服务器之间进行移植,在多层架构的Web系统中,JSTL在表示层及在中间层对应用程序逻辑封装功能进行了良好的封装。
l JSTL 1.0发布于2002年6月,由四个定制标记库(core、format、xml和sql)和一对通用标记库验证器组成。
幻灯片15
2.2 JSTL的功能
l 1. 常用功能,配合EL表达式,显示表达式结果,设置变量或属性的值,捕获JSP页面中的异常;
l 2. 流程控制;
l 3. URL资源处理;
l 4. 国际化与文本格式控制;
l 5. 关系型数据库中的数据处理;
l 6. XML文档处理;
l 7. 含有EL函数库,进一步扩展EL表达式的功能,主要用于进行字符串处理。
幻灯片16
2.3 JSTL的安装与配置
l 在http://www.apache.org/下载最新版的JSTL,binaries目录的zip文件;
l 解压缩后lib目录下得到两个包jstl.jar和standard.jar;
l 把这两个文件拷贝到当前Web应用的“WEB-INF/lib”目录中,JSTL在当前Web应用中可用;
l 如果要在所有的Web应用中可用,可以把这两个文件拷贝到Tomcat安装目录的“lib”目录下。
幻灯片17
标签库
标签库 URI 前缀 使用模式
核心标签库 http://java.sun.com/jsp/jstl/core c <c:tagname…>
国际化标签(I18N) http://java.sun.com/jsp/jstl/fmt fmt <fmt:tagname…>
SQL标签库 http://java.sun.com/jsp/jstl/sql sql <sql:tagname…>
XML标签库 http://java.sun.com/jsp/jstl/xml x <x:tagname…>
函数标签库 http://java.sun.com/jsp/jstl/functions fn <fn:tagname…>
当使用不同的标签库中的JSTL标签时,需要在JSP页面的首部加入标签导入语句:
<%@ taglib prefix=“标签库使用的前缀” uri=“标签库的URI”%>
如:使用核心标签库中的标签,需添加语句:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
幻灯片18
2.4 标签书写语法
l 1. […]:表示可选项;
l 2. {选项1|选项2|…|选项n}:表示n个选项中必选其一;
l 语法:
l (1)<标签名 属性名=“属性值” ……/>
l (2)<标签名 属性名=“属性值”…… >标签体(body)</标签名>
幻灯片19
2.5 核心标签
l 1、表达式相关的:
l (1)<c:out>:用来输出表达式的结果;和EL表达式作用同,不常用;
l 语法:<c:out value=“表达式”/>
l (2)<c:set>:用于设定指定范围内的一个变量或对象的值;
l 语法:
l <c:set value=“设置的值” var=“变量名” [scope=“{page|request|session|application}”] />
l <c:set var=“变量名” [scope=“{page|request|session|application}”] >
l 要设置的值
l </c:set>
l 注:如果value为null,会删除变量的值,类似调用:pageContext.removeAttribute(变量名,scope);
幻灯片20
2.5 核心标签
l 1、表达式相关的:
l (2)<c:set>:用于设定指定范围内的一个变量或对象的值;
l 语法:
l <c:set value=“设置的值” target=“对象名称” property=“对象的属性名称”/>
l <c:set var=“变量名” ” target=“对象名称” property=“对象的属性名称”>
l 要设置的值
l </c:set>
l 注意:对象名称使用”${ }”;若对象为null,或者既不是Map对象也不是JavaBean对象会抛出异常。
幻灯片21
2.5 核心标签
l 1、表达式相关的:
l (3)<c:remove>:用于删除某范围内的一个变量;
l 语法:
l <c:remove var=“变量名” [scope=“{page|request|session|application}”] />
l (4)<c:catch>:用于捕获嵌套在它里面的程序代码抛出的异常;
l 语法:
l <c:catch [var=“变量名”]>
l 嵌套内容
l </c:catch>
l 其中,var是标识捕获异常的变量的名字。
幻灯片22
示例:(部分代码)
l <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
l 下面进行JSTL标签的应用:<br>
l <c:out value="JSTL中out的使用!"/>
l 定义一个变量:<c:set var="name" value="lisa" /><br>
l 获取变量的值:${name}<br>
l 删除一个变量:<c:remove var="name"/><br>
l 获取变量的值:${name }<br>
l <jsp:useBean id="box" class="bean.Box"></jsp:useBean>
l <c:set value="10" target="${box}" property="length"></c:set>
l <c:set value="10" target="${box}" property="width"></c:set>
l <c:set value="10" target="${box}" property="height"></c:set>
l 盒子的体积是:${box.vol}
l <br>
l <c:catch var="errors">
l <%=3/0 %>
l <c:out value="这是输出! "/>
l </c:catch>
幻灯片23
2.6 流程控制核心标签
l 流程控制标签主要用于对页面简单业务逻辑进行控制。流程控制标签包含有4个:<c:if>标签、<c:choose>标签、<c:when>标签和<c:otherwise>标签
l 1、<c:if>:类似if判断语句
l 语法:<c:if test=“条件表达式” var=“变量名” [scope=“{page|request|session|application}”] />
l 其中,var是保存条件表达式结果的变量名称
l <c:if test=“条件表达式” [var=“变量名”] [scope=“{page|request|session|application}”] >
l 表达式成立后执行的代码
l </c:if> (scope属性指定,则var属性也必须给定)
幻灯片24
l 2、<c:choose> <c:when> <c:otherwise>
l 用于进行排他性条件选择判断,类似switch语句
l 语法:
l <c:choose>
l <c:when test=“条件表达式1”>
l 表达式1成立后执行的语句
l </c:when>
l [<c:when test=“条件表达式2”>
l 表达式1成立后执行的语句
l </c:when>]
l […]
l [<c:otherwise>
l 条件都不成立执行的语句
l </c:otherwise>]
l </c:choose>
幻灯片25
l 3、<c:forEach>
l 执行循环,循环次数或者是固定的,或者通过集合对象来决定。
l 语法:
l (1)通过集合对象决定循环次数
l <c:forEach [var=“变量名”] items=“集合类对象” [varStatus=“变量状态名”] [begin=“起点”][end=“结束点”][step=“步长”]>
l 循环体
l </c:forEach>
l (2)执行固定次数的循环
l <c:forEach [var=“变量名”] [varStatus=“变量状态名”] [begin=“起点”][end=“结束点”][step=“步长”]>
l 循环体
l </c:forEach>
l 其中,varStatus中存放当前迭代的状态信息主要有4个属性:index,count,first和last。Index表示当前索引号,count表示当前已迭代的次数,first表示当前是否是第一次迭代,last表示当前是否是最后一次迭代。Item中元素下标从0开始。
幻灯片26
l 4、<c:forTokens>
l 用于处理由某一符号分隔的字符串,从其中拆分出子字符串。
l 语法:
l <c:forTokens items=”可拆分的字符串” delims=”分隔符”
l [var=”变量名” begin=”起点” end=”结束点” step=”步长” varStatus=”当前迭代状态变量名”] >
l 循环体
l </c:forTokens>
l 其中items指定被迭代的字符串;delims指定使用的分隔符;var指定用来存放遍历到的成员;begin指定遍历的开始位置(int型从取值0开始);end指定遍历结束的位置(int型,默认集合中最后一个元素);step遍历的步长(大于0的整型);varStatus存放遍历到的成员的状态信息。
幻灯片27
2.7 URL相关的核心标签
l 1、<c:import > 将其他文件包含到当前JSP文件中;
l 导入一个url的资源,相当于jsp 中的<jsp:include>标签,区别为:只能包含同一个web应用中的文件。而<c:import>可以包含其他web应用中的文件,甚至是网络上的资源。
l 语法:
l (1)<c:import url=”url” [context=”context”][ value=”value”] [scope=”page|request|session|application”] [charEncoding=”字符编码”]>
l (2)<c:import url=”url”[ varReader=”name”] [context=”context”] [charEncoding=”encoding”]>
l 当应用的资源不存在时会抛出异常,因此该语句应该放在<c:catch></c:catch>语句块中捕获,varReader属性指示被包含文件的存储类型;如果访问webapps管理文件夹中其他web应用就要用context属性。
l
幻灯片28
l 2、<c:param> :用于向导入的页面中传入参数
l 语法:<c:param name=“参数名” value=“参数值” />
l 3、<c:url> :用于动态生成一个String类型的URL
l 语法1:<c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session|application}”]/>
l 语法2:在body 中有重写的参数
l <c:url value=”value” [context=”context”] [var=”varName”] [scope=”{page|request|session|application}”]>
l <c:param name=”paramName”> paramValue </c:param>
l </c:url>
幻灯片29
l 4、<c:redirect>:重定向,把客户的请求发送到另一个资源,相当于jsp中<% request.sendRedirect(“other.jsp”) %>或servlet中RequestDispatch.forward(“other.jsp”)的功能。
l 语法1:<c:redirect url=”value” [context=”context”]/>
l 语法2:请求目标URL传递参数
l <c:redirect url=”value” [context=”context”]>
l <c:param name=”paramName”> paramValue </c:param>
l </c:redirect>
l 注意:
l A、使用重定向(redirect)与载入页面(import)不同,载入页面时在本页面中插入其他页面,而重定向是请求转发,等于在页面中重新输入了一次url。当重定向到某个页面时浏览器中的地址会发生变化。
l B、使用重定向时不用使用<c:catch>语句,当输入页面访问不到时,浏览器会报错,跟程序运行无关。
幻灯片30
JSTL
----I18N标签库
幻灯片31
I18N应用背景
l 随着电子商务以及其他Web应用的普及,确保世界各地的客户能够使用其本地语言方便地访问这些服务就变得非常重要。
l JSTL的格式标记库提供了国际化的标记集,用于处理和解决国际化相关的问题。
幻灯片32
l 应用的国际化和本地化:世界各地的客户能够使用其本地语言方便的访问各种组织提供的Web应用服务,也就是针对特定语言和地区来定义应用。
l JSTL的格式标记库提供了国际化标记集,用于处理和解决与国际化相关的问题。
l 国际化(I18N):Internationalization
l 本地化(L10N):Localization
l I18N标记可以指定特定的本地属性(Local),控制数据的显示格式。
l I18N标记提供对资源包(Resource Bundles)的访问,资源包中包含了特定语言的相关项目。
幻灯片33
I18N简介
l I18N主要包含国际化、消息和数字日期格式化等标签
I18N | 国际化 | setLocale requestEncoding |
消息 | bundle message param setBundle | |
数字、日期格式化 | formatNumber formatDate parseDate ParseNumber setTimeZone timeZone |
幻灯片34
l 在JSP页面中使用JSTL国际化标记库时,需要先使用taglib指令导入它,语法格式如下:
l <%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
幻灯片35
国际化
l 国际化类别的标记中包含两个标签,一个是设定语言区域的<fmt:setLocale>另一个则是设定请求字符串编码的<fmt:requestEncoding>
幻灯片36
<fmt:setLocale>
l 用来设置用户的语言地区
l 语法:
l <fmt:setLocale value =“{ll|ll-CC}” [variant=“variant“] [scope=“{page|request|session|application}”]/>
l 说明:
l ll:为两个字母代表语言代码,例如:zh(中文)
l CC:代表国家代码,例如:CN(中国)
l 其中value的取值为地区代码,具体的取值参见http://www.w3.org/WAI/ER/IG/ert/iso639.htm
幻灯片37
l 默认情况下,I18N标记依据浏览器的设定来确定本地属性值。使用<fmt:setLoacl>标记会覆盖浏览器本地属性设置。
l 在Web应用的web.xml文件中,可以使用<context-param>标记设置整个Web应用默认的本地属性。
幻灯片38
属性说明
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
value | 地区代码,其中最少要有两个字母的语言代码,如zh、en,然后也可以再加上两个字母的国家代码和地区代码,如:US,CN两者可以由“-”或“_”相联结起来,例如zh_CN | Y | String/ java.util.Locale | Y | 无 |
variant | 供货商或浏览器的规格,如WIN代码Windows,Mac代码Macintosh | N | String | N | 无 |
scope | 地区设置的适用范围 | N | String | N | page |
注:当value值为null时,则使用默认的区域设置
幻灯片39
<fmt:requestEncoding>
l <fmt:requestEncoding>用来设置字符串的编码,具体的作用和request内置对象的setCharacterEncoding()方法的功能完全相同
l 语法:
l <fmt:requestEncoding [value=“charsetName”]/>
l 说明:该标记只有一个value属性,如果没有设定value属性,则它会自动去寻找合适的编码方式
l 默认的编码格式:ISO-8859-1
l 对于非ISO-8859-1的字符(如:中文),需要显式指定字符集编码。
l 例如:<fmt:requestEncoding value=“GBK”/>
幻灯片40
消息标记库
l 消息标记库中包含四个标记:<fmt:message><fmt:param><fmt:bundle><fmt:setBundle>。他们的主要作用为获取系统设定的语言资源,使用这些标记可以让我们轻易地使我们的Web应用支持国际化。
幻灯片41
资源文件
l 资源包:为了能够在浏览器端用本地属性指定的语言显示内容,一般需要开发人员为需要支持的每个本地属性都提供一个资源集合,通常称为资源包。
l 资源包中包含标准的“键-值”对表示的本地属性。
l 资源包可以用java类实现,也可以用一个文本的属性文件(资源文件)实现:
l 一种方式是使用java类实现的资源包
l 具体实现见P183
l 一种是使用纯文本实现的资源文件
l 具体实现见P185
幻灯片42
l 资源包的命名:文件名中只有后缀的本地属性串不同。
l 资源包的内容:文件内容使用相同的键名,不同语言的键值。
l 示例1:用java实现的资源包,P183-184,Resources_zh.java和Resource_en.java
l 示例2:用资源文件实现的资源包,P185-186,ResourceProps_en.properties和zh.properties
幻灯片43
<fmt:bundle>
l <fmt:bundle>主要用来设定本体内容的数据源
l 语法:
l <fmt:bundle basename=“basename” [prefix=“prefix”]>
l 本体内容
l </fmt:bundle>
l 注:如果basename为null、空或找不到资源文件时,在网页上会产生”???<key>???”的错误信息
幻灯片44
<fmt:bundle>的属性
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
basename | 要是用资源文件的名称 | Y | String | Y | 无 |
prefix | 前置关键字 | Y | String | N | 无 |
l 说明:basename属性设置要使用资源的名称,如如果资源文件的名称为MyResource.properties,那么basename的值为MyResource。注意千万不可以有任何文件类型。
幻灯片45
<fmt:setBundle>
l <fmt:setBundle>可以用来设定默认的资源文件,或者将其设置到指定的属性范围中去。
l 语法:
l <fmt:setBundle basename=“basename” [var=“varName”] [scope=“{page|request|session|application}”]/>
l 注意:若basename为null、空或者无法找到资源文件时,在网页上会产生”???<key>???”错误信息
幻灯片46
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
basename | 要是用资源文件的名称 | Y | String | Y | 无 |
var | 存储资源的名称 | N | String | N | 无 |
scope | var变量的JSP范围 | N | String | N | page |
Basename设定要使用的资源文件,和<fmt:bundle>相同,如果没有设定var时,那么设定好的资源文件会成为默认的资源文件,让在同一个网页或同一个属性范围内<fmt:message>都可以直接使用此资源文件。相反,如果设定var时,那么将会将资源文件存储到varName中,当使用<fmt:message>时,必须使用bundle这个属性来指定。如:
<fmt:setBundel basename=“Myrescource” scope=“session” var=“myResource”/>
<fmt:message key=“str” bundle=“${myResource}”>
如果没有指定var,则只需写成:
<fmt:setBundel basename=“MyResource” scope=“session”/>
<fmt:message key=“str”/>
幻灯片47
<fmt:message>
l <fmt:message>会从从指定的资源中把指定的关键字获取出来
l 语法:
l 语法1:
l <fmt:message key=“messagekey” [bundle=“resourseBundle”] [var=“varname”][scope=“page|request|session|application”]/>
幻灯片48
<fmt:message>
l 语法2:
l <fmt:message key=“messagekey” [bundle=“resourseBundle”] [var=“varname”][scope=“page|request|session|application”] >
l <fmt:param />
l </fmt:message>
l 语法3:
l <fmt:message [bundle=“resourseBundle”] [var=“varname”][scope=“page|request|session|application”] >
l 索引
l <fmt:param />
l </fmt:message>
幻灯片49
<fmt:message>
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
key | 索引 | y | String | 否 | 无 |
bundle | 使用的数据来源 | Y | LocalizationContext | 否 | 无 |
var | 用来存储国际化信息 | N | String | 否 | 无 |
scope | var变量的JSP范围 | N | String | 否 | page |
注:若key为null或空是,在网页上产生“????”的错误信息,
若找不到资源文件,在网页上灰产生”???<key>???”的错误信息
说明:
如果<fmt:message>没有key属性,那么<fmt:message>将会自动从本体内容中寻找关键字,再从关键字中寻找对应的结果,显示在页面中。Bundle属性则是指定使用的资源文件,var和scope用来存储要显示的信息。如果有var属性,该标记则不会把结果显示在页面中,而是将结果存储在varname中,要进行显示则必须使用<c:out>或${}EL表达式
幻灯片50
<fmt:param>
l 当我们从资源文件获取内容时,有时候需要动态设置参数,<fmt:param>就是用来提供这些参数
l 语法1:通过value属性设置参数值
l <fmt:param value=“messageParameter”/>
l 语法2:通过本体设定参数值
l <fmt:param>
l 本体内容
l </fmt:param>
l 说明:value如果没有设定要给予的参数,那么就会默认去获取本体内容当作要传递的参数
幻灯片51
l Prefix用来设置前置关键字,例如当properties文件的内容如下时:
l Requestinfo.label.method=Method
l Requestinfo.label.protocol=Protocol
l 我们就可以使用如下的方式使其内容显示出来:
l <fmt:bundle basename=“MyResource” prefix=“requestinfo.label.”>
l <fmt:message key=“method”/>
l <fmt:message key=“protocol”/>
l </fmt:bundle>
幻灯片52
数字、日期格式化
l 数字、日期格式化共包含6个标签,分别为<fmt:formatNumber><fmt:parseNumber><fmt:formatDate><fmt:parseDate><fmt:setTimeZone><fmt:timeZone>,他们分别用来解析或格式化数字、日期以及货币等。一般用于将数字、日期等转换成指定地区或自定义的显示格式。
幻灯片53
<fmt:timeZone>
l 语法:
l <fmt:timeZone value=“timeZone”>
l 本体内容,如:格式化的时间,日期等
l </fmt:timeZone>
l 作用:指定时区,其本体内容会以指定时区的时间格式来解析和显示。由于该标记的设置只影响其本体内容,也称暂时时区。
l timeZone是时区的ID,例如:America/Los_Angeles,GMT-8等。
l 如果value的值为空或null,则默认为GMT时区。
幻灯片54
<fmt:setTimeZone>
l 语法:
l <fmt:setTimeZone value=“timeZone” [var=“varName”] [scope=“page|request….”]/>
l 作用:将value属性指定的时区值存储到一个var变量中。变量的有效范围由scope指定,默认页内有效。
l 如果value的值为空或者null,则默认为GMT时区。
l 如果没有使用var指明变量,则value的值保存在当前配置变量(javax.servlet.jsp.jstl.fmt.timeZone)中,作为有效范围内的默认时区。
幻灯片55
<fmt:formatNumber>
l <fmt:formatNumber>会依据设定的区域将数字改为适当的格式。
l 语法
l 语法1:没有本体内容
l <fmt:formatNumber value=“numericValue”
[type=“{number|currency|percent}”]
l [pattern=“customPattern”]
l [currencyCode=“currencyCode”]
l [currencySymbol=“currencySymbol”]
l [groupingUsed=“{true|false}”]
l [maxIntegerDigits=“maxIntegerDigits”]
l [minIntegerDigits=“minIntegerDigits”]
l [maxFractionDigits=“maxFractionDigits”]
l [minFractionDigits=“minFractionDigits”]
l [var=“varName”]
l [scope=“{page|request|session|application}”]
l />
l 示例:formatNum.jsp
幻灯片56
<fmt:formatNumber>
l 语法2:本体为欲格式化的内容
l <fmt:formatNumber [type=“{number|currency|percent}”]
l [pattern=“customPattern”]
l [currencyCode=“currencyCode”]
l [currencySymbol=“currencySymbol”]
l [groupingUsed=“{true|false}”]
l [maxIntegerDigits=“maxIntegerDigits”]
l [minIntegerDigits=“minIntegerDigits”]
l [maxFractionDigits=“maxFractionDigits”]
l [minFractionDigits=“minFractionDigits”]
l [var=“varName”]
l [scope=“{page|request|session|application}”]>
l 欲格式化的数字
l </fmt:formatNumber>
幻灯片57
<fmt:formatNumber>的属性
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
value | 欲格式化的数字 | Y | String /Number | 否 | 无 |
type | 指定单位(数字、当地货币、百分比) | Y | String | 否 | number |
patten | 格式化数字的样式 | Y | String | 否 | 无 |
currencyCode | ISO-4217码 | Y | String | 否 | 无 |
currencySymbol | 货币符号,如¥,$ | Y | String | 否 | 无 |
groupingUsed | 是否使用区隔数字,如:123,456,789 | y | boolean | 否 | true |
maxIntegerDigits | 整数部分最多显示多少位 | Y | int | 否 | 无 |
minIntegerDigits | 整数部分最少显示多少位 | Y | int | 否 | 无 |
maxFractionDigits | 小数点后最多显示多少位 | Y | int | 否 | 无 |
minFractionDigits | 小数点后最少显示多少位 | Y | int | 否 | 无 |
var | 存储已格式之数字 | N | String | 否 | 无 |
scope | var变量的JSP范围 | N | String | 否 | page |
幻灯片58
关于<fmt:formatNumber>的说明
l 当无法确定区域时,则输出的格式为Number.toString()
l 如果pattern为null或者空时,则pattern将会被忽略
l 详细的pattern设定可以参考http://java.sun.com/j2se/1.4.2/docs/api/java/text/DecimalFormat.html
l currencyCode为货币代码,如美元就是USD,详细的货币代码可以至http://www.bsi-global.com/technical+information/Publications/_Publications/tig90x.doc
幻灯片59
<fmt:parseNumber>
l 将字符串类型的数字、货币或百分比转换为数字
l 语法:
l 语法1:没有本体的内容
l <fmt:parseNumber value=“numbericValue”
l [type=“{number|currency|percent}”]
l [pattern=“customPattern”]
l [parseLocale=“parseLocale”]
l [integerOnly=“{true|false}”]
l [var=“varName”]
l [scope=“{page|request|session|application}”]/>
幻灯片60
l 语法2:有本体的内容
l <fmt:parseNumber [type=“{number|currency|percent}”]
l [pattern=“customPattern”]
l [parseLocale=“parseLocale”]
l [integerOnly=“{true|false}”]
l [var=“varName”]
l [scope=“{page|request|session|application}”]>
l 待转换为字符串的字符串
l </fmt:parseNumber>
幻灯片61
<fmt:parseNumbe>的属性
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
value | 待格式化的数字 | Y | String /Number | N | 无 |
type | 指定欲格式属性的类型,分别为(数字、当地字符以及百分比) | Y | String | N | number |
pattern | 格式化数字的样式 | Y | String | N | 无 |
parseLocale | 用来替代默认的地区设置 | Y | String /java.util.Locale | 否 | 无 |
integerOnly | 是否只显示整数部分 | Y | boolean | 否 | false |
var | 存储已格式化的数字 | N | String | 否 | 无 |
scope | var的JSP范围 | N | String | 否 | page |
说明:若pattern为null或空时,pattern将被忽略
示例:parseNum.jsp
幻灯片62
<fmt:formatDate>
l 作用:以指定的时区格式化显示日期对象(java.util.Date)。
l 语法:
l <fmt:formatDate value=“date”
l [type=“{time|date|both}”]
l [dateStyle=“{default|short|medium|long|full}”]
l [timeStyle =“{default|short|medium|long|full}”]
l [pattern=“customPattern”]
l [timeZone=“timeZone”]
l [var=“varName”]
l [scope=“{page|request……}”]/>
幻灯片63
l value指定需要格式化显示的日期和时间。
l type指定给定的数据的处理方式为日期、时间还是日期时间都处理。
l dateStyle和timeStyle指定日期和时间的显示格式。
l Pattern属性指定自定义格式,如“dd/MM/yyy”等。见P197
l timeZone指定时区,如果没有指定,默认使用本地属性中的时区。
l 示例:formatDate1.jsp,fomatDate2.jsp
幻灯片64
<fmt:parseDate>
l 作用:将字符串表示的日期和时间解析成日期对象(java.util.Date)。
l 语法:
l <fmt:parseDate value=“dateString”
l [type=“{time|date|both}”]
l [dateStyle=“{default|short|medium|long|full}”]
l [timeStyle =“{default|short|medium|long|full}”]
l [patter=“customPattern”]
l [timeZone=“timeZone”] [parseLocale=“parseLocale”]
l [var=“varName”]
l [scope=“{page|request……}”]/>
幻灯片65
l value属性指定需要解析成日期对象的字符串。该属性可以省略,由本体来指定要解析的内容。
l 解析结果可以使用属性var指定的变量存储。变量的有效范围由scope指定。如果没有var属性,解析结果会输出到JSP页面,否则不会输出。
l 属性parseLocale指定本地属性的值。类型为java.util.Locale。
l 示例:parseDate.jsp
幻灯片66
JSTL
----SQL标签库
幻灯片67
SQL标记库
l JSTL中的SQL标记库也提供了与数据库交换的能力。
l 要使用SQL标记库,必须先使用taglib指令导入它,其语法格式如下:
l <%@taglib prefix=“sql” uri=“http://java.sun.com/jsp/jstl/sql” %>
幻灯片68
使用SQL标记访问数据库的步骤
l 使用SQL标记访问数据库的主要步骤如下:
l 1. 指定数据源
l 2. 进行查询或更新操作
l 3. 对返回的结果进行处理
幻灯片69
SQL标记访问数据库步骤1——指定数据源
l 使用<sql:setDataSource>标记来指定数据源,其语法为:
l <sql:setDataSource url=“jdbcUrl” [driver=“driverClassName”] [user=“userName”] [password=“password”] [var=“varName”] [scope=“{page|request|session|application}”] />
l url属性用于指定连接的url。如连接Oracle数据库时的url为:jdbc:oracle:thin:@[ip]:[port]:[sid]
l driver属性用于指定驱动程序,如Oracle数据库的驱动程序为:oracle.jdbc.driver.OracleDriver
l user属性和password属性则分别用于指定用户名和密码。
l scope属性指定该设置的有效范围
l (注意:如果使用了var属性,则只是将该数据源保存到一个变量中)
幻灯片70
SQL标记访问数据库步骤2——进行查询或更新操作
l 使用<sql:query>标记可以进行数据库查询,其语法为:
l <sql:query sql=“查询语句” var=“varName” [dataSource=“dataSource”]
l [scope=“{page|request|session|application}” ]
l [maxRows=“rowMax”]
l [startRow=“startRow”]
l />
l 也可以将查询语句放在标记本体中,如:
l <sql:query varvar=“varName” [dataSource=“dataSource”]
l [scope=“{page|request|session|application}” ]
l [maxRows=“rowMax”]
l [startRow=“startRow”]
l 查询语句
l </sql:query>
l sql属性指定需要执行的SQL查询语句;属性var指定存储查询结果对象的变量名;还有scope属性指定有效范围。
幻灯片71
SQL标记访问数据库步骤3——处理返回的结果
l 如果前面执行的是查询操作,则会将返回的结果保存在一个Result类型的变量中(返回的结果一般是一个二维表)
l 该变量一般有如下几个属性:
l rows:一个Map对象的数组
l rowsByIndex:一个对象数组的数组
l columnNames:列名的数组
l rowCount:返回结果的行数
l limitedByMaxRows:查询是否有最大行数限制--boolean型
幻灯片72
l <sql:query>查询的结果一般是一个二维表,假如保存在变量x中,并且该表中有三个字段name、sex、score。则输出该表信息的方法为:
l (1). 使用rows属性
l <c:forEach items=“${x.rows}” var=“temp”>
l ${temp.name}、${temp.sex}、${temp.score}<br>
l </c:forEach>
l (2). 使用rowsByIndex属性
l <c:forEach items=“${x.rowsByIndex}” var=“temp”>
l ${temp[0]}、 ${temp[1]} 、 ${temp[2]} <br>
l </c:forEach>
幻灯片73
l 另两个属性的使用方法如下:
l (1). 可以使用columnNames属性输出各列的名称
l <c:forEach items=“${x.columnNames}” var=“temp”>
l ${temp}
l </c:forEach>
l (2). 可以使用rowCount属性输出返回结果的行数
l ${x.rowCount}
幻灯片74
l 使用<sql:update>进行数据库的更新操作,如创建表、插入和删除记录等。
l 其常用语法为:
l <sql:update sql=“更新语句” [dataSource=“dataSource”]
l [var=“varName” ]
l [scope=“{page|request|session|application}” ]
l />
l 也可以将更新语句放到标记本体中
l <sql:update [dataSource=“dataSource”] [var=“varName”]
l [scope=“{page|request|session|application}” ]>
l 更新语句
l </sql:update>
l 可选var属性用于指定修改操作影响的数据记录行数。
幻灯片75
l <sql:param>和<sql:dateParam>这两个标记用来动态地设定变量
l 说明:
l 假如我们的SQL指令需要一些动态变量,我们可以写成如下形式:
l <sql:query var=“result”>
l select * from user where id=‘${userid}’
l </sql:query>
l 如上的写法则会出现一些问题:
l 当userid的内容为‘jason’ or userid<>’jason’时则会所有的结果都会出来,为此
l 我们将上面的语句改成如下即可:
l <sql:query var=“result”>
l select * from user where id=?
l <sql:param value=${userid}>
l </sql:query>
l <sql:dateParam>只是用来设置日期相关的参数,如timeStamp、date、time
幻灯片76
l 有的时候,我们单个事务需要多条sql语句才能执行,这些SQL语句要么全部执行要么一个也不执行,这个时候我们可以使用<sql:transaction>标记。
l 语法:<sql:transaction [dataSource=“dataSource”] isolation=isolationLevel>
l 多个<sql:query>和<sql:update>标记
l </sql:transaction>
幻灯片77
一个将JDBC连接数据库
改为使用SQL标记连接的例子
(参见下面三页)
幻灯片78
l JDBC连接的例子:
l <%@page contentType="text/html; charset=GBK" %>
l <%@page import="java.sql.*" %>
l <%
l Class.forName("oracle.jdbc.driver.OracleDriver");
l
l Connection con = DriverManager.getConnection
l ("jdbc:oracle:thin:@localhost:1521:liuquan","scott","liuquan");
l Statement stmt = con.createStatement();
l
l ResultSet rs = stmt.executeQuery("select * from table1");
l while( rs.next() )
l { out.print( " 姓名:" + rs.getString(1) );
l out.print( " 性别:" + rs.getString(2) );
l out.print( " 分数:" + rs.getFloat(3) );
l out.print( "<br>" );
l }
l rs.close(); stmt.close(); con.close();
l %>
幻灯片79
l 使用SQL标记库连接的例子-1
l <%@page contentType="text/html; charset=GBK" %>
l <%@page import="java.sql.*" %>
l <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
l <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
l <sql:setDataSource url="jdbc:oracle:thin:@localhost:1521:liuquan" driver="oracle.jdbc.driver.OracleDriver" user="scott" password="liuquan" />
l <sql:query sql="select * from table1" var="rs" />
l <c:forEach items="${rs.rowsByIndex}" var="temp">
l 姓名:${temp[0]}
l 性别:${temp[1]}
l 分数:${temp[2]} <br>
l </c:forEach>
幻灯片80
l 使用SQL标记库连接的例子-2
l <%@page contentType="text/html; charset=GBK" %>
l <%@page import="java.sql.*" %>
l <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
l <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
l <sql:setDataSource url="jdbc:oracle:thin:@localhost:1521:liuquan" driver="oracle.jdbc.driver.OracleDriver" user="scott" password="liuquan" />
l <sql:query sql="select * from table1" var="rs" />
l <c:forEach items="${rs.rows}" var="temp">
l 姓名:${temp.name}
l 性别:${temp.sex}
l 分数:${temp.score} <br>
l </c:forEach>
幻灯片81
另一个将JDBC连接数据库
改为使用SQL标记连接的例子
(参见下两页)
幻灯片82
l JDBC连接的例子:
l <%@page contentType="text/html; charset=GBK" %>
l <%@page import="java.sql.*" %>
l <%
l Class.forName("oracle.jdbc.driver.OracleDriver");
l
l Connection con = DriverManager.getConnection
l ("jdbc:oracle:thin:@localhost:1521:liuquan","scott","liuquan");
l Statement stmt = con.createStatement();
l
l stmt.executeUpdate("insert into table1 values ('dirk', 'm', 40)");
l
l stmt.close(); con.close();
l %>
幻灯片83
l 使用SQL标记库连接的例子-3
l <%@page contentType="text/html; charset=GBK" %>
l <%@page import="java.sql.*" %>
l <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
l <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
l <sql:setDataSource url="jdbc:oracle:thin:@localhost:1521:liuquan" driver="oracle.jdbc.driver.OracleDriver" user="scott" password="liuquan" />
l <sql:update sql="insert into table1 values ('dirk', 'm', 40)" />
幻灯片84
课堂练习
l 使用SQL标记更改前面课堂练习中的用户注册功能
幻灯片85
综合实例——图书信息管理系统
l 1.用户注册
l 2.用户登录
l 3.图书信息管理(图书信息增删改查)
幻灯片86
作业
l 编写上面的HTML页面1.htm
l 设计并写出相应的表结构
l 使用JDBC编写JSP页面1.jsp,将以上页面的数据存入数据库中
l 使用SQL标记改写1.jsp
幻灯片87
附录——常见JDBC驱动程序和URL
l JDBC-ODBC桥:
l Driver——sun.jdbc.odbc.JdbcOdbcDriver
l URL——jdbc:odbc:数据源名
l oracle
l Driver——oracle.jdbc.driver.OracleDriver
l URL——jdbc:oracle:thin:@主机名:1521:数据库名
l SQLServer
l Driver——com.microsoft.jdbc.sqlserver.SQLServerDriver
l URL——jdbc:microsoft:sqlserver://主机名:1433;DatabaseName=数据库名
l MySql
l Driver——com.mysql.jdbc.Driver
l URL——jdbc:mysql://主机名:3306/数据库名
l DB2
l Driver——com.ibm.db2.jdbc.app.DB2Driver
l URL——jdbc:db2://主机名:50002/数据库名 返回
幻灯片88
JSTL
----EL函数标签库
幻灯片89
主要内容
l 1 JSTL标准函数
l 2 自定义函数
幻灯片90
JSTL标准函数
l JSTL的标记库提供了大量的标准函数,其中大部分都是字符串处理函数。
l 在JSP页面中使用JSTL的函数标记库时,需要先使用taglib指令导入它,语法格式如下:
l <%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
幻灯片91
JSTL中的主要函数
l 获取字符串长度函数length
l 改变字符串大小写函数toLowerCase, toUpperCase
l 获取字符串的子串函数substring, substringAfter, substringBefore
l 去除字符串两头的空格函数trim
l 替换字符串中的子串函数replace
l 检查字符串是否包含指定的子串函数indexOf, startsWith, endsWith, contains, containsIgnoreCase
l 分割字符串函数split,合并字符串函数join
l 字符串中XML标记的转义处理函数escapeXml
幻灯片92
length函数
l length函数用于获取字符串长度或集合(包括数组、Enumeration、List、Map等)中元素的个数,其语法为:
l fn:length( string|collection )
幻灯片93
toLowerCase和toUpperCase函数
l toLowerCase函数用于将字符串转换为全是小写字母,toUpperCase函数用于将字符串转换为全是大写字母,其语法为:
l fn:toLowerCase(string)
l fn:toUpperCase(string)
幻灯片94
substring函数
l substring函数用于返回某个字符串指定位置上的子串,其语法为:
l fn:substring(string, startPos, endPos)
l 如:${fn:substring(“Abracada”, 2, 5)}的返回值为“rac”
l (说明:字符串中的字符编号是从0开始的;返回的子串是从[开始位置]到[结束位置-1]的子串;另,如果结束位置大于字符串长度,则取字符串长度,如果开始位置小于0,则取0)
幻灯片95
substringAfter函数
l substringAfter函数用于获取指定的子串之后的字符串,其语法为:
l fn: substringAfter( string, string_to_find )
l 如:${fn: substringAfter(“http://java.sun.com”, “http://”)}返回的结果为“java.sun.com”
l (说明:如果第二个参数子串在第一个参数字符串中出现多次,则返回第一次出现后的部分;如果第二个参数子串在第一个参数字符串中没有出现,则返回空字符串“”)
幻灯片96
substringBefore函数
l substringBefore函数用于获取指定的子串之前的字符串,其语法为:
l fn:stringBefore( string, string_to_find )
l 如:${fn:stringBefore(“http://java.sun.com”, “://”)}返回的结果为“http”
l (说明:如果第二个参数子串在第一个参数字符串中出现多次,则返回第一次出现前的部分;如果第二个参数子串在第一个参数字符串中没有出现,则返回空字符串“”)
幻灯片97
EL函数的嵌套使用
l EL函数是可以嵌套使用的
l 比如:
l ${ fn:toUpperCase( fn:substring(“abcdefgh”, 2, 6) ) }返回的结果为“CDEF”
幻灯片98
课堂练习(一)
l 练习使用前面讲过的length、toLowerCase、toUpperCase、substring、substringAfter、substringBefore等函数;
l 输出字符串“Real romance love letter!”的长度,并将位于子串“love”后面的所有字符转换成大写字母输出。
幻灯片99
trim函数
l trim函数用于去除字符串两端的空格,并返回处理后的结果。其语法为:
l fn:trim(string)
l 如:${fn:trim(“ Hello 2008 ”)}返回的结果为“Hello 2008”
l (如果参数为null,则返回空字符串“”)
l 例:trim.jsp
幻灯片100
replace函数
l replace函数用于将字符串中的某个子串替换为指定的字符串,并将替换后的结果字符串返回。其语法为:
l fn:replace(string, string_tofind, string_replace)
l 如果三个参数中的任何一个为null,都作为空字符串“”处理。
l (例子参见下页……)
幻灯片101
l 例1:${fn:replace(“Abracadabra”, “bra”, “ZZZ”)}
l 返回的结果为“AZZZcadaZZZ”。
l 例2:${fn:replace(“Abracadabra”, “bra”, “”)}
l 相当于删除原字符串中的“bra”子串,返回结果为“Acada”。
l 例3:${fn:replace(“Abracadabra”, “”, “ZZZ”)}
l 返回原字符串“Abracadabra”。
幻灯片102
indexOf函数
l indexOf函数返回指定的子串在原字符串中第一次出现的位置。其语法为:
l fn:indexOf(string, string_tofind)
l 如果指定的子串在原字符串中不存在,则返回-1
l 例如:${fn:indexOf(“Acbracadabra”, “bra”)}的返回值为2,${fn:indexOf(“Acbracadabra”, “kzam”)}的返回值为-1。
幻灯片103
startsWith函数
l startsWith函数在指定的字符串是以给定子串开始的情况下返回true,否则返回false。
l 其语法为:
l fn:startsWith(string, string_tofind)
l 两个参数中任何一个为null,都作为空字符串“”处理
l (例子参见下页……)
幻灯片104
l 例1:${fn:startsWith(“Abracadabra”, “Abr”)}
l 返回的结果为true
l 例2:${fn:startsWith(“Abracadabra”, “bra”)}
l 返回的结果为false
l 例3: ${fn:startsWith(“Abracadabra”, “”)}
l 返回的结果为true
l (如果第二个参数为“”,则返回的结果总是true)
幻灯片105
endsWith函数
l endsWith函数在指定的字符串是以给定子串结束的情况下返回true,否则返回false。
l 其语法为:
l fn:endsWith(string, string_tofind)
l 两个参数中任何一个为null,都作为空字符串“”处理
l (例子参见下页……)
幻灯片106
l 例1:${fn:endsWith(“Abracadabra”, “bra”)}
l 返回的结果为true
l 例2:${fn:endsWith(“Abracadabra”, “ada”)}
l 返回的结果为false
l 例3: ${fn:endsWith(“Abracadabra”, “”)}
l 返回的结果为true
l (如果第二个参数为“”,则返回的结果总是true)
幻灯片107
contains函数
l contains函数表示字符串中是否包含有给定的子串。如果包含,则返回true;否则返回false。其语法为:
l fn:contains(string, string_tofind)
l 如:${fn:contains(“Abracadabra”, “brac”)}的返回值为true
l ${fn:contains(“Abracadabra”, “kazam”)}的返回值为false;
l (如果第二个参数为空字符串“”,则返回值总是true)
幻灯片108
containsIgnoreCase函数
l containsIgnoreCase函数和contains函数的作用基本一样,只不过在判断是否包含给定子串时它是忽略大小写的。其语法为:
l fn:containsIgnoreCase(string, string_tofind)
l 如:${fn:containsIgnoreCase(“Abracadabra”, “BRAC”)}的返回值为true
l ${fn:containsIgnoreCase(“Abracadabra”, “kazam”)}的返回值为false
幻灯片109
课堂练习(二)
l 练习使用前面讲过的trim、replace、indexOf、startsWith、endsWith、contains、containsIgnoreCase函数;
l 将字符串“Real romance love letter!”中的所有空格符替换为下划线“_”,并判断该字符串中是否包含子串”let”,若包含则输出子串”let”所在的位置。
幻灯片110
split函数
l split函数的功能是:依据分割字符的集合,将一个字符串分割成一个子串的数组。其语法为:
l fn:split(string, string_tosplit)
l 其中,分割字符可以有一个或多个
l (例子参见下页……)
幻灯片111
l 例1:${fn:split(“2006/10/20”, “/”)}返回的结果是一个字符串数组,其中有三个字符串“2006”、“10”、“20”。
l 例2:${fn:splie(“hello-beijing/2008”, “/”)}返回的结果数组中有两个字符串“hello-beijing”和“2008”
l 而${fn:splie(“hello-beijing/2008”, “-/”)}返回的结果数组中有三个字符串“hello”、“beijing”和“2008”
幻灯片112
join函数
l join函数的功能是:将字符串数组中的所有字符串连接成一个单一的字符串,元素之间是指定的分割字符串。其语法为:
l fn:join(string[], string_tojoin)
l 如果分割字符串是空字符串,那么合并后的字符串是数组各元素没有任何分割符的连接
l (例子参见下页……)
幻灯片113
l 例如:
l <%
l String[] s = {"aaa", "bbb", "ccc"};
l pageContext.setAttribute("x", s);
l %>
l 则${fn:join(x, "-")}的结果为:“aaa-bbb-ccc”。
l 而${fn:join(x, "")}的结果为:“aaabbbccc”
幻灯片114
escapeXml函数
l escapeXml函数表示将字符串中的各种XML标记都不解释(输出时即按原样输出)。其语法为:
l fn:escapeXml(string)
l 如:${fn:escapeXml(“<h2>hello</h2>”)}输出时,输出在屏幕上的就是字符串“<h2>hello</h2>”,而不是2号标题hello
l (如果参数为null,则参数作为空字符串“”处理;函数的返回结果也是空字符串“”)
幻灯片115
6.2 自定义函数
l 开发人员除了可以使用JSTL提供的标准函数外,还可以自定义函数,并可以在EL表达式中使用这些自定义函数。
l 一个EL自定义函数实际上是映射到Java类的一个static方法。
l 而具体的映射信息在标记库描述文件(tld文件)中定义。
幻灯片116
1.编写自定义函数类
l 编写一个Java类
l 该Java类需要放在某一个有名包中
l 该Java类必须是公有类(public)
l 用来实现自定义函数的方法必须是公有的(public)、静态的(static)方法
l
幻灯片117
l 例:自定义函数文件——Func.java
l package mine;
l import java.util.*;
l public class Func{
l public static String sayHello() {
l Calendar cal = Calendar.getInstance();
l int hour = cal.get( Calendar.HOUR_OF_DAY );
l if(hour<12) return "上午好";
l else if(hour<18) return "下午好";
l else return "晚上好";
l }
l }
幻灯片118
2.编译自定义函数类
l 利用 javac命令编译该Java类,注意,要生成相应的包结构;
l 然后将该类编译后生成的结果(\mine\Func.class)放到“/WEB-INF/classes”目录下。
幻灯片119
3.编写标记库描述文件
l 编写标记库描述文件(TLD文件),并放到“WEB-INF”目录下,一般需要重新启动tomcat。
幻灯片120
l 例:标记库描述文件——function.tld
l <taglib>
l <jsp-version>2.0</jsp-version>
l <tlib-version>1.0</tlib-version>
l <uri>greeting</uri>
l <function>
l <name>greet</name>
l <function-class>mine.Func</function-class>
l <function-signature>
l java.lang.String sayHello()
l </function-signature>
l </function>
l </taglib>
幻灯片121
l 上面的TLD文件片段中使用<function>标记定义了一个自定义函数;
l 其中:
l <name>子标记定义了函数名;
l <function-class>子标记定义函数所在的具体实现类名;
l <function-signature>子标记定义了函数的具体使用语法;
l <function-signature>标记的使用语法如下:
l 返回值类型 函数名(参数1的类型,…,参数n的类型)
l 注意:参数的类型和返回值类型必须使用Java类的全限定名。
幻灯片122
4.在JSP文件中使用自定义函数
l 例:使用该自定义函数的JSP文件——greeting.jsp
l <%@ page contentType="text/html;charset=GBK" %>
l <%@ taglib prefix="gr“ uri="greeting" %>
l <h4>这里是使用自定义函数实现的问候</h4>
l ${ gr:greet() }
幻灯片123
在标记属性中使用自定义函数
l 在标记的属性中可以使用EL表达式,当然也可以使用EL的自定义函数。例如:
l <%@ page contentType="text/html;charset=GBK" %>
l <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
l <%@ taglib prefix="gr" uri="greeting" %>
l <h4>在标记属性中使用EL的自定义函数</h4>
l <c:set var="hello" value="${ gr:greet() }"/>
l <c:out value="大家${hello}" />
幻灯片124
在EL函数中使用隐含对象
l 在EL函数(不管是JSTL标准函数还是自定义函数)中都可以使用EL的隐含对象。例如:
l <%@ page contentType="text/html;charset=GBK" %>
l <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
l <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
l <h4>在EL函数中使用隐含对象</h4>
l <c:out value="${ fn:toUpperCase( param.aa ) }" />
幻灯片125
EL函数的嵌套
l JSTL标准函数可以嵌套使用,自定义函数当然也可以嵌套。例如:
l <%@ page contentType="text/html;charset=GBK" %>
l <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
l <%@ taglib prefix="gr" uri="greeting" %>
l <h4>EL函数的嵌套使用</h4>
l ${ fn:length( gr:greet() ) }