JSTL详细版

JSTL

JSTL标签库(Java Server Pages Standard Tag Library)
JSTL是由Apache的Jakarta小组负责维护的,它是一个不断完善的开放源代码的JSP标准标签库,JSTL包含标签库和EL表达式语言两部分

 

  • EL表达式
    • EL禁/启用

<%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止

  • EL中的隐式对象
    1. ${param.name}
    2. ${paramVales.name}
    3. cookie

JSTL并没有提供设定cookie的动作,

例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。

  1. header和headerVales

header 储存用户浏览器和服务端用来沟通的数据

例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。

另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。

  1. initParam

initParam取得设定web站点的环境参数(Context)

例:一般的方法String userid = (String)application.getInitParameter("userid");

 可以使用 ${initParam.userid}来取得名称为userid

  1. 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中。

  1. JSTL标签使用

 

  • Core标签库  
    1. 通用标签

<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 环境显示当地的货币格式。

  1. <fmt:formatNumber value="12" type="currency" pattern="$.00"/> //-- $12.00    
  2.    
  3. <fmt:formatNumber value="12" type="currency" pattern="$.0#"/> //-- $12.0    
  4.    
  5. <fmt:formatNumber value="1234567890" type="currency"/> //-- $1,234,567,890.00(那个货币的符号和当前web服务器的 local 设定有关)    
  6.    
  7. <fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/>// -- 123,456.79    
  8.    
  9. <fmt:formatNumber value="123456.7" pattern="#,#00.0#"/> //-- 123,456.7    
  10.    
  11. <fmt:formatNumber value="123456.7" pattern="#,#00.00#"/>// -- 123,456.70    
  12.    
  13. <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"))}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值