EL表达式与JSTL

内容包括

 

EL表达式

EL是Expression Language的是缩写,是JSP页面编写的一种简化写法。EL只是用于显示数据的表达式,不支持条件循环等逻辑控制功能,等效于 <%=表达式%>。使用EL不需要任何引用。

语法

   ${expression}

 

1.按变量名读取数据

${varName}

 

2.使用"."或[]访问对象的属性和方法

${object.propertyName}

 

如果属性名包含特殊字符(如".-?"等非字母和数字的字符)或者需要动态取值,也可以用 []符号

${object["propertyName"]}

${object.subObject.[varOfPropName]}

 

数组或集合可用${xxx[index]}的方式访问元素。

Map可用${xxx[key]}的方式取值。EL中的数字被视为Long型,Map<Long,xxx> map可用${aaa[1]}的方式取值

 

${object.method(xxx)}

object.getXxx()方法可以直接按${object.xxx}访问

需要输出$符号时在前面加"\"转义。 

 

3.范围属性

${xxxScope.varName}

 

如果没有指定范围(如${varName}),自动会按Page,Request,Session,Application的顺序查找变量名。

各个范围在EL中的名字,EL中这4个对象只能用来读取范围属性值,不能获取其他信息。

  • Page           PageScope             等同于JSP的pageContext对象
  • Request      RequestScope        等同于JSP的request对象
  • Session       SessionScope         等同于JSP的session对象
  • Application  ApplicationScope    等同于JSP的application对象

 

示例:

   session.getAttribute("username")

   等效于 ${sessionScope.username}

   如果Page、Request范围类没有名为username的变量,还可直接用 ${username}

  ${requestScope.origin_uri} 获取当前URI

 

4.请求参数

EL隐含了param和paramValues对象,可以用来获取请求参数,等同于request.getParameter(String Name)

${param.name}

${paramValues.name}     同名参数包含多个值

 

5.其他隐含对象

EL隐含对象共11个:除了前面的pageScope, requestScope, sessionScope, applicationScope,    param, paramValues外,还有cookies, header, headerValues, initParam, pageContext

 

cookie

${cookie.name} 

 

header/headerValues

${header["User-Agent"]}  

${headerValues["name"]}   同名Header字段包含多个值

${header.User_Agent} 

 

initParam

Web战队的环境参数,等同于application.getInitParameter(String name);

${initParam.name}

 

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}   取得主机端的服务信息

  ......

 

6.EL运算符

算术运算符:  +, -,  *或$,  /或div,   %或mod

关系运算符:  ==或eq, !=或ne, <或lt,  >或gt,  <=或le,  >=或ge

逻辑运算符:  &&或and,   ||或or,   !或not

其他运算符:  empty,   ?:,    ()

  判断空      ${empty param.name}

  三元运算   ${A?B:C}

  算术运算   ${ A*(B+C) }

 

如: 1+1=${1+1},   10/5=${var/5},   10 div 5 =${10 div 5}

 

 

EL函数库

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

EL函数语法

  ${namespace:function(params)}

EL函数不能当作标签用

 contains 判断字符串是否包含另外一个字符串 boolean <c:if test="${fn:contains(name, searchString)}">
 containsIgnoreCase 判断字符串是否包含另外一个字符串(大小写无关) boolean <c:if test="${fn:containsIgnoreCase(name, searchString)}">
 endsWith 判断字符串是否以另外字符串结束 boolean <c:if test="${fn:endsWith(filename, ".txt")}">
 escapeXml 把一些字符转成XML表示,例如<字符应该转为< String ${fn:escapeXml(param:info)}
 indexOf 子字符串在母字符串中出现的位置 int ${fn:indexOf(name, "-")}
 join 将数组中的数据联合成一个新字符串,并使用指定字符格开 String ${fn:join(array, ";")}
 length 获取字符串的长度,或者数组的大小 int ${fn:length(shoppingCart.products)}
 replace 替换字符串中指定的字符 String ${fn:replace(text, "-", "•")}
 split 把字符串按照指定字符切分 String[] ${fn:split(customerNames, ";")}
 startsWith 判断字符串是否以某个子串开始 boolean <c:if test="${fn:startsWith(product.id, "100-")}">
 substring 获取子串 String ${fn:substring(zip, 6, -1)}
 substringAfter

获取从某个字符所在位置开始的子串

