el表达式分类 详细的讲解,例子

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     是否转换特殊字符,如:< 转换成 &lt;     Y boolean     否     true   
注意:假若value为null,会显示default的值;假若没有设定default的值,则会显示一个空的字符串。

说明
一般来说,<c:out>默认会将 <、>、’、” 和 & 转换为 &lt;、&gt;、&#039;、&#034; 和 &amp;。假若不想转换时,只需要设定<c:out>的escapeXml属性为fasle就可以了(见表7-3)。
表7-3

字符     Entity     
<     &lt;     
>     &gt;     
’     &#039;     
”     &#034;     
&     &amp;   
范例

<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>   
这样的做法等于是包含一个文件,并且所指定的网址会变成如下:

http://java.sun.com?test=1234   

范例
下面为一用到<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>只能从包含端抛给被包含端,但是在属性范围中,可以让包含端也能得到被包含端传来的数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值