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. 通用标签

标签用于在JSP中显示数据,它有如下属性 属 性 描 述是否必须 缺省值

value 输出的信息,可以是EL表达式或常量 是 无

default value为空时显示信息 否 无

escapeXml 为true则避开特殊的xml字符集 否 true

例子: 您的用户名是: 

显示用户的用户名,如为空则显示guest

指定从session中获取username的值显示;

显示username的值,默认是从request(page)中取,如果request中没有名为username的对象则从session中取,session中没有则从application(servletContext)中取,如果没有取到任何值则不显示。

标签用于保存数据,它有如下属性 属 性 描 述 是否必须缺省值

value 要保存的信息,可以是EL表达式或常量 否 

target 需要修改属性的变量名,一般为javabean的实例 否 无

property 需要修改的javabean属性 否 无

var 需要保存信息的变量 否 无

scope 保存信息的变量的范围 否 page

如果指定了target属性, 那么property属性也必须指定。

例子: 

将test.testinfo的值保存到session的test2中,其中test是一个javabean的实例,testinfo是test对象的属性。

将对象cust.address的city属性值保存到变量city中

标签用于删除数据,它有如下属性 属 性 描 述 是否必须缺省值

var 要删除的变量 是 无

scope 被删除变量的范围 否所有范围,包括page、request、session、application等

例子: 

从session中删除test2变量。

 

2、 流控制标签

标签有如下属性 属 性 描 述 是否必须 缺省值

test 需要评价的条件,相当于if (...){}语句中的条件 是 无

var 要求保存条件结果的变量名 否 无

scope 保存条件结果的变量范围 否 page

 

算术运算符 + 、 - 、 * 、 / (或 div )和 % (或 mod )   
关系运算符 == (或 eq )、 != (或 ne )、 < (或 lt )、 > (或 gt )、 <= (或 le )和 >= (或 ge )   
逻辑运算符 && (或 and )、 || (或 or )和 ! (或 not )   
验证运算符 empty

s

 

这个标签不接受任何属性

标签有以下属性 属 性 描 述 是否必须 缺省值

test 需要评价的条件 是 无

 

这个标签同样不接受任何属性

例子: 

user.wealthy is true.

如果user.wealthy值true,则显示user.wealthy is true.

user.generous is true.

user.stingy is true.

user.generous and user.stingy are false.

只有当条件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 {…}的条件语句,所以这种形式的语句只能用标签共同来完成了。

 

3、 循环控制标签

标签用于通用数据,它有以下属性 属 性 描 述 是否必须 缺省值 

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 属性值

例子: 

 

