JSP EL语言定义
EL(Expression Language)目的:为了使JSP写起来更加简单。 表达式语言灵感来自于ECMAScript和XPath表达式语言,它是一种简单的语言,基于可用的命名空间(PageContext属性),嵌套属性和对集合,操作符(算术型,关系型和逻辑型)的访问符,映射到java类中静态方法的可扩展函数以及一组隐式对象。
语法结构:${expression}
[]与.运算符
EL提供"."和"[]"两种运算符存取数据。当要存取的属性名称中包括一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用"[]"。例如:
${user.My-Name}应当改为${user["My-Name"] }
在这里user是一个类的对象,它的属性My-Name必须符合标准JavaBean的规范,即必须为My-Name属性定义相应的getter、setter方法。
${userAction.person.name}表示取userAction中person对象的name属性值,所以person要在userAction中有set/get方法,name在person中也要有set/get方法。
集合(数组,List)
表达式${row[0]} 表明row集合的第一个条目。
如:${ data.arrayobj[0] }表示取data对象中arrayObj集合的第一个元素。
如果要动态取值时,就可以用“[]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量(在sesssion范围内取)
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
EL表达式不要使用param作为属性名,如${param}得到的是[email protected]1a40210而不是param属性对应的值。
${param.参数名}的用法:
例如:向被包含的页included2.jsp传递参数:
<jsp:include page="included2.jsp" flush="true">
<jsp:param name="ref1" value="AAA"/>
<jsp:param name="ref2" value="BBB"/>
</jsp:include>
page属性: 相对路径指明被包含的文件
flush属性: 必须用true ,表示页面可刷新。
可以用jsp:param向被包含的动态页即JSP页传递参数(而include指令则不可以),参数以”参数名-值”对的形式传递,被包含的页使用request.getParameter(“参数名称”)可以获取相应参数的值
在included2.jsp通过EL表达式 : $(param.ref1) 相当于 request.getParameter("ref1")取出ref1的值。
request.getParameter();一般是从页面或者客户端获取的内容,
而 request.getAttribute();一般是从服务器段传过来的,可以传到客户端也可以传到服务器里面(即,方法1传到方法2,服务器内部的传输)
表达式 : $(param.name) 相当于 request.getParameter (name)。
Map对象
Map map=new HashMap();
map.put("my", "11mymymy");
map.put("my1", "22mymymy1");
request.setAttribute("map",map);
EL表达式输出:${map.my1}结果为,22mymymy1。
判断对象是否为null
<c:if test="${info!=null }">
Empty操作符(空值检查)
使用empty操作符来决定对象、集合或字符串变量是否为空或null。例如:
${empty para.username}
如果request的参数列表中的username值为null,则表达式的值为true。 EL也可以直接使用比较操作符与null进行比较。如${para.firstname == null}。
//判断是否等于字符串‘产品管理‘
<c:if test="${r2.menuName==‘产品管理‘}">
产品管理
</c:if>
比较操作符 描述
==或eq 相等检查
!=或ne 不等检查
<或lt 小于检查
>或gt 大于检查
<=或le 小于等于检查
>=或ge 大于等于检查
算术运算符(+、-(二元)、*、/、div、%、mod)与逻辑运算符均(and、&&、or、||、!、not)与JAVA语言相同,不再列表。
条件运算符 ?=
${A?B:C } 如果A 为true 则返回B 否则返回 C
例如:
<select >
<option value="1" ${para.op==1 ? "selected" : ""}>选项一</option>
<option value="2" ${para.op==2 ? "selected" : "">选项二</option>
</select >
1+2: ${1+2 }<br>
10/5: ${10/5 }<br>
10 div 5: ${10 div 5 }<br>
10%3: ${10 % 3 }<br>
10 mod 3: ${10 mod 3 }<br>
属性范围在EL中的名称:
Page pageScope
Request requestScope
Session sessionScope
Application applicationScope
<%=request.getParameter("username")% > 等价于${ para.username }。para:将请求参数名称映射到单个字符串参数值。
EL语言可以完成如果得到一个username为空,则不显示null,而是不显示值。
${paramValues}表示返回请求参数的一组值。等同于<%=request.getParameterValues("sampleValue")};
例如:
<form action="sampleJsp.jsp" method="post">
<input type="text" name="sampleValue" value="10" />
<input type="text" name="sampleValue" value="11" />
<input type="text" name="sampleValue" value="12" />
<input type="text" name="sampleSingleValue" value="SingleValue"/>
<input type="submit" value="提交"/>
</form>
sampleJsp.jsp 的<body>中有
${paramValues.sampleValue[2]}
${para.sampleSingleValue }
显示结果为12 SingleValue
<%=user.getAddr( ) %> 等价于 ${user.addr}。
使用EL表达式取值时,如果取出的值带有html标记,则html标记会被解释。
注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
EL表达式不能和struts标签嵌套使用。
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} 取得主机端的服务信息
${pageContext.request.contextPath}取得项目的根目录,相当于<%request.getContextPath()%>
如果使用EL表达式出现下面的异常,则需要将jsp-api.jar放在WEB-INF/lib下,然后重新保存文件既可以了
javax.servlet.jsp.pagecontext cantnot be resolved to a type
**************************
C标签
需要导入的jar包:jstl.jar和standard.jar
需要的标签库:<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:out>
<c:out>标签是一个最常用的标签,用于在JSP中显示数据。它的作用是用来替代通过JSP内置对象out或者<%=%>标签来输出对象的值。如:
<c:set value="wowowo" var="test" scope="request"/>
<c:out value="${requestScope.test}" dafault="defaultvalue"/>
<c:out value="C标签"/>
default属性,假若value为null,会显示default的值;假若没有设定default的值,则会显示一个空的字符串。
<c:set>
<c:set>标签用于为变量(page,request,session,application)赋值或对javaBean中变量的属性进行赋值。
将value的值存储到范围为scope的varName变量之中(默认scope的值为page):
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
将body内容存储至范围为scope的varName变量之中:
<c:set var="varName" [scope="{page|request|session|application}"]>
body.....
</c:set>
将value的值存储至target对象属性中
<c:set value="value" target="target" property="propertyNmae"/>
将body内容的数据存储至target对象属性中
<c:set target="target" property="propertyNmae">
body....
</c:set>
如:<c:set target="${cust.address}" property="city" value="$"/>
<c:remove>
<c:remove>标签用于删除存在于scope中的变量。
<c:remove var="varName" [scope="{page|request|session|application}"]/>
如:<c:remove var="sampleValue" scope="session"/>
<c:if>
<c:if>仅当所指定的表达式计算为true时才执行其体内的语句。计算结果也可以保存为一个变量中。
没有体,将计算结果保存在var变量中:
<c:if test="booleanExpression" var="var" [scope="page|request|session|application"]/>
有体:
<c:if test=" booleanExpression ">
JSP elements ...
</c:if>
例如:
<c:if test="${para[‘login_error‘]==1}">
登录失败
</c:if>
<c:choose>
<c:choose>和<c:when>,<c:otherwise>一起实现互斥条件执行,类似于java中的if else。<c:choose>一般作为<c:when>和<c:otherwise>的父标签:
<c:choose>
<c:when test="${row.v_money<10000}">
小于10000
</c:when>
<c:when test="${row.v_money>=10000}&&row.v_money<20000">
大于等于10000,小于等于20000
</c:when>
<c:otherwise>
其它
</c:otherwise>
</c:choose>
<c:forEach>
主要用于对集合进行迭代。
<c:forEach items="collection" [var="var"] [begin="startIndex"] [end="stopIndex"] [step="increment"]>
JSP elements
</c:forEach>
例如:
<c:forEach items="${authorities}" var="athes">
${athes.authority}
</c:forEach>
另外迭代固定的次数:
<c:forEach [var="var"] begin="startIndex" end="stopIndex" [step="increment"]>
JSP elements
</c:forEach>
例如:
<c:forEach var="st" begin="1" end="3">
${st}//将输出3次
</c:forEach>
begin,开始位置。end,结束位置。items,被迭代的集合对象(Collection,Iterator,Map,Enumeration,数组)
step,步长(每次迭代时索引的递增值默认是1)
var,保存当前值。
varStatus:迭代变量的名称,用来表示迭代的状态,可以访问到迭代自身的信息。该变量包含的属性如下:
current:当前这次迭代的(集合中的)项。
index:当前这次迭代从0开始的迭代索引。
count:当前这次迭代从1开始的迭代计数。
first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。
last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。
begin:begin属性的值。
end:end属性的值
step:step属性的值
遍历数组
<% String[] words = { "foo", "bar", "baz"};
pageContext.setAttribute("words", words);
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<H2>Key Words:</H2>
<UL> <c:forEach var="word“ items="${words}">
<LI><c:out value="${word}"/> </c:forEach>
</UL>
***************************
EL表达式函数
下面是JSTL中自带的方法列表以及其描述
需要写上的标签库:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
需要导入的jar包:jstl.jar和standard.jar
fn:contains(string, substring)
如果参数string中包含参数substring,返回true
<c:if test="${fn:contains(name, searchString)}">
fn:containsIgnoreCase(string, substring)
如果参数string中包含参数substring(忽略大小写),返回true
<c:if test="${fn:containsIgnoreCase(name, searchString)}">
fn:endsWith(string, suffix)
如果参数 string 以参数suffix结尾,返回true。如:<c:if test="${fn:endsWith(filename, ".txt")}">
fn:escapeXml(string)
将有特殊意义的XML (和HTML)转换为对应的XML character entity code,并返回。如< ${fn:escapeXml(para:info)}
fn:indexOf(string, substring)
返回参数substring在参数string中第一次出现的位置。如:${fn:indexOf(name, "-")}
fn:join(array, separator)
将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。如:${fn:join(array, ";")}
fn:length(item)
返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。如:${fn:length(shoppingCart.products)}
fn:replace(string, before, after)
返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果。如: ${fn:replace(text, "-", "?")}
fn:split(string, separator)
返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素。如:${fn:split(customerNames, ";")}
fn:startsWith(string, prefix)
如果参数string以参数prefix开头,返回true,如<c:if test="${fn:startsWith(product.id, "100-")}">
fn:substring(string, begin, end)
返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符。如:${fn:substring(zip, 6, -1)}
fn:substringAfter(string, substring)
返回参数substring在参数string中后面的那一部分字符串。如:${fn:substringAfter(zip, "-")}
fn:substringBefore(string, substring)
返回参数substring在参数string中前面的那一部分字符串。如:${fn:substringBefore(zip, "-")}
fn:toLowerCase(string)
将参数string所有的字符变为小写,并将其返回。如:${fn:toLowerCase(product.name)}
fn:toUpperCase(string)
将参数string所有的字符变为大写,并将其返回。如:${fn:toUpperCase(product.name)}
fn:trim(string)
去除参数string 首尾的空格,并将其返回。如:${fn:trim(name)}
JSTL的fmt标签
需要写上的标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
格式化输出日期和日期型字符串。
<fmt:formatDate value="${isoDate}" type="both"/>
2009-5-31 23:59:59
<fmt:formatDate value="${date}" type="date"/>
2009-4-1
<fmt:formatDate value="${isoDate}" type="time"/>
23:59:59
<fmt:formatDate value="${isoDate}" type="date" dateStyle="default"/>
2009-5-31
<fmt:formatDate value="${isoDate}" type="date" dateStyle="short"/>
04-5-31
<fmt:formatDate value="${isoDate}" type="date" dateStyle="medium"/>
2009-5-31
<fmt:formatDate value="${isoDate}" type="date" dateStyle="long"/>
2009年5月31日
<fmt:formatDate value="${isoDate}" type="date" dateStyle="full"/>
2009年5月31日 星期一
<fmt:formatDate value="${isoDate}" type="time" timeStyle="default"/>
23:59:59
<fmt:formatDate value="${isoDate}" type="time" timeStyle="short"/>
下午11:59
<fmt:formatDate value="${isoDate}" type="time" timeStyle="medium"/>
23:59:59
<fmt:formatDate value="${isoDate}" type="time" timeStyle="long"/>
下午11时59分59秒
<fmt:formatDate value="${isoDate}" type="time" timeStyle="full"/>
下午11时59分59秒 CDT
<fmt:formatDate value="${date}" type="both" pattern="EEEE, MMMM d, yyyy HH:mm:ss Z"/>
星期四, 四月 1, 2009 13:30:00 -0600
<fmt:formatDate value="${isoDate}" type="both" pattern="d MMM yy, h:m:s a zzzz/>
31 五月 04, 11:59:59 下午 中央夏令时
日期格式(2008年5月5日22点00分23秒)
<fmt:formatDate value="<%=new Date() %>" pattern="yyyy年MM月dd日HH点mm分ss秒" />
保留两位小数
<fmt:formatNumber value="123.123456789" pattern="0.00"/>
格式数字(45,678.234)
<fmt:formatNumber type="number" value="45678.2345" />
格式百分比(23%)
<fmt:formatNumber type="percent" value="0.2345" />
<fmt:formatNumber value="12" type="currency" pattern="$.00"/> -- $12.00
<br/>
<fmt:formatNumber value="12" type="currency" pattern="$.0#"/> -- $12.0
<br/>
<fmt:formatNumber value="1234567890" type="currency"/> -- $1,234,567,890.00(那个货币的符号和当前web服务器的 local 设定有关)
<br/>
<fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/> -- 123,456.79 (30变为30.0)
<br/>
<fmt:formatNumber value="123456.7" pattern="#,#00.0#"/> -- 123,456.7
<br/>
<fmt:formatNumber value="123456.7" pattern="#,#00.00#"/> -- 123,456.70
<br/>
<fmt:formatNumber value="12" type="percent" /> -- 1,200%type 可以是currency、 number、 和percent
<br/>
<fmt:formatNumber value="12.345" pattern="#.##" /> -- 12.34