String

${fn:substringAfter(zip, "-")}
 substringBefore 获取从开始到某个字符所在位置的子串 String ${fn:substringBefore(zip, "-")}
 toLowerCase 转为小写 String ${fn.toLowerCase(product.name)}
 toUpperCase 转为大写字符 String ${fn.UpperCase(product.name)}
 trim 去除字符串前后的空格 String ${fn.trim(name)}

 

EL是否启用 

默认是否启用

  • If your web.xml specifies servlets 2.3 (corresponding to JSP 1.2) or earlier, the default is true. But it is still legal to change the default.
  • If your web.xml specifies servlets 2.4 (corresponding to JSP 2.0) or earlier, the default is false.

  JSP2.0(Servlet2.4)开始默认为true。

JSP页面中单独配置

you are permitted to use this attribute in a JSP-2.0-compliant server regardless of the web.xml version. 

<%@ page isELIgnored="true|false" %> 

在web.xml中统一配置

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
    <el-ignored>true</el-ignored>
    </jsp-property-group>
</jsp-config>

 

 

JSTL标签库

JavaServer Pages Standard Tag Library,  JSTL是由JCP(Java Community Process)制定的标准规范,为Java Web开发人员提供预定义的标准通用标签函数库。使用JSTL和EL可以取代传统的直接在JSP页面嵌入Java程序(Scripting)的做法,更方便快捷并且容易阅读和维护。

  JSTL需要引入Jar包:  standard-1.1.x.jar,  jstl-1.1.x.jar

  最重要的三个库: 

    • 核心库      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
    • 格式化库   <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 
    • EL函数库   <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 

 

标签库的引入方式

  • 直接使用URL
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
  • 直接使用相对目录
<%@taglib uri="/WEB-INF/sitemesh-decorator.tld" prefix="decorator" %>
  • 在Web.xml中配置
<web-app ...>
...
  <taglib>
    <taglib-uri>sitemesh-decorator</taglib-uri>
    <taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location>
  </taglib>
...
</web-app>
<%@taglib uri="sitemesh-decorator" prefix="decorator" %>

 

 

一、JSTL核心标签库

引入核心库时,通常以 c 作为标签命名空间。 核心库包含13个标签。

  • 表达式控制:  out, set, remove, catch
  • 流程控制: if,  choose-when-otherwise,  forEach,   forTokens   
  • URL操作:   import,  url,  redirect

1.out标签

<c:out value="${abc}"  [default="defaultvalue"]  [escapeXml="{true | false}"]></c:oout>
  • value
  • default
  • escapeXml  是否进行XML解析(<,>等符号转换成&lt; &gt;, 默认true),EL表达式${abc}会自动解析

 

2.set标签

将变量存储在JSP某个范围中

<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>  
<c:set var="varName" [scope="{ page|request|session|application }"]>
  value
</c:set>

设置JavaBean的属性值

<c:set value="value" target="target" property="propertyName" />
<c:set target="target" property="propertyName">
    value
</c:set>  

变量名字不能包含横线 - 

属性

  • value   值
  • var  变量名
  • scope   JSP范围
  • target  JavaBean或java.util.Map对象
  • property   target的属性名

 

3.remove标签

移除JSP范围的某个变量

<c:remove var="varName" [scope="{ age|request|session|application }"] />

 

 

4.if标签 

<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
本体内容
</c:if>

属性

  • test    测试条件
    • ${not empty item.value}
    • ${item['domain']!=null}
    • ${!empty item}
    • ......
  • var     测试结果变量
  • scope    结果变量存储范围

 

5-7.choose-when-otherwise标签

    <c:choose>
      <c:when test="testCondition1">
        content1
      </c:when>
      <c:when test="testCondition2">
        content2
      </c:when>
    ......
      <c:otherwise>
        content of other condition
      </c:otherwise>
    </c:choose>

 

 

8.forEach标签

 

遍历集合

<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>  
...
${varName}  当前迭代的对象
...
</c:forEach> 

 

循环指定次数

<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>  
  <c:if test="${status.count%2==0}">....</c:if>
...
</c:forEach>  

