JSTL
JSTL标签库(Java Server Pages Standard Tag Library)
JSTL是由Apache的Jakarta小组负责维护的,它是一个不断完善的开放源代码的JSP标准标签库,JSTL包含标签库和EL表达式语言两部分。
- EL表达式
- EL禁/启用
<%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止
- EL中的隐式对象
- ${param.name}
- ${paramVales.name}
- cookie
JSTL并没有提供设定cookie的动作,
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。
- header和headerVales
header 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。
- initParam
initParam取得设定web站点的环境参数(Context)
例:一般的方法String userid = (String)application.getInitParameter("userid");
可以使用 ${initParam.userid}来取得名称为userid
- pageContext
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} 取得主机端的服务信息
- JSTL核心标签库包括表达式标签、流程控制标签、循环标签和URL操作标签4种标签
- JSTL标签简介
JSTL标签主要包含核心标签库、格式标签库、SQL标签库、XML标签库和函数标签库共5种标签库。
在使用JSTL标签之前必须在JSP页面的首行使用<%@ talib%>指令定义标签库的位置和访问前缀,(jstl 1.1)各个标签库的定义如下:
核心标签库 支持JSP中的一些基本的操作;
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
格式标签库 I18N capable formatting支持对JSP页面的国际化
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
SQL标签库 Database access (SQL)支持JSP对数据库的操作
<%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
XML标签库 XML processing支持XML文档的处理
<%@taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml"%>
函数标签库
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
(J2EE1.4)也可写成:
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<%@ taglib uri="/WEB-INF/fmt.tld" prefix="fmt" %>
<%@ taglib uri="/WEB-INF/fn.tld" prefix="fn" %>
<%@ taglib uri="/WEB-INF/x.tld" prefix="x" %>
<%@ taglib uri="/WEB-INF/sql.tld" prefix="sql" %>
JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。但是在即将推出的JSP 2.0中是作为标准支持的。
- JSTL的优点
在应用程序服务器之间提供了一致的接口,最大程序地提高了WEB应用在各应用服务器之间的移植。
2、 简化了JSP和WEB应用程序的开发。
3、以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet代码的程序。在公司的项目中是不允许有任何的scriptlet代码出现在JSP中。
- JSTL标签使用
- Core标签库
- 通用标签
<c:out>
<c:out>标签用于在JSP中显示数据,它有如下属性 属 性 描 述是否必须 缺省值
value 输出的信息,可以是EL表达式或常量 是 无
default value为空时显示信息 否 无
escapeXml 为true则避开特殊的xml字符集 否 true
例子: 您的用户名是: <c:out value=”${user.username}” default=”guest”/>
显示用户的用户名,如为空则显示guest
<c:out value="${sessionScope.username}"/>
指定从session中获取username的值显示;
<c:out value="${username}" />
显示username的值,默认是从request(page)中取,如果request中没有名为username的对象则从session中取,session中没有则从application(servletContext)中取,如果没有取到任何值则不显示。
<c:set>
<c:set>标签用于保存数据,它有如下属性 属 性 描 述 是否必须缺省值
value 要保存的信息,可以是EL表达式或常量 否
target 需要修改属性的变量名,一般为javabean的实例 否 无
property 需要修改的javabean属性 否 无
var 需要保存信息的变量 否 无
scope 保存信息的变量的范围 否 page
如果指定了target属性, 那么property属性也必须指定。
例子: <c:set value="${test.testinfo}" var="test2" scope=”session” />
将test.testinfo的值保存到session的test2中,其中test是一个javabean的实例,testinfo是test对象的属性。
<c:set target="${cust.address}" property="city" value="${city}"/>
将对象cust.address的city属性值保存到变量city中
<c:remove>
<c:remove>标签用于删除数据,它有如下属性 属 性 描 述 是否必须缺省值
var 要删除的变量 是 无
scope 被删除变量的范围 否所有范围,包括page、request、session、application等
例子: <c:remove var="test2" scope="session"/>
从session中删除test2变量。
2、 流控制标签
<c:if>
<c:if>标签有如下属性 属 性 描 述 是否必须 缺省值
test 需要评价的条件,相当于if (...){}语句中的条件 是 无
var 要求保存条件结果的变量名 否 无
scope 保存条件结果的变量范围 否 page
算术运算符 + 、 - 、 * 、 / (或 div )和 % (或 mod )
关系运算符 == (或 eq )、 != (或 ne )、 < (或 lt )、 > (或 gt )、 <= (或 le )和 >= (或 ge )
逻辑运算符 && (或 and )、 || (或 or )和 ! (或 not )
验证运算符 empty
s
<c:choose>
这个标签不接受任何属性
<c:when>
<c:when>标签有以下属性 属 性 描 述 是否必须 缺省值
test 需要评价的条件 是 无
<c:otherwise>
这个标签同样不接受任何属性
例子: <c:if test="${user.wealthy}">
user.wealthy is true.
</c:if>
如果user.wealthy值true,则显示user.wealthy is true.
<c:choose>
<c:when test="${user.generous}">
user.generous is true.
</c:when>
<c:when test="${user.stingy}">
user.stingy is true.
</c:when>
<c:otherwise>
user.generous and user.stingy are false.
</c:otherwise>
</c:choose>
只有当条件user.generous返回值是true时,才显示user.generous is true.
只有当条件user.stingy返回值是true时,才显示user.stingy is true.
其它所有的情况(即user.generous和user.stingy的值都不为true)全部显示user.generous and user.stingy are false.
由于JSTL没有形如if (){…} else {…}的条件语句,所以这种形式的语句只能用<c:choose>、<c:when>和<c:otherwise>标签共同来完成了。
3、 循环控制标签
<c:forEach>
<c:forEach>标签用于通用数据,它有以下属性 属 性 描 述 是否必须 缺省值
items 进行循环的项目 否 无
begin 开始条件 否 0
end 结束条件 否 集合中的最后一个项目
step 步长 否 1
var 代表当前项目的变量名 否 无
varStatus 显示循环状态的变量 否 无
current getCurrent() 当前这次迭代的(集合中的)项
index getIndex() 当前这次迭代从 0 开始的迭代索引
count getCount() 当前这次迭代从 1 开始的迭代计数
first isFirst() 用来表明当前这轮迭代是否为第一次迭代的标志
last isLast() 用来表明当前这轮迭代是否为最后一次迭代的标志
begin getBegin() begin 属性值
end getEnd() end 属性值
step getStep() step 属性值
例子: <c:forEach items="${vectors}" var="vector">
<c:out value="${vector}"/>
</c:forEach>
相当于java语句 for (int i=0;i<vectors.size();i++) {
out.println(vectors.get(i));
}
在这里vectors是一个java.util.Vector对象,里面存放的是String数据,vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。
<c:forEach begin="0" end="100" var="i" step="1">
count=<c:out value="${i}"/><br>
</c:forEach>
输出:
count=0
...
count=100
<c:forTokens>
<c:forTokens>标签有以下属性 属 性 描 述 是否必须 缺省值
items 进行循环的项目 是 无
delims 分割符 是 无
begin 开始条件 否 0
end 结束条件 否 集合中的最后一个项目
step 步长 否 1
var 代表当前项目的变量名 否 无
varStatus 显示循环状态的变量 否 无
例子
<c:forTokens items="a:b:c:d" delims=":" var="token">
<c:out value="${token}"/>
</c:forTokens>
这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,token是循环到当前分割到的字符串。
4.导入文件和URL
JSTL核心标签库支持使用<c:import>来包含文件,使用<c:url>来打印和格式化URL,使用<c:redirect>来重定向URL。
<c:import>
<c:import>标签包含另外一个页面代码到当前页,它有以下属性 属性 描 述 是否必须 缺省值
url 需要导入页面的url 是 无
context /后跟本地web应用程序的名字 否 当前应用程序
charEncoding 用于导入数据的字符集 否 ISO-8859-1
var 接受导入文本的变量名 否 page
scope 接受导入文本的变量的变量范围 否 1
varReader 用于接受导入文本的java.io.Reader变量名 否 无
varStatus 显示循环状态的变量 否 无
<c:url>
<c:url>标签输出一个url地址,它有以下属性 属 性 描 述 是否必须缺省值
url url地址 是 无
context /后跟本地web应用程序的名字 否 当前应用程序
charEncoding 用于导入数据的字符集 否 ISO-8859-1
var 接受处理过的url变量名,该变量存储url 否 输出到页
scope 存储url的变量名的变量范围 否 page
例子:
<c:import url="http://www.url.com/edit.js" var="newsfeed"/>
将url http://www.url.com/edit.js包含到当前页的当前位置,并将url保存到newsfeed变量中
<a href="<c:url _fcksavedurl=""<c:url" url="/index.jsp"/>"/>
在当前页的当前位置输出<a href="http://www.yourname.com/index.jsp"/>,http://www.yourname.com是当前页的所在的位置。
<c:redirect>
<c:redirect>标签将请求重新定向到另外一个页面,它有以下属性 属性 描 述 是否必须 缺省值
url url地址 是 无
context /后跟本地web应用程序的名字 否 当前应用程序
例子:
<c:redirect url="http://www.yourname.com/login.jsp"/>
将请求重新定向到http://www.yourname.com/login.jsp页,相当于response.setRedirect("http://www.yourname.com/login.jsp");
<c:param>
<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属性属 性 描 述 是否必须 缺省值
name 在request参数中设置的变量名 是 无
value 在request参数中设置的变量值 否 无
例子:
<c:redirect url="login.jsp">
<c:param name="id" value="888"/>
</c:redirect>
将参数888以id为名字传递到login.jsp页面,相当于login.jsp?id=888
- JSTL格式标签库包括格式化日期和数字的标签、读取消息资源的标签、国际化的标签
格式化日期和数字的标签:<fmt:formatNumber>
<fmt:formatNumber> 标签属性和说明
属性 | 描述 |
value | 格式化的数字,该数值可以是 String 类型或 java.lang.Number 类型的实例 |
type | 格式化的类型 |
pattern | 格式化模式 |
var | 结果保存变量 |
scope | 变量的作用范围 |
maxIntegerDigits | 指定格式化结果的最大值 |
minIntegerDigits | 指定格式化结果的最小值 |
maxFractionDigits | 指定格式化结果的最大值,带小数 |
minFractionDigits | 指定格式化结果的最小值,带小数 |
<fmt:formatNumber> 标签实际是对应 java.util.NumberFormat 类, type 属性的可能值包括 currency (货币)、 number (数字)和 percent (百分比)。
下面看一个示例。
<fmt:formatNumber value="1000.888" type="currency" var="money"/>
该结果将被保存在“ money ”变量中,将根据 Locale 环境显示当地的货币格式。
- <fmt:formatNumber value="12" type="currency" pattern="$.00"/> //-- $12.00
- <fmt:formatNumber value="12" type="currency" pattern="$.0#"/> //-- $12.0
- <fmt:formatNumber value="1234567890" type="currency"/> //-- $1,234,567,890.00(那个货币的符号和当前web服务器的 local 设定有关)
- <fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/>// -- 123,456.79
- <fmt:formatNumber value="123456.7" pattern="#,#00.0#"/> //-- 123,456.7
- <fmt:formatNumber value="123456.7" pattern="#,#00.00#"/>// -- 123,456.70
- <fmt:formatNumber value="12" type="percent" /> //-- 1,200% (type 可以是currency、 number、 和percent)。
<fmt:parseNumber>
<fmt:parseNumber> 标签用于解析一个数字,并将结果作为 java.lang.Number 类的实例返回。 <fmt:parseNumber> 标签看起来和 <fmt:formatNumber> 标签的作用正好相反。它的属性和描述如表 9.22 所示:
表 9.22 <fmt:parseNumber> 标签属性和说明
属性 | 描述 |
value | 将被解析的字符串 |
type | 解析格式化的类型 |
pattern | 解析格式化模式 |
var | 结果保存变量,类型为 java.lang.Number |
scope | 变量的作用范围 |
parseLocale | 以本地化的形式来解析字符串,该属性的内容应为 String 或 java.util.Locale 类型的实例 |
下面看一个示例。
<fmt:parseNumber value="15%" type="percent" var="num"/>
解析之后的结果为“ 0.15 ”。
<fmt:formatDate>
<fmt:formatDate> 标签用于格式化日期。它的属性和描述如表 9.23 所示:
表 9.23 <fmt:formatDate> 标签属性和说明
属性 | 描述 |
value | 格式化的日期,该属性的内容应该是 java.util.Date 类型的实例 |
type | 格式化的类型 |
pattern | 格式化模式 |
var | 结果保存变量 |
scope | 变量的作用范围 |
timeZone | 指定格式化日期的时区 |
<fmt:formatDate> 标签与 <fmt:timeZone> 、 <fmt:setTimeZone> 两组标签的关系密切。若没有指定 timeZone属性, 也可以通过 <fmt:timeZone> 、 <fmt:setTimeZone> 两组标签设定的时区来格式化最后的结果。
<fmt:formatDate>动作的属性
pattern="G yyyy年MM月dd日 E" G表示公元E表示星期几
type: 可以是time,date或both。控制是否只生成时间,只生成日期,或者时间日期都生成。
dateStyle: 可以是short, medium, long 或 full(default)。控制打印日期使用的具体格式。
timeStyle: 可以是short, medium, long 或 full(default)。控制打印时间使用的具体格式。
value: 这是一个java.util.Date 类型的值,用于生成日期和时间。
<fmt:parseDate>
<fmt:parseDate> 标签用于解析一个日期,并将结果作为 java.lang.Date 类型的实例返回。 <fmt:parseDate> 标签看起来和 <fmt:formatDate> 标签的作用正好相反。它的属性和描述如表 9.24 所示:
表 9.24 <fmt:parseDate> 标签属性和说明
属性 | 描述 |
value | 将被解析的字符串 |
type | 解析格式化的类型 |
pattern | 解析格式化模式 |
var | 结果保存变量,类型为 java.lang.Date |
scope | 变量的作用范围 |
parseLocale | 以本地化的形式来解析字符串,该属性的内容为 String 或 java.util.Locale 类型的实例 |
timeZone | 指定解析格式化日期的时区 |
<fmt:parseNumber> 和 <fmt:parseDate> 两组标签都实现解析字符串为一个具体对象实例的工作,因此,这两组解析标签对 var 属性的字符串参数要求非常严格。就 JSP 页面的表示层前段来说,处理这种解析本不属于份内之事,因此 <fmt:parseNumber> 和 <fmt:parseDate> 两组标签应该尽量少用,替代工作的地方应该在服务器端表示层的后段,比如在 Servlet 中。
<fmt:setTimeZone> <fmt:timeZone>
<fmt:timeZone>标签用于设置时区,在它的标签体中,通过value属性指定的时区将覆盖JSP环境中现有的所有其他时区设置。该标签的语法格式如下:
<fmt:timeZone value="timeZone">
body content
</fmt:timeZone>
value属性的值是一个命名时区的字符串或者是java.util.TimeZone类的一个实例,它支持动态的值。如果value属性的值为null或空字符串,标签体中的内容就使用GMT时区。
如果value属性的值是表示时区名称的字符串,这个字符串通过静态方法java.util.Time Zone.getTimeZone()被解析为java.util.TimeZone类的一个实例。
读取消息资源的标签:<fmt:message> <fmt:param> <fmt:bundle> <fmt:setBundle>
国际化的标签:<fmt:setlocale> <fmt:requestEncoding>
- JSTL的XML标签库包括XML核心标签库、XML流程控制标签、XML文件转换
XML核心标签库:<x:parse> <x:out> <x:set>
XML流程控制标签:<x:if> <x:choose> <x:when> <x:otherwise> <x:forEach>
XML文件转换:<x:transform> <x:param>
- JSTL的SQL标签库包括设置数据源的标签、SQL操作的标签
设置数据源的标签:
SQL操作的标签:<sql:setDataSource> <sql:query> <sql:update> <sql:param> <sql:dateParam> <sql:transaction>
- JSTL的函数标签库。这个标签库主要用于EL表达式的字符串操作。
<fn:contains> <fn:containsIgnoreCase> <fn:startsWith> <fn:endsWith> <fn:escapeXml> <fn:indexOF> <fn:split> <fn:join> <fn:replace> <fn:trim> <fn:substring> <fn:substringAfter> <fn:substringBefore> <fn:toLowerCase> <fn:toUpperCase> <fn:length>
自定义函数:
作用:可以在el表达式中运用实现一定的功能,对el的功能进行扩展。
使用:
1)借助taglib指令定位tld文件(函数库位置)
2)形如${mytag:函数名(参数列表值)}
开发:
1)自定义一个类,实现相应静态方法
2)写一个函数库描述文件(tld后缀)
Uri:
Function:说明调用者,java类中对应的方法的关系
<function>
<name>multiply</name>
<function-class>com.itcast.Calculator</function-class>
<function-signature>int multiply(int,int)</function-signature>
</function>
Name:对外使用时的名称
Function-class:该方法所在类名
Function-signature:类中该方法的声明,注意:如果引用类型,必须使用类全名
自定义函数可以嵌套:
${calculation:getParameterValue(pageContext.request,calculation:concat("user","name"))}