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解析(<,>等符号转换成< >, 默认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>
EL表达式与JSTL的更多相关文章
- [转]EL表达式和JSTL表达式实例
/* **Title:EL表达式和JSTL表达式实例 **Author:Insun **Blog:http://yxmhero1989.blog.163.com/ */ 为了方便写JSP,我们引入了E ...
- 简述jsp之EL表达式和jstl及其使用
Jsp的指令之include指令include指令:代表的是页面的包含. 作用:可以把一些jsp的页面包含在一起,对外展示. 页面的布局,现在已经不用了,现在都用css+div进行布局.include ...
- jsp EL表达式和JSTL标签if-else if-else用法
java web javaEE ,jsp EL表达式和JSTL标签if-else if-else四种用法一.条件运算符 ${user.gender==?'男':'女'} 二.if() <c:if ...
- Javaweb学习笔记6—EL表达式与JSTL及自定义标签
今天来讲javaweb的第六阶段学习. EL表达式与JSTL及自定义标签是对上篇文章介绍的JSP的扩展,不能说是很重要的东西,但是也要了解. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps: ...
- EL表达式、JSTL
EL表达式 一.简介 > JSP表达式 <%= %> 用于向页面中输出一个对象. > 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段. ...
- (十)EL表达式和JSTL标签快速入门
目录 什么是 el 表达式 示例:使用EL表达式获取pageContext .request.session.application域中的数据: 示例:使用EL表达式获取Bean属性 获取当前WEB应 ...
- EL&Filter&Listener:EL表达式和JSTL,Servlet规范中的过滤器,Servlet规范中的监听器,观察着设计模式,监听器的使用,综合案例学生管理系统
EL&Filter&Listener-授课 1 EL表达式和JSTL 1.1 EL表达式 1.1.1 EL表达式介绍 *** EL(Expression Language):表达式语言 ...
- EL表达式和JSTL
EL相关概念JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程语言,甚至不是脚本 ...
- javaWeb el表达式和jstl快速入门案例
<%@page import="de.bvb.domain.Person"%> <%@page import="de.bvb.domain.Addres ...
随机推荐
- wpf,图片灰化处理
private BitmapSource ToGray(BitmapSource source) { FormatConvertedBitmap re = new FormatConvertedBit ...
- http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0
http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0
- PHP历程(封装的增删改查方法)
db.class.php 主要方法 <?php /** * 数据库配置信息 */ define('DB_HOST','127.0.0.1'); //服务器 define('DB_USER', ...
- MFC 设置控件事件对应的函数
在项目中,右击你想设置的控件,打开属性. 然后找到:控件事件,如果在Visual Studio 2015中操作,显示如图: 然后,以设定单击事件为例: 点击右边的三角,选择 <Edit Code ...
- Apache ActiveMQの版本更迭和Apache ActiveMQの故障转移
本文描述apache activemq 版本更迭的原因以及Apache ActiveMQのThe Failover Transport new features in 5.2.0 1.对信息的传输/ ...
- 种树 & 乱搞
题意: 在一个(n+1)*(m+1)的网格点上种k棵树,树必须成一条直线,相邻两棵树距离不少于D,求方案数. SOL: 这题吧...巨坑无比,本来我的思路是枚举每一个从(0,0)到(i,j)的矩形,然 ...
- CSS3 transform rotate(旋转)锯齿的解决办法
-moz-transform: rotate(5deg);-webkit-transform: rotate(5deg); 把图片旋转了5度.本以为轻而易举,可遇到了问题.在Fireofx中显示正常, ...
- jq prepend() 方法在被选元素的开头(仍位于内部)插入指定内容。 提示:prepend() 和 prependTo() 方法作用相同。差异在于语法:内容和选择器的位置,以及 prependTo() 无法使用函数来插入内容。
<html><head><script type="text/javascript" src="/jquery/jquery.js" ...
- VB远程访问MYSQL代码图解
首先需要安装MySQL Connector/ODBC 地址:http://dev.mysql.com/downloads/connector/odbc/ 根据自己的系统(运行环境: Win7/XP/W ...
- 20161007 NOIP 模拟赛 T1 解题报告
排序 3.1 题意描述 众所周知,熟练掌握至少一种排序算法是参加NOIP的必备技能.常见的排序算法有冒泡 排序.归并排序.快速排序.奇偶排序.猴子排序.梳排序.鸡尾酒排序.臭皮匠排序等. 在这里,介绍 ...