属性

  • var       迭代参数的名称。在迭代体中可以使用的变量的名称,用来表示每一个迭代变量。类型为String。
  • items       要进行迭代的集合(支持Java平台所提供的所有标准集合类型)。items为null时,表示空集合。
    • java.util.Collection       调用iterator()获取元素
    • java.util.Map              通过java.util.Map.Entry获取去实例
    • java.util.Iterator          迭代器
    • java.util.Enumeration   枚举
    • Object[]
    • 基本类型数组                通过包装的数组元素
    • 用逗号分隔的String  
    • javax.servlet.jsp.jstl.sql.Result    SQL查询获得的结果集
  • varStatus:   LoopTagStatus类型的迭代变量对象,用来表示迭代的状态,可以访问到迭代自身的信息。
    • current  当前迭代项(同forEach的var属性)
    • index   基于0的当前迭代索引
    • count   基于1的迭代计数
    • first   boolean类型,是否为第一次迭代
    • last    boolean类型,是否为最后一次迭代
    • begin    begin属性的值
    • end     end属性的值
  • begin:   如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。
  • end:     如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。它的类型也为整数。
  • step:    迭代的步长。

 

9.forTokens标签

类似于forEach, 但是通过delims指定分隔符,将items指定的字符串切分,然后遍历各个字串

<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
本体内容
</c:forTokens>

属性同forEach标签。

  

 

10.catch标签

标签内部若出现异常,捕获并将错误信息存储到var变量中

<c:catch [var="varName"] >
… 欲抓取错误的部分
</c:catch>
<c:out value=${varName.message}>

 

11.import

类似于JSP的<jsp:include>,不过c:import还可以包含其他WEB中的应用,也可以导入外部文档。

<c:import url="url" [context="context"] [var="varName"] [scope="{page|request|session|application}"] [charEncoding="charEncoding"]. 
      可以包含<c:param>标签 
</c:import> 
<c:import url="url" [context="context"] varReader="varReader" [charEncoding="charEncoding"]. 
      可以包含<c:param>标签 
</c:import> 

示例

<c:import var="include" url="inc/content.txt" charEncoding="gb2312"/> 
<c:out value="${include}"/> 

 

12.url

生成URL

<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]> 
  <!--<c:param name="paramName" value="value"> -->
</c:url>

 

13.redirect

把用户请求从一个页面转向令一个页面,类似于JSP response.redirect方法

<c:redirect url="url" [context="context"]> 
    <!--<c:param name="paramName" value="value"> -->
</c:rediect> 

 

二、JSTL格式化标签

JSTL格式化标签又叫I18N标签(国际化),主要用来编写需要国际化的应用。可以按地区格式化输出对应语言、数字和日期。

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

 

格式化标签库中包含如下标签

格式化:   fromatNumber,formatDate,parseNumber,parseDate,setTimeZone,timeZone

国际化:   setLocale,requestEncoding,bundle,message,param,setBundle

 

1.formatNumber

根据区域定制的方式将数字格式化,如果要实现国际化编码格式要设置为utf-8(<%@ page language="java" pageEncoding="utf-8"%>)

属性

  • value   要格式化的数字
  • type   按照什么类型格式化,可取值为{number | currency | percent},默认为number。
  • pattern   自定义格式化样式
  • currencyCode     ISO-4721货币代码(如美元为USD,人民币为CNY),type为curreny才有效
  • currencySymbol  设置货币符号,(如美元为$,人民币为¥),type为curreny才有效
  • groupingUsed    是否包含分隔符合
  • maxIntegerDigits     整数部分最多显示位数
  • minIntegerDigits     整数部分最少先生位数
  • maxFractionDigits    小数部分最多显示位数
  • minFractionDigits    小数部分最少显示位数 
  • var    存储格式化后的结果
  • scope   格式化结果存储的范围

示例

       <div>   
                <fmt:setLocale value="fr_fr"/>   
                <fmt:formatNumber value="123456789.012"/>   
                <br/>   
                <fmt:setLocale value="zh_cn"/>   
                <fmt:formatNumber value="123456789.012"/>   
                <br />   
                <fmt:setLocale value="de_de"/>   
                <fmt:formatNumber value="123456789.012"/>   
                <br />                   
            </div>   

自定义数字样式,会四舍五入

  <fmt:formatNumber value="12.31" pattern=".0000"/>        12.3100
  <fmt:formatNumber value="1234" pattern="###.##E0"/>      1.234E3

 

2.parseNumber

