el表达式分类
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
分 类 功能分类 标签名称
Core 表达式操作 out
set
remove
catch
流程控制 if
choose
when
otherwise
迭代操作 forEach
forTokens
分 类 功能分类 标签名称
Core URL操作 import
param
url
redirect
<c:out>
<c:out>主要用来显示数据的内容,就像是 <%= scripting-language %> 一样,例如:
Hello ! <c:out value="${username}" />
语法
语法1:没有本体(body)内容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
语法2:有本体内容
<c:out value="value" [escapeXml="{true|false}"]>
default value
</c:out>
属性
名 称 说 明 EL 类 型 必 须 默认值
value 需要显示出来的值 Y Object 是 无
default 如果value的值为null,则显示default的值 Y Object 否 无
escapeXml 是否转换特殊字符,如:< 转换成 < Y boolean 否 true
注意:假若value为null,会显示default的值;假若没有设定default的值,则会显示一个空的字符串。
说明
一般来说,<c:out>默认会将 <、>、’、” 和 & 转换为 <、>、'、" 和 &。假若不想转换时,只需要设定<c:out>的escapeXml属性为fasle就可以了(见表7-3)。
表7-3
字符 Entity
< <
> >
’ '
” "
& &
范例
<c:out value="Hello JSP 2.0 !! " />
<c:out value="${ 3 + 5 }" />
<c:out value="${ param.data }" default="No Data" />
<c:out value="<p>有特殊字符</p>" />
<c:out value="<p>有特殊字符</p>" escapeXml="false" />
1.在网页上显示 Hello JSP 2.0 !! ;
2.在网页上显示 8;
3.在网页上显示由窗体传送过来的data参数之值,假若没有data参数,或data参数的值为null时,则网页上会显示No Data;
4.在网页上显示“<p>有特殊字符</p>”;
5.在网页上显示“有特殊字符”。
<c:set>
<c:set>主要用来将变量储存至JSP范围中或是JavaBean的属性中。
把1+1的结果2储存到number变量中。如果<c:set>没有value属性,此时value之值在<c:set>和</c:set>之间,本体内容看下面的范例:
<c:set var="number" scope="session">
<c:out value="${1+1}" />
</c:set>
范例
<c:set var="number" scope="request" value="${1 + 1}" />
<c:set var="number" scope="session" >
${3 + 5}
</c:set>
<c:set var="number" scope="request" value="${ param.number }" />
<c:set target="User" property="name" value="${ param.Username}" />
1.将2存入Request范围的number变量中;
2.将8存入Session范围的number变量中;
3. 假若 ${param.number}为null时,则移除Request范围的number变量;若${param.number}不为null时,则将 ${param.number}的值存入Request范围的number变量中;
4.假若 ${param.Username}为null时,则设定User(JavaBean)的name属性为null;若不为null时,则
${param.Username}的值存入User(JavaBean)的name属性(setter机制)。
注意
上述范例的3.中,假若 ${param.number}为null时,则表示移除Request范围的number变量。
<c:remove>
<c:remove>主要用来移除变量。
语法
<c:remove var="varName" [scope="{ page|request|session|application }"] />
属性
名 称 说 明 EL 类型 必须 默认值
var 欲移除的变量名称 N String 是 无
scope var变量的JSP范围 N String 否 page
说明
<c:remove>必须要有var属性,即要被移除的属性名称,scope则可有可无,例如:
c:remove var="number" scope="session" />
将number变量从Session范围中移除。若我们不设定scope,则<c:remove>将会从Page、Request、Session及Application中顺序寻找是否存在名称为number的数据,若能找到时,则将它移除掉,反之则不会做任何的事情。
范例
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>CH7 - Core_set_remove.jsp</title>
</head>
<body>
<h2><c:out value="<c:set>和<c:remove> 的用法" /></h2>
<c:set scope="page" var="number">
<c:out value="${1+1}"/>
</c:set>
<c:set scope="request" var="number">
<%= 3 %>
</c:set>
<c:set scope="session" var="number">
4
</c:set>
初始设置
<table border="1" width="30%">
<tr>
<th>pageScope.number</th>
<td><c:out value="${pageScope.number}" default="No Data" /></td>
</tr>
<tr>
<th>requestScope.number</th>
<td><c:out value="${requestScope.number}" default="No Data" /></td>
</tr>
<tr>
<th>sessionScope.number</th>
<td><c:out value="${sessionScope.number}" default="No Data" /></td>
</tr>
</table></br>
<c:out value='<c:remove var="number" scope="page" />之后'/>
<c:remove var="number" scope="page" />
<table border="1" width="30%">
<tr>
<th>pageScope.number</th>
<td><c:out value="${pageScope.number}" default="No Data" /></td>
</tr>
<tr>
<th>requestScope.number</th>
<td><c:out value="${requestScope.number}" default="No Data" /></td>
</tr>
<tr>
<th>sessionScope.number</th>
<td><c:out value="${sessionScope.number}" default="No Data" /></td>
</tr>
</table></br>
<c:out value='<c:remove var="number" />之后'/>
<c:remove var="number" />
<table border="1" width="30%">
<tr>
<th>pageScope.number</th>
<td><c:out value="${pageScope.number}" default="No Data" /></td>
</tr>
<tr>
<th>requestScope.number</th>
<td><c:out value="${requestScope.number}" default="No Data" /></td>
</tr>
<tr>
<th>sessionScope.number</th>
<td><c:out value="${sessionScope.number}" default="No Data" /></td>
</tr>
</table>
</body>
一开始各在Page、Request和Session三个属性范围中储存名称为number的变量。然后先使用<c:remove var="number" scope="page" />把Page中的number变量移除,最后再使用<c:remove var="number" />把所有属性范围中number的变量移除。
<c:catch>
<c:catch>主要用来处理产生错误的异常状况,并且将错误信息储存起来
语法
<c:catch [var="varName"] >
… 欲抓取错误的部分
</c:catch>
属性
名 称 说 明 EL 类型 必须 默认值
var 用来储存错误信息的变量 N String 否 无
说明
<c:catch>主要将可能发生错误的部分放在<c:catch>和</c:catch>之间。如果真的发生错误,可以将错误信息储存至varName变量中,例如:
<c:catch var="message">
: //可能发生错误的部分
</c:catch>
另外,当错误发生在<c:catch>和</c:catch>之间时,则只有<c:catch>和</c:catch>之间的程序会被中止忽略,但整个网页不会被中止。
范例
<%@ page contentType="text/html;charset=GB2312 " %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>CH7 - Core_catch.jsp</title>
</head>
<body>
<h2><c:out value="<c:catch> 的用法" /></h2>
<c:catch var="error_Message">
<%
String eFormat = "not number";
int i = Integer.parseInt(eFormat);
%>
</c:catch>
${error_Message}
</body>
输出结果
<c:catch>的用法
java.lang.NumberFormatException:For input string:"number"
如果把<c:catch>拿掉,会输出如下
流程控制==========================================
流程控制分类中包含四个标签:<c:if>、<c:choose>、<c:when>和<c:otherwise>
<c:if>
<c:if>的用途就和我们一般在程序中用的if一样。
语法
语法1:没有本体内容(body)
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/ >
语法2:有本体内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
本体内容
</c:if>
属性
名 称 说 明 EL 类 型 必 须 默认值
test 如果表达式的结果为true,则执行本体内容,false则相反 Y boolean 是 无
var 用来储存test运算后的结果,即true或false N String 否 无
scope var变量的JSP范围 N String 否 page
说明
<c:if> 标签必须要有test属性,当test中的表达式结果为true时,则会执行本体内容;如果为false,则不会执行。例如:${param.username = = 'admin'},如果param.username等于admin时,结果为true;若它的内容不等于admin时,则为false。
接下来看下列的范例:
<c:if test="${param.username = = 'admin' }">
ADMIN您好!! //body部分
</c:if>
如果名称等于admin,则会显示"ADMIN您好!! "的动作,如果相反,则不会执行<c:if>的body部分,所以不会显示"ADMIN您好!! //body部分"。另外<c:if>的本体内容除了能放纯文字,还可以放任何JSP程序代码(Scriptlet)、JSP 标签或者HTML码。
除了test属性之外,<c:if>还有另外两个属性var和scope。当我们执行<c:if>的时候,可以将这次判断后的结果存放到属性var里;scope则是设定var的属性范围。哪些情况才会用到var和scope这两个属性呢?例如:当表达式过长时,我们会希望拆开处理,或是之后还须使用此结果时,也可以用它先将结果暂时保留,以便日后使用。
流程控制待续
迭代操作==========================================
迭代(Iterate)操作主要包含两个标签:<c:forEach>和<c:forTokens>
<c:forEach>
<c:forEach> 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。
语法
语法1:迭代一集合对象之所有成员
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
本体内容
/c:forEach>
语法2:迭代指定的次数
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
本体内容
</c:forEach>
属性
名 称 说 明 EL 类型 必须 默认值
var 用来存放现在指到的成员 N String 否 无
items 被迭代的集合对象 Y Arrays
Collection
Iterator
Enumeration
Map
String 否 无
varStatus 用来存放现在指到的相关成员信息 N String 否 无
begin 开始的位置 Y int 否 0
end 结束的位置 Y int 否 最后一个成员
step 每次迭代的间隔数 Y int 否 1
限制
·假若有begin属性时,begin必须大于等于 0
·假若有end属性时,必须大于begin
范例
String atts[] = new String [5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="pen";
request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item" begin="1" end="4" step="2" >
${item}</br>
</c:forEach>
</body>
<c:forEach>中指定的集合对象atts将会从第2个成员开始到第5个成员,并且每执行一次循环都会间隔一个成员浏览。因此结果是只显示atts[1]和atts[3]的内容
另外,<c:forEach>还提供varStatus属性,主要用来存放现在指到之成员的相关信息。例如:我们写成varStatus="s",那么将会把信息存放在名称为s的属性当中。varStatus属性还有另外四个属性:index、count、first和last,它们各自代表的意义如下
属 性 类 型 意 义
index number 现在指到成员的索引
count number 总共指到成员的总数
first boolean 现在指到的成员是否为第一个成员
last boolean 现在指到的成员是否为最后一个成员
我们可以使用varStatus属性取得循环正在浏览之成员的信息,下面为一个简单的范例
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>CH7 - Core_forEach3.jsp</title>
</head>
<body>
<h2><c:out value="<c:forEach> varStatus 的四种属性" /></h2>
<%
String atts[] = new String [5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="pen";
request.setAttribute("atts", atts);
%>
<c:forEach items="${atts}" var="item"varStatus="s">
<h2><c:out value="${item}"/>的四种属性:</h2>
index:${s.index}</br>
count:${s.count}</br>
first:${s.first}</br>
last:${s.last}</br>
</c:forEach>
</body>
</html>
<c:forTokens>
<c:forTokens> 用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。
语法
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
本体内容
</c:forTokens>
属性
说明
<c:forTokens>的begin、end、step、var和varStatus用法都和<c:forEach>一样,因此,笔者在这里就只介绍items和delims两个属性:items的内容必须为字符串;而delims是用来分割items中定义的字符串之字符。
范例
<c:forTokens items="A,B,C,D,E" delims="," var="item" >
${item}
</c:forTokens>
上面范例执行后,将会在网页中输出ABCDE。它会把符号“,”当做分割的标记,拆成5个部分,也就是执行循环5次,但是并没有将A,B,C,D,E中的“,”显示出来。items也可以放入EL的表达式,如下:
<%
String phoneNumber = "123-456-7899";
request.setAttribute("userPhone", phoneNumber);
%>
<c:forTokens items="${userPhone}" delims="-" var="item" >
${item}
</c:forTokens>
这个范例将会在网页上打印1234567899,也就是把123-456-7899以“-”当做分割标记,将字符串拆为3份,每执行一次循环就将浏览的部分放到名称为item的属性当中。delims不只指定一种字符来分割字符串,它还可以一次设定多个分割字符串用的字符。如下面这个范例:
<c:forTokens items="A,B;C-D,E" delims=",;-" var="item" >
${item}
</c:forTokens>
此范例会在网页输出ABCDE,也就是说,delims可以一次设定所有想当做分割字符串用的字符。其实用<c:forEach>也能做到分割字符串,写法如下
<c:forEach items="A,B,C,D,E" var="item" >
${item}
</c:forEach>
上述范例同样也会在网页输出ABCDE。<c:forEach>并没有delims这个属性,因此<c:forEach>无法设定分割字符串用的字符,而<c:forEach>分割字符串用的字符只有“,”,这和使用<c:forTokens>,delims属性设为“,”的结果相同。所以如果使用<c:forTokens>来分割字符串,功能和弹性上会比使用<c:forEach>来得较大。
URL操作 =============================================================
JSTL包含三个与URL操作有关的标签,它们分别为:<c:import>、<c:redirect>和<c:url>。它们主要的功能是:用来将其他文件的内容包含起来、网页的导向,还有url的产生
<c:import>也支持FTP协议,假设现在有一个FTP站台,地址为ftp.javaworld.com.tw,它里面有一个文件data.txt,那么可以写成如下方式将其内容显示出来:
<c:import url="ftp://ftp.cse.yzu.edu.tw/data.txt" />
如果是使用相对地址,假设存在一个文件名为Hello.jsp,它和使用<c:import>的网页存在于同一个webapps的文件夹时,<c:import>的写法如下:
<c:import url="Hello.jsp" />
如果以“/”开头,那么就表示跳到web站台的根目录下,以Tomcat为例,即webapps目录。假设一个文件为hello.txt,存在于webapps/examples/images里,而context为examples,可以写成以下方式将hello.txt文件包含进我们的JSP页面之中:
<c:import url="images/hello.txt" />
接下来如果要包含在同一个服务器上,但并非同一个web站台的文件时,就必须加上context属性。假设此服务器上另外还有一个web站台,名为others,others站台底下有一个件夹为jsp,且里面有index.html这个文件,那么就可以写成如下方式将此文件包含进来:
文
<c:import url="/jsp/index.html" context="/others" />
注意
被包含文件的web站台必须在server.xml中定义过,且<Context>的crossContext属性值必须为true,这样一来,others目录下的文件才可以被其他 web站台调用。
erver.xml的设定范例如下:
s
:
<Context path="/others" docBase="others" debug="0"
reloadable="true" crossContext="true"/>
:
除此之外,<c:import>也提供var和scope属性。当var属性存在时,虽然同样会把其他文件的内容包含进来,但是它并不会输出至网页上,而是以String的类型储存至varName中。scope则是设定varName的范围。储存之后的数据,我们在需要用时,可以将它取出来,代码如下:
<c:import url="/images/hello.txt" var="s" scope="session" />
我们可以把常重复使用的商标、欢迎语句或者是版权声明,用此方法储存起来,想输出在网页上时,再把它导入进来。假若想要改变文件内容时,可以只改变被包含的文件,不用修改其他网页。
另外,可以在<c:import>的本体内容中使用<c:param>,它的功用主要是:可以将参数传递给被包含的文件,它有两个属性name和value,如表
名 称 说 明 EL 类 型 必 须 默认值
name 参数名称 Y String 是 无
value 参数的值 Y String 否 本体内容
这两个属性都可以使用EL,所以我们写成如下形式:
<c:import url="http://java.sun.com" >
<c:param name="test" value="1234" />
</c:import>
这样的做法等于是包含一个文件,并且所指定的网址会变成如下:
范例
下面为一用到<c:import>、<c:param>及属性范围的范例
Core_import.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>CH7 - Core_import.jsp</title>
</head>
<body>
<h2><c:out value="<c:import> 的用法" /></h2>
<c:set var="input1" value="使用属性范围传到Core_imported.jsp中" scope="request"/>包含core_imported.jsp中<hr/>
<c:import url="Core_imported.jsp"charEncoding="GB2312" >
<c:param name="input2" value="使用<c:param>传到Core_imported.jsp中"/>
</c:import><hr/>
${output1}
</body>
</html>
程序中,分别使用<c:set>和<c:param>来传递参数。
Core_imported.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>CH7 - Core_imported.jsp</title>
</head>
<body>
<fmt:requestEncoding value="GB2312" />
<c:set var="output1" value="使用属性范围传到Core_import.jsp中" scope="request"/>
${input1}</br>
<c:out value="${param.input2}" escapeXml="true" />
</body>
</html>
Core_imported.jsp是被包含的文件,它会把从Core_import.jsp传来的参数分别输出到页面上,必须注意的是input1参数是使用属性范围来传递的,因此可以直接用${input1}来得到参数,而input2则必须使用${param.input2}来得到参数。
此外,笔者还使用<c:set>来传递值给Core_import.jsp,这就是<c:param>无法做到的动作,<c:param>只能从包含端抛给被包含端,但是在属性范围中,可以让包含端也能得到被包含端传来的数据
Core_import.jsp的执行结果如图
--------------------------------
EL表达式不多用的值
取得请求字符串:${pageContext.request.queryString}<br />
取得不包括请求字符串的URL:${pageContext.request.requestURL}<br />
取得HTTP请求方法(GET、POST):${pageContext.request.method}<br />
取得请求的上下文路径:${pageContext.request.contextPath}<br />
取得用户的IP地址:${pageContext.request.remoteAddr}<br />
判断session是否由服务器产生而客户端未使:${pageContext.session.new}<br />
取得session的ID:${pageContext.session.id}<br />
取得服务器的信息:${pageContext.servletContext.serverInfo}
-----------------------------------------------
几个常用EL表达式的用法。
Posted on 2008-04-29 16:27 陕西BOY 阅读(770) 评论(2) 编辑 收藏
自从EL 表达式出现以来WEB的显示层就发生了大的变革;
显示数据变的更加方便,下面是EL表达式的几个基本用法。
1,用来获取表单数据 param 和 paramValues
1.jsp 的有如下表单
<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]}
${param.sampleSingleValue }
显示结果为12 SingleValue
第一个EL表达就相当于在servlet中使用request.getParameterValues("sampleValue");
第二个EL表达式就相当于在servlet中使用request.getParameter("sampleSingleValue");
2,用来从作用域中显示数据
假设 test.jsp中有 <% request.setAttribute("aaa","object");%>
用${aaa}可以将 object 显示在页面上.但最好使用 ${requestScope.aaa} 因为 EL 表达式在作用域中搜索值时
会从最小的 page 作用域开始搜索. 给定了作用域会使得显示的性能更好.
3, Empty 操作符
empty 操作符是一个前缀,用于检测一个值是否为null 或 empty . 假设 a 不存在 ,则 ${empty a }返回的结果为 true
4 条件操作符
${A?B:C } 如果A 为true 则返回B 否则返回 C
例如:
<select >
<option value="1" ${param.op==1 ? "selected" : ""}>选项一</option>
<option value="2" ${param.op==2 ? "selected" : "">选项二</option>
</select >
这个下拉列表是用于在修改数据的时候我们一般都要让它选中原始项 使用条件操作符就可以很轻松的实现这一点。
html标签中使用el表达式2008年08月25日 20:31在html中使用el表达式样可以运用<c:out value="el表达式" dafult="默认的显示" escapeXml=="true"/>
escapeXml 属性也是可选的。它控制当用 <c:out> 标记输出诸如“<”、“>”和“&”之类的字符(在 HTML 和 XML 中具有特殊意义)时是否应该进行转义。如果将 escapeXml 设置为 true,则会自动将这些字符转换成相应的 XML 实体(此处提到的字符分别转换成 <、> 和 &)。
例1:
如jsp页面中的session放有username,password等字段,则可以使用html的input标签等到session中的值:
<input type="text" value="<c:out value="${username}" default="guest"/>" />
例2:
<c:out value="${username}" default="guest"/>" escapeXml="true" />
如果${username}="Flynn & Sons"则结果是:Flynn & Sons