内容包括
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解析(<,>等符号转换成< >, 默认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>
自定义标签库
自定义函数库
- 定义类和方法(方法必须是public static)
- 编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下
- 在jsp中采用taglib指令引入自定义函数库
- 采用 前缀+冒号+函数名 调用即可
定义类
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>