与formatNumber作用相反,将字符串的数字、货币、百分比转换成数字类型。

  • value    要转换的字符串
  • type     按什么类型转换,可取值为:  {number | percent | currency}
  • pattern   格式化样式
  • parseLocale    转化货币时,指定语言环境
  • IntegerOnly    转换后的数字是否只显示整数部分
  • var    存储转换结果的变量名
  • scope   结果变量存储的范围

示例

<fmt:parseNumber value="500,800,200"/>     500800200
<fmt:parseNumber value="52%" type="percent" />    0.52
<fmt:parseNumber value="¥123" type="currency" />   123
<fmt:parseNumber value="123.333" type="number"  integerOnly="true"/>    123
<fmt:parseNumber value="$123.333" type="currency" parseLocale="en_US"/>   123.333

 

3.formatDate

格式化日期

属性

  • value    要格式化的日期时间变量
  • type     按日期还是时间格式化,可取值为: {date | time | both},默认为date
  • pattern    格式化样式,    年yyyy, 月MM, 日dd, 12小时制时hh,  24小时制时HH, 分mm,秒ss, 毫秒SSS
  • dateStype   日期格式化样式, 可取值为:{default(medium), short(2位年), medium(4位年), long(中文), full(中文,星期)}
  • timeStyle   时间格式化样式,可取值为:{default, short, medium, long(中文), full(中文,时区)}
  • timeZone   按哪个时区格式化,如EST,CST,MST,PST等
  • var   存储格式结果的变量名
  • scope   格式化结果存储范围

 

<fmt:formatDate value="<%=new Date()%>" type="both" pattern="yyyy-MM-dd HH:mm:ss" />   
<fmt:formatDate value="${item['bind_date']}" pattern="yyyy-MM-dd HH:mm:ss"/> 
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" timeZone="MST" />

 

4.parseDate

与formatDate相反,将日期时间字符转化成日期类型。

属性:

  • value    用来格式化的日期或时间字符串
  • type     格式化的是日期还是时间,可取值为 {date, time, both}
  • pattern   自定义格式化样式
  • dateStyle   日期的格式化样式
  • timeStyle   时间的格式化样式
  • timeZone   指定使用的时区
  • var    存储结果的变量名
  • scope    结果的存储范围

 

示例

<fmt:setLocale value="zh_cn" />
<fmt:parseDate type="date" value="2008-4-5"/>

 

 zh_cn   日期格式为yyyy-m-d

 zh_tw   日期格式为yyyy/m/d

 

5.setTimeZone

设置默认时区,在scope属性范围内的页面都会使用该时区为默认时区。如果有var属性,则将结果存储在所设定的范围之内的变量中。

属性:

  • value    设置的目标时区,如EST,CST,MST,PST等
  • var    存储时区对象的变量名
  • scope   时区对象存储范围

 

6.timeZone

设置时区,只作用于该标签内部。

<fmt:timeZone value="EST">   
  <fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" />      
  <fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" />  
</fmt:timeZone>   
<fmt:formatDate value="<%=new Date()%>" type="time" timeStyle="full" />

 

1.setLocale

设置全局的地区代码

属性

  • value   地区代码,如zh_CN, zh_tw等

 

示例:

<c:set var="todayValue" value="<%=new Date() %>"/>
中文-大陆:<fmt:setLocale value="zh_CN"/> <fmt:formatDate value="${todayValue}"/><br>   中文-大陆: 2007-12-25     
英文:<fmt:setLocale value="en_US"/> <fmt:formatDate value="${todayValue}"/>            英文: Dec 25, 2007

 

2.requestEncoding

设置统一的请求编码

属性

  • value   编码格式

 

3.setBundle

设置全局的资源文件

  • basename   资源文件名,不带后缀,多层路径用com.xxx.yyy的形式
  • var        存储结果到变量名
  • scope     结果变量存储的范围

 

例如 /WEB-INF/classes目录下存在资源文件mydatas.properties

name    = greeting
message = hello, {0}, today is {1,date}
<fmt:setBundle basename="mydatas">
name:
<fmt:message key="anme"/><br>
info:
<fmt:message key="messageTemp">
  <fmt:param>张三</fmt:param>
   <fmt:param value="<%=new Date()%>"></fmt:param>
</fmt:message> 

 

4.bundle

设置临时的资源文件,只在标签内部有效

  • basename      资源文件名,不带后缀,多层路径用com.xxx.yyy的形式
  • var        存储结果到变量名
  • scope     结果变量存储的范围
