自动喷油漆设备:EL 表达式tag - 迟却懂的日志 - 网易博客

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 18:03:16

EL 表达式tag

<%@ 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   

主要用来显示数据的内容,就像是 <%= scripting-language %> 一样,例如:

Hello !    

语法

语法1:没有本体(body)内容

语法2:有本体内容

default value

属性

名 称    说 明    EL 类 型 必 须    默认值     

value    需要显示出来的值    Y Object    是    无     

default    如果value的值为null,则显示default的值 Y Object    否    无     

escapeXml    是否转换特殊字符,如:< 转换成 <    Y boolean    否    true   

注意:假若value为null,会显示default的值;假若没有设定default的值,则会显示一个空的字符串。

说明

一般来说,默认会将 <、>、’、” 和 & 转换为 <、>、'、" 和 &。假若不想转换时,只需要设定的escapeXml属性为fasle就可以了(见表7-3)。

表7-3

字符    Entity     

<    <     

>    >     

’    '     

”    "     

&    &   

范例

   

1.在网页上显示 Hello JSP 2.0 !! ;

2.在网页上显示 8;

3.在网页上显示由窗体传送过来的data参数之值,假若没有data参数,或data参数的值为null时,则网页上会显示No Data;

4.在网页上显示“

有特殊字符

”;

5.在网页上显示“有特殊字符”。

主要用来将变量储存至JSP范围中或是JavaBean的属性中。

把1+1的结果2储存到number变量中。如果没有value属性,此时value之值在之间,本体内容看下面的范例:

   

范例

${3 + 5}

   

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变量。  

主要用来移除变量。

语法

属性

名 称    说 明    EL    类型    必须 默认值     

var    欲移除的变量名称    N    String    是    无     

scope    var变量的JSP范围    N    String    否    page   

说明

必须要有var属性,即要被移除的属性名称,scope则可有可无,例如:

c:remove var="number" scope="session" />   

将number变量从Session范围中移除。若我们不设定scope,则将会从Page、Request、Session及Application中顺序寻找是否存在名称为number的数据,若能找到时,则将它移除掉,反之则不会做任何的事情。

范例

<%@ page contentType="text/html;charset=GB2312" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

CH7 - Core_set_remove.jsp

<%= 3 %>

4

初始设置

   

  

pageScope.number
requestScope.number
sessionScope.number

pageScope.number
requestScope.number
sessionScope.number

pageScope.number
requestScope.number
sessionScope.number

   

一开始各在Page、Request和Session三个属性范围中储存名称为number的变量。然后先使用把Page中的number变量移除,最后再使用把所有属性范围中number的变量移除。

主要用来处理产生错误的异常状况,并且将错误信息储存起来

语法

… 欲抓取错误的部分

属性

名 称 说 明    EL 类型    必须 默认值     

var    用来储存错误信息的变量    N    String    否    无   

说明

主要将可能发生错误的部分放在之间。如果真的发生错误,可以将错误信息储存至varName变量中,例如:

: //可能发生错误的部分

   

另外,当错误发生在之间时,则只有之间的程序会被中止忽略,但整个网页不会被中止。

范例

<%@ page contentType="text/html;charset=GB2312 " %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

CH7 - Core_catch.jsp

<%

String eFormat = "not number";

int i = Integer.parseInt(eFormat);

%>

${error_Message}

   

输出结果

的用法

java.lang.NumberFormatException:For input string:"number"

如果把拿掉,会输出如下

流程控制==========================================

流程控制分类中包含四个标签:

的用途就和我们一般在程序中用的if一样。

语法

语法1:没有本体内容(body)

语法2:有本体内容

本体内容

属性

名 称    说 明    EL 类 型 必 须    默认值     

test    如果表达式的结果为true,则执行本体内容,false则相反 Y boolean    是    无     

var    用来储存test运算后的结果,即true或false    N String    否    无     

scope    var变量的JSP范围    N String    否    page   

说明

标签必须要有test属性,当test中的表达式结果为true时,则会执行本体内容;如果为false,则不会执行。例如:${param.username = = 'admin'},如果param.username等于admin时,结果为true;若它的内容不等于admin时,则为false。

接下来看下列的范例:

ADMIN您好!! //body部分

   

如果名称等于admin,则会显示"ADMIN您好!! "的动作,如果相反,则不会执行的body部分,所以不会显示"ADMIN您好!! //body部分"。另外的本体内容除了能放纯文字,还可以放任何JSP程序代码(Scriptlet)、JSP 标签或者HTML码。

除了test属性之外,还有另外两个属性var和scope。当我们执行的时候,可以将这次判断后的结果存放到属性var里;scope则是设定var的属性范围。哪些情况才会用到var和scope这两个属性呢?例如:当表达式过长时,我们会希望拆开处理,或是之后还须使用此结果时,也可以用它先将结果暂时保留,以便日后使用。

流程控制待续

迭代操作==========================================

迭代(Iterate)操作主要包含两个标签:

为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行的本体内容。

语法

语法1:迭代一集合对象之所有成员

[begin="begin"] [end="end"] [step="step"]>

本体内容

/c:forEach>

语法2:迭代指定的次数

本体内容

属性

名 称    说 明    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);