相当于java语句 for (int i=0;i

out.println(vectors.get(i));

在这里vectors是一个java.util.Vector对象,里面存放的是String数据,vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。 

count=

输出:

count=0

...

count=100

标签有以下属性 属 性 描 述 是否必须 缺省值 

items 进行循环的项目 是 无 

delims 分割符 是 无 

begin 开始条件 否 0 

end 结束条件 否 集合中的最后一个项目 

step 步长 否 1 

var 代表当前项目的变量名 否 无 

varStatus 显示循环状态的变量 否 无 

例子 

这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,token是循环到当前分割到的字符串。

 

4.导入文件和URL

 

JSTL核心标签库支持使用来包含文件,使用来打印和格式化URL,使用来重定向URL。

标签包含另外一个页面代码到当前页,它有以下属性 属性 描 述 是否必须 缺省值

url 需要导入页面的url 是 无

context /后跟本地web应用程序的名字 否 当前应用程序

charEncoding 用于导入数据的字符集 否 ISO-8859-1

var 接受导入文本的变量名 否 page

scope 接受导入文本的变量的变量范围 否 1

varReader 用于接受导入文本的java.io.Reader变量名 否 无

varStatus 显示循环状态的变量 否 无

 

标签输出一个url地址,它有以下属性 属 性 描 述 是否必须缺省值

url url地址 是 无

context /后跟本地web应用程序的名字 否 当前应用程序

charEncoding 用于导入数据的字符集 否 ISO-8859-1

var 接受处理过的url变量名,该变量存储url 否 输出到页

scope 存储url的变量名的变量范围 否 page

 

例子:

将url http://www.url.com/edit.js包含到当前页的当前位置,并将url保存到newsfeed变量中

"/>

在当前页的当前位置输出,http://www.yourname.com是当前页的所在的位置。

 

标签将请求重新定向到另外一个页面,它有以下属性 属性 描 述 是否必须 缺省值

url url地址 是 无

context /后跟本地web应用程序的名字 否 当前应用程序

例子:

将请求重新定向到http://www.yourname.com/login.jsp页,相当于response.setRedirect("http://www.yourname.com/login.jsp");

标签用来传递参数给一个重定向或包含页面,它有以下属性属 性 描 述 是否必须 缺省值

name 在request参数中设置的变量名 是 无

value 在request参数中设置的变量值 否 无

例子:

将参数888以id为名字传递到login.jsp页面,相当于login.jsp?id=888

  • JSTL格式标签库包括格式化日期和数字的标签、读取消息资源的标签、国际化的标签

格式化日期和数字的标签: 

 标签属性和说明

属性

描述

value 

格式化的数字,该数值可以是 String 类型或 java.lang.Number 类型的实例

type 

格式化的类型

pattern 

格式化模式

var 

结果保存变量

scope 

变量的作用范围

maxIntegerDigits 

指定格式化结果的最大值

minIntegerDigits 

指定格式化结果的最小值

maxFractionDigits 

指定格式化结果的最大值,带小数

minFractionDigits 

指定格式化结果的最小值,带小数

 标签实际是对应 java.util.NumberFormat 类, type 属性的可能值包括 currency (货币)、 number (数字)和 percent (百分比)。

下面看一个示例。

 

该结果将被保存在“ money ”变量中,将根据 Locale 环境显示当地的货币格式。

  1. "12" type="currency" pattern="$.00"/> //-- $12.00    
  2.    
  3. "12" type="currency" pattern="$.0#"/> //-- $12.0    
  4.    
  5. "1234567890" type="currency"/> //-- $1,234,567,890.00(那个货币的符号和当前web服务器的 local 设定有关)    
  6.    
  7. "123456.7891" pattern="#,#00.0#"/>// -- 123,456.79    
  8.    
  9. "123456.7" pattern="#,#00.0#"/> //-- 123,456.7    
  10.    
  11. "123456.7" pattern="#,#00.00#"/>// -- 123,456.70    
  12.    
  13. "12" type="percent" /> //-- 1,200% (type 可以是currency、 number、 和percent)。 

 标签用于解析一个数字,并将结果作为 java.lang.Number 类的实例返回。  标签看起来和  标签的作用正好相反。它的属性和描述如表 9.22 所示:

表 9.22    标签属性和说明

属性

描述

value 

将被解析的字符串

type 

解析格式化的类型

pattern 

解析格式化模式

var 

结果保存变量,类型为 java.lang.Number 

scope 

变量的作用范围

parseLocale 

以本地化的形式来解析字符串,该属性的内容应为 String 或 java.util.Locale 类型的实例

下面看一个示例。

 

解析之后的结果为“ 0.15 ”。

 

 

 标签用于格式化日期。它的属性和描述如表 9.23 所示:

表 9.23    标签属性和说明

属性

描述

value 

格式化的日期,该属性的内容应该是 java.util.Date 类型的实例

type 

格式化的类型

pattern 

格式化模式

var 

结果保存变量

scope 

变量的作用范围

timeZone 

指定格式化日期的时区

 标签与  、  两组标签的关系密切。若没有指定 timeZone属性, 也可以通过  、  两组标签设定的时区来格式化最后的结果。

动作的属性

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 类型的值,用于生成日期和时间。

 

 

 标签用于解析一个日期,并将结果作为 java.lang.Date 类型的实例返回。  标签看起来和  标签的作用正好相反。它的属性和描述如表 9.24 所示:

表 9.24    标签属性和说明

属性

描述

value 

将被解析的字符串

type 

解析格式化的类型

pattern 

解析格式化模式

var 

结果保存变量,类型为 java.lang.Date 

scope 

变量的作用范围

parseLocale 

以本地化的形式来解析字符串,该属性的内容为 String 或 java.util.Locale 类型的实例

timeZone 

指定解析格式化日期的时区

 和  两组标签都实现解析字符串为一个具体对象实例的工作,因此,这两组解析标签对 var 属性的字符串参数要求非常严格。就 JSP 页面的表示层前段来说,处理这种解析本不属于份内之事,因此  和  两组标签应该尽量少用,替代工作的地方应该在服务器端表示层的后段,比如在 Servlet 中。

 

标签用于设置时区,在它的标签体中,通过value属性指定的时区将覆盖JSP环境中现有的所有其他时区设置。该标签的语法格式如下:

timeZone">

    body content

value属性的值是一个命名时区的字符串或者是java.util.TimeZone类的一个实例,它支持动态的值。如果value属性的值为null或空字符串,标签体中的内容就使用GMT时区。

如果value属性的值是表示时区名称的字符串,这个字符串通过静态方法java.util.Time Zone.getTimeZone()被解析为java.util.TimeZone类的一个实例。

 


读取消息资源的标签:   
国际化的标签: 

  • JSTL的XML标签库包括XML核心标签库、XML流程控制标签、XML文件转换

XML核心标签库:   
XML流程控制标签:    
XML文件转换: 

  • JSTL的SQL标签库包括设置数据源的标签、SQL操作的标签

设置数据源的标签:
SQL操作的标签:     

  • JSTL的函数标签库。这个标签库主要用于EL表达式的字符串操作。

               

自定义函数:
作用:可以在el表达式中运用实现一定的功能,对el的功能进行扩展。
使用:
   1)借助taglib指令定位tld文件(函数库位置)
   2)形如${mytag:函数名(参数列表值)}
开发:
   1)自定义一个类,实现相应静态方法
   2)写一个函数库描述文件(tld后缀)
    Uri:
    Function:说明调用者,java类中对应的方法的关系
   
   multiply
   com.itcast.Calculator
   int multiply(int,int)
   

   Name:对外使用时的名称
   Function-class:该方法所在类名
   Function-signature:类中该方法的声明,注意:如果引用类型,必须使用类全名
   自定义函数可以嵌套:
   ${calculation:getParameterValue(pageContext.request,calculation:concat("user","name"))}

 

你可能感兴趣的:(JSP)