<fmt:bundle basename="mydatas">
     name:
   <fmt:message key="anme"/><br>
     info:
     <fmt:message key="messageTemp">
          <fmt:param>张三</fmt:param>
          <fmt:param value="<%=new Date()%>"></fmt:param>
     </fmt:message>
</fmt:bundle>       

 

5.message

通过key获取value字符串,如果用了属性var,则不会输出,而是将结果存储到var属性值为名的变量中。

  • key        资源中的键名
  • bundle   制定资源对象
  • var        存储结果的变量名
  • scope     结果变量存储的范围

 

6.param

与message结合使用,message获取动态值时通过param标签提供参数。见前面的示例。

属性:

  • value

 

数据库标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> 

 

1.setDataSource

<sql:setDataSource driver="driverName" url="URL" [user="userName"] [password="password"] [var="varName"] [scope="{page|request|session|application}"] /><sql:setDataSource dataSource="dataSource" [var="varName"] [scope="{page|request|session|application}"] /> 

 

示例

<sql:setDataSource var="conn" driver="com.microsoft.jdbc.sqlserver.SQLServerDriver" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"  user="sa" password="123456"/> 

 

2.query

<sql:query var="varName" dataSource="dataSource" [maxRows="max"] [startRow="start"] [scope="{page|request|session|application}"]> 
  SQL语句 
</sql:query> 

 

示例:

<sql:query var="rs" dataSource="${conn }">  select * from t_user</sql:query> 
<c:out value="count: ${rs.rowCount}"/><br> 
<c:forEach items="${rs.rows}" var="job" varStatus="status"> 
     <c:out value="第${status.count}条记录:"/> 
     <c:out value="id: ${job.id}"/> 
     <c:out value="name: ${job.name}"/>    
     <br> 
</c:forEach> 

 

3.update

<sql:update dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] > 
  SQL语句 
</sql:update><sql:update sql="SQL语句" dataSource="datasource" [var="varName"] [scope="{page|request|session|application}"] /> 

 

4.param

配合 PrepareStatement使用, 向<sql:query>里面的SQL语句动态地传递参数值 

示例:

<sql:query var="rs" dataSource="datasource" > 
   select * from t_user where name like ? and age=? 
   <sql:param value="zhangsan"> 
  <sql:param value="10"> 
</sql:query> 

  

5.dateParam

同Param,提供Date类型参数

