• 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>
  • 相关阅读:
    你的代码又导致资金损失了?活该!
    rabbitmq实现指定消费者才能消费
    没有绝对,没有百分百
    jenkins构建触发器之Build whenever a snapshot dependency is built
    豁然明白的囧事 之 执行mvn:clean deploy提示401 Unauthorized
    (8/8)RPC方法的参数,能用枚举就请考虑枚举
    abstract 关键字
    练习题------代码块
    代码块
    static 关键字
  • 原文地址:https://www.cnblogs.com/pixy/p/4878431.html
Copyright © 2020-2023  润新知