内容包括

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-INF或WEB-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>

EL表达式与JSTL的更多相关文章

  1. [转]EL表达式和JSTL表达式实例

    /* **Title:EL表达式和JSTL表达式实例 **Author:Insun **Blog:http://yxmhero1989.blog.163.com/ */ 为了方便写JSP,我们引入了E ...

  2. 简述jsp之EL表达式和jstl及其使用

    Jsp的指令之include指令include指令:代表的是页面的包含. 作用:可以把一些jsp的页面包含在一起,对外展示. 页面的布局,现在已经不用了,现在都用css+div进行布局.include ...

  3. jsp EL表达式和JSTL标签if-else if-else用法

    java web javaEE ,jsp EL表达式和JSTL标签if-else if-else四种用法一.条件运算符 ${user.gender==?'男':'女'} 二.if() <c:if ...

  4. Javaweb学习笔记6—EL表达式与JSTL及自定义标签

    今天来讲javaweb的第六阶段学习. EL表达式与JSTL及自定义标签是对上篇文章介绍的JSP的扩展,不能说是很重要的东西,但是也要了解. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps: ...

  5. EL表达式、JSTL

    EL表达式 一.简介 > JSP表达式 <%= %> 用于向页面中输出一个对象.        > 到JSP2.0时,在我们的页面中不允许出现 JSP表达式和 脚本片段.   ...

  6. (十)EL表达式和JSTL标签快速入门

    目录 什么是 el 表达式 示例:使用EL表达式获取pageContext .request.session.application域中的数据: 示例:使用EL表达式获取Bean属性 获取当前WEB应 ...

  7. EL&Filter&Listener:EL表达式和JSTL,Servlet规范中的过滤器,Servlet规范中的监听器,观察着设计模式,监听器的使用,综合案例学生管理系统

    EL&Filter&Listener-授课 1 EL表达式和JSTL 1.1 EL表达式 1.1.1 EL表达式介绍 *** EL(Expression Language):表达式语言 ...

  8. EL表达式和JSTL

    EL相关概念JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程语言,甚至不是脚本 ...

  9. javaWeb el表达式和jstl快速入门案例

    <%@page import="de.bvb.domain.Person"%> <%@page import="de.bvb.domain.Addres ...

随机推荐

  1. wpf,图片灰化处理

    private BitmapSource ToGray(BitmapSource source) { FormatConvertedBitmap re = new FormatConvertedBit ...

  2. http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0

    http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0

  3. PHP历程(封装的增删改查方法)

    db.class.php   主要方法 <?php /** * 数据库配置信息 */ define('DB_HOST','127.0.0.1'); //服务器 define('DB_USER', ...

  4. MFC 设置控件事件对应的函数

    在项目中,右击你想设置的控件,打开属性. 然后找到:控件事件,如果在Visual Studio 2015中操作,显示如图: 然后,以设定单击事件为例: 点击右边的三角,选择 <Edit Code ...

  5. Apache ActiveMQの版本更迭和Apache ActiveMQの故障转移

    本文描述apache activemq 版本更迭的原因以及Apache ActiveMQのThe Failover Transport new features in 5.2.0  1.对信息的传输/ ...

  6. 种树 & 乱搞

    题意: 在一个(n+1)*(m+1)的网格点上种k棵树,树必须成一条直线,相邻两棵树距离不少于D,求方案数. SOL: 这题吧...巨坑无比,本来我的思路是枚举每一个从(0,0)到(i,j)的矩形,然 ...

  7. CSS3 transform rotate(旋转)锯齿的解决办法

    -moz-transform: rotate(5deg);-webkit-transform: rotate(5deg); 把图片旋转了5度.本以为轻而易举,可遇到了问题.在Fireofx中显示正常, ...

  8. jq prepend() 方法在被选元素的开头(仍位于内部)插入指定内容。 提示:prepend() 和 prependTo() 方法作用相同。差异在于语法:内容和选择器的位置,以及 prependTo() 无法使用函数来插入内容。

    <html><head><script type="text/javascript" src="/jquery/jquery.js" ...

  9. VB远程访问MYSQL代码图解

    首先需要安装MySQL Connector/ODBC 地址:http://dev.mysql.com/downloads/connector/odbc/ 根据自己的系统(运行环境: Win7/XP/W ...

  10. 20161007 NOIP 模拟赛 T1 解题报告

    排序 3.1 题意描述 众所周知,熟练掌握至少一种排序算法是参加NOIP的必备技能.常见的排序算法有冒泡 排序.归并排序.快速排序.奇偶排序.猴子排序.梳排序.鸡尾酒排序.臭皮匠排序等. 在这里,介绍 ...