EL是Expression Language的是缩写,是JSP页面编写的一种简化写法。EL只是用于显示数据的表达式,不支持条件循环等逻辑控制功能,等效于 <%=表达式%>。使用EL不需要任何引用。
${expression}
${varName}
${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}访问
需要输出$符号时在前面加"\"转义。
${xxxScope.varName}
如果没有指定范围(如${varName}),自动会按Page,Request,Session,Application的顺序查找变量名。
各个范围在EL中的名字,EL中这4个对象只能用来读取范围属性值,不能获取其他信息。
示例:
session.getAttribute("username")
等效于 ${sessionScope.username}
如果Page、Request范围类没有名为username的变量,还可直接用 ${username}
${requestScope.origin_uri} 获取当前URI
EL隐含了param和paramValues对象,可以用来获取请求参数,等同于request.getParameter(String Name)
${param.name}
${paramValues.name} 同名参数包含多个值
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} 取得主机端的服务信息
......
算术运算符: +, -, *或$, /或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}
<%@ 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)} |
JSP2.0(Servlet2.4)开始默认为true。
you are permitted to use this attribute in a JSP-2.0-compliant server regardless of the web.xml version.
<%@ page isELIgnored="true|false" %>
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config>
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="/WEB-INF/sitemesh-decorator.tld" prefix="decorator" %>
<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" %>
引入核心库时,通常以 c 作为标签命名空间。 核心库包含13个标签。
<c:out value="${abc}" [default="defaultvalue"] [escapeXml="{true | false}"]></c:oout>
将变量存储在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>
变量名字不能包含横线 -
属性
移除JSP范围的某个变量
<c:remove var="varName" [scope="{ age|request|session|application }"] />
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]> 本体内容 </c:if>
属性
<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>
属性
类似于forEach, 但是通过delims指定分隔符,将items指定的字符串切分,然后遍历各个字串
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> 本体内容 </c:forTokens>
属性同forEach标签。
标签内部若出现异常,捕获并将错误信息存储到var变量中
<c:catch [var="varName"] > … 欲抓取错误的部分 </c:catch> <c:out value=${varName.message}>
类似于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}"/>
生成URL
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]> <!--<c:param name="paramName" value="value"> --> </c:url>
把用户请求从一个页面转向令一个页面,类似于JSP response.redirect方法
<c:redirect url="url" [context="context"]> <!--<c:param name="paramName" value="value"> --> </c:rediect>
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
根据区域定制的方式将数字格式化,如果要实现国际化编码格式要设置为utf-8(<%@ page language="java" pageEncoding="utf-8"%>)
属性
示例
<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
与formatNumber作用相反,将字符串的数字、货币、百分比转换成数字类型。
示例
<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
格式化日期
属性
<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" />
与formatDate相反,将日期时间字符转化成日期类型。
属性:
示例
<fmt:setLocale value="zh_cn" /> <fmt:parseDate type="date" value="2008-4-5"/>
zh_cn 日期格式为yyyy-m-d
zh_tw 日期格式为yyyy/m/d
设置默认时区,在scope属性范围内的页面都会使用该时区为默认时区。如果有var属性,则将结果存储在所设定的范围之内的变量中。
属性:
设置时区,只作用于该标签内部。
<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" />
设置全局的地区代码
属性
示例:
<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
设置统一的请求编码
属性
设置全局的资源文件
例如 /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>
设置临时的资源文件,只在标签内部有效
<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>
通过key获取value字符串,如果用了属性var,则不会输出,而是将结果存储到var属性值为名的变量中。
与message结合使用,message获取动态值时通过param标签提供参数。见前面的示例。
属性:
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<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"/>
<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>
<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}"] />
配合 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>
同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>
<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>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
<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>
查询输出
<x:out select="xpath_expr" [escapeXML="{true|false}"] />
属性:
示例:
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"/>
把XML中某个结点的内容赋值到一个变量中
<x:set select ="xpath_expr" var="varName" [scope="{page|request|session|application}"] />
与核心库的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>
与核心库的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>
与核心库的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 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