<sql:dateParam value="value" [type="{timestamp|time|date}" /> 

 

示例 

<sql:query var="rs" dataSource="datasource" > 
   select * from t_user where name birthday >= ? and birthday <=? 
   <sql:dateParam value="xxx"> 
  <sql:dateParam value="yyy"> 
</sql:query> 

  

6.transaction

<sql:transaction [isolation="{read_uncommitted|read_committed|repeatable_read|serializable}"] [dataSource="datasource"]> 
  数据库操作 
</sql:transaction> 

 

示例:

<sql:transaction dataSource="${database}"> 
  <sql:update> 
    更新数据库语句 
  </sql:update> 
  <sql:query> 
    查询数据库语句 
  </sql:query> 
</sql:transaction> 


 

XML标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%> 

 

1.parse

<x:parse {doc="xmldoc" | xml="xmldoc"}  {var="varName"}  [scope="{page|request|session|application}"] | {varDom="varName" | [scope="{page|request|session|application}"]} [systemId="systemId"] [filter="filter"] /><x:parse { var="varName" [scope="{page|request|session|application}"] | varDom="varName" [scope="{page|request|session|application}"]} [systemId="systemId"]  [filter="filter"]>
  XML文档内容 
</x:parse> 

 

2.out

查询输出

<x:out select="xpath_expr" [escapeXML="{true|false}"] /> 

属性:

  • select      XPATH表达式 ,
  • escapeXML  

 

示例:

XML文件

<?xml version="1.0" encoding="gb2312"?> 
<users> 
    <user> 
        <name>zhangsan</name> 
        <age>26</age> 
        <sex>boy</sex> 
    </user> 
    <user> 
        <name>lisi</name> 
        <age>20</age> 
        <sex>girl</sex> 
    </user>    
</users> 

 

<c:import var="doc" url="Users.xml" charEncoding="gb2312"/>  
<x:parse var="usersDoc" doc="${doc}"/> 
姓名: <x:out select="$usersDoc/users/user/name"/>

 

3.set

把XML中某个结点的内容赋值到一个变量中 

<x:set select ="xpath_expr" var="varName" [scope="{page|request|session|application}"] /> 

 

4.if

与核心库的if类似,只是判断条件变成了XPath表达式

<x:if select ="xpath_expr" var="varName" [scope="{page|request|session|application}"] /> 

<x:if select ="xpath_expr" var="varName" [scope="{page|request|session|application}"] > 
  判断条件成立时执行的操作 
</x:if> 

 

5.choose-when-otherwise

与核心库的choose-when-otherwise用法一样,只是判断条件变成了XPath表达式。

<x:choose>
      <x:when select="$doc//version = '1.0'">
        content1
      </x:when>
      <x:when select="$doc//version = '2.0'">
       content2   
    </x:when>
     ......  
    <x:otherwise>
       content of other condition   
    </x:otherwise>
 </x:choose>

 

6.forEach

与核心库的forEach用法一样,只是判断条件变成了XPath表达式。

<c:import var="doc" url="Users.xml" charEncoding="gb2312"/>
<x:parse var="usersDoc" doc="${doc}"/>
<x:forEach select="$usersDoc//user" varStatus="status">
  <!--注意: 取出父结点后,可以直接通过名称取出其子结点的内容 --> 
  姓名:<x:out select="name"/> 
  年龄:<x:out select="age"/> 
  </br>
</x:forEach>
 

自定义标签库

自定义函数库

  1. 定义类和方法(方法必须是public static) 
  2. 编写自定义tld文件,并且将此文件放到WEB-INFWEB-INF任意子目录下 
  3. 在jsp中采用taglib指令引入自定义函数库 
  4. 采用 前缀+冒号+函数名 调用即可 

 

定义类

public class TxFunctions {    
    public static String timespan(Long spanInMS,Boolean showMs)
    {
        if(spanInMS<0)
            return "";
            
        String elapse="";
        long span=spanInMS;
        long ms=span%1000;
        long s=span/1000%60;
        long m=span/1000/60%60;
        long h=span/1000/60/60;
        if(h>0)
            elapse+=h+"h "+m+"m "+s+"s ";
        else if(m>0)
            elapse+=m+"m "+s+"s ";
        else if(s>0 || !showMs)
            elapse+=s+"s ";
        if(showMs)
            elapse+=ms+"ms";
        return elapse.trim();
    }
}

定义tld

<?xml version="1.0" encoding="UTF-8" ?>  
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"  
  version="2.0">  
  <description>demo functions library</description>  
  <display-name>demo functions</display-name>  
  <tlib-version>1.0</tlib-version>  
  <short-name>tx</short-name>  
<!--   <uri>http://xxxx/functions</uri>   -->

  <function>  
    <name>timespan</name>  
    <function-class>com.demo.taglibs.TxFunctions</function-class>  
    <function-signature>java.lang.String timespan(java.lang.Long,java.lang.Boolean)</function-signature>  
  </function>  
    
</taglib>  

调用

<%@taglib prefix="tx" uri="/WEB-INF/classes/com/demo/taglibs/TxFunctions.tld"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
......
    <span>${tx:timespan(result.end.time-result.start.time,false)}</span>
......
</html>

 

  
http://wallimn.iteye.com/blog/364732
http://blog.csdn.net/wlxtaking/article/details/5050616
http://blog.sina.com.cn/s/blog_4b6f8d150100wa9r.html


写功能类,继承javax.servlet.jsp.tagext.Tag

些TLD描述文件,并放置在WEB-INFO/目录中

页面中使用


http://www.cnblogs.com/zhaoyang/archive/2011/12/25/2301108.html
http://blog.csdn.net/lovesummerforever/article/details/16880791

 

EL表达式调用静态方法

http://www.tuicool.com/articles/vqeAjyJ

方式一: EL function

见上...

 

方式二: 使用Spring的SpEL

<%@taglib prefix="s" uri="http://www.springframework.org/tags" %>

使用:

<c:forEach items="beans" var="bean">
    <s:eval expression="T(com.example.Tools).getTotal(bean.nums)" var="total" />
    <p>总数:${total}</p>
</c:forEach>
posted @ 2015-11-24 15:11  XRacoon  阅读(1648)  评论(0编辑  收藏  举报