%>

${item}

   

中指定的集合对象atts将会从第2个成员开始到第5个成员,并且每执行一次循环都会间隔一个成员浏览。因此结果是只显示atts[1]和atts[3]的内容

另外,还提供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" %>

CH7 - Core_forEach3.jsp

<%

String atts[] = new String [5];

atts[0]="hello";

atts[1]="this";

atts[2]="is";

atts[3]="a";

atts[4]="pen";

request.setAttribute("atts", atts);

%>

的四种属性:

index:${s.index}

count:${s.count}

first:${s.first}

last:${s.last}

   

用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。

语法

[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>

本体内容

属性

说明

的begin、end、step、var和varStatus用法都和一样,因此,笔者在这里就只介绍items和delims两个属性:items的内容必须为字符串;而delims是用来分割items中定义的字符串之字符。

范例

${item}

   

上面范例执行后,将会在网页中输出ABCDE。它会把符号“,”当做分割的标记,拆成5个部分,也就是执行循环5次,但是并没有将A,B,C,D,E中的“,”显示出来。items也可以放入EL的表达式,如下:

<%

String phoneNumber = "123-456-7899";

request.setAttribute("userPhone", phoneNumber);

%>

${item}

   

这个范例将会在网页上打印1234567899,也就是把123-456-7899以“-”当做分割标记,将字符串拆为3份,每执行一次循环就将浏览的部分放到名称为item的属性当中。delims不只指定一种字符来分割字符串,它还可以一次设定多个分割字符串用的字符。如下面这个范例:

${item}

   

此范例会在网页输出ABCDE,也就是说,delims可以一次设定所有想当做分割字符串用的字符。其实用也能做到分割字符串,写法如下

${item}

   

上述范例同样也会在网页输出ABCDE。并没有delims这个属性,因此无法设定分割字符串用的字符,而分割字符串用的字符只有“,”,这和使用,delims属性设为“,”的结果相同。所以如果使用来分割字符串,功能和弹性上会比使用来得较大。

URL操作 =============================================================

JSTL包含三个与URL操作有关的标签,它们分别为:。它们主要的功能是:用来将其他文件的内容包含起来、网页的导向,还有url的产生

也支持FTP协议,假设现在有一个FTP站台,地址为ftp.javaworld.com.tw,它里面有一个文件data.txt,那么可以写成如下方式将其内容显示出来:

ftp://ftp.cse.yzu.edu.tw/data.txt" />   

如果是使用相对地址,假设存在一个文件名为Hello.jsp,它和使用的网页存在于同一个webapps的文件夹时,的写法如下:

   

如果以“/”开头,那么就表示跳到web站台的根目录下,以Tomcat为例,即webapps目录。假设一个文件为hello.txt,存在于webapps/examples/images里,而context为examples,可以写成以下方式将hello.txt文件包含进我们的JSP页面之中:

   

接下来如果要包含在同一个服务器上,但并非同一个web站台的文件时,就必须加上context属性。假设此服务器上另外还有一个web站台,名为others,others站台底下有一个件夹为jsp,且里面有index.html这个文件,那么就可以写成如下方式将此文件包含进来:

   

  

注意     

被包含文件的web站台必须在server.xml中定义过,且的crossContext属性值必须为true,这样一来,others目录下的文件才可以被其他 web站台调用。

erver.xml的设定范例如下:

s

reloadable="true" crossContext="true"/>

:   

除此之外,也提供var和scope属性。当var属性存在时,虽然同样会把其他文件的内容包含进来,但是它并不会输出至网页上,而是以String的类型储存至varName中。scope则是设定varName的范围。储存之后的数据,我们在需要用时,可以将它取出来,代码如下:

   

我们可以把常重复使用的商标、欢迎语句或者是版权声明,用此方法储存起来,想输出在网页上时,再把它导入进来。假若想要改变文件内容时,可以只改变被包含的文件,不用修改其他网页。

另外,可以在的本体内容中使用,它的功用主要是:可以将参数传递给被包含的文件,它有两个属性name和value,如表

名 称    说 明    EL    类 型    必 须    默认值     

name    参数名称    Y    String    是    无     

value    参数的值    Y    String    否    本体内容   

这两个属性都可以使用EL,所以我们写成如下形式:

http://java.sun.com" >

   

这样的做法等于是包含一个文件,并且所指定的网址会变成如下:

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

范例

下面为一用到及属性范围的范例

Core_import.jsp

<%@ page contentType="text/html;charset=GB2312" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

CH7 - Core_import.jsp

包含core_imported.jsp中



${output1}

  

程序中,分别使用来传递参数。

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" %>

CH7 - Core_imported.jsp

${input1}

  

Core_imported.jsp是被包含的文件,它会把从Core_import.jsp传来的参数分别输出到页面上,必须注意的是input1参数是使用属性范围来传递的,因此可以直接用${input1}来得到参数,而input2则必须使用${param.input2}来得到参数。

此外,笔者还使用来传递值给Core_import.jsp,这就是无法做到的动作,只能从包含端抛给被包含端,但是在属性范围中,可以让包含端也能得到被包含端传来的数据

Core_import.jsp的执行结果如图

待续。。。。。。。。