JSTL标签与EL表达式

时间:2022-11-02 08:52:58

                         JSTL标签与EL表达式

一、JSP表达式语言EL

1. EL表达式和JSP脚本表达式

简单的EL表达式:

<%@ page contentType="text/html; charset=UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">

<html>

<body>

${sampleValue + 1} <br>

</body>

</html>

① EL表达式总是放在大括号里,而且前面有一个美元符号前缀

Eg:${person.name}

② 用JSP脚本表达式设置一个<div>元素的style属性的代码为:

<divstyle=<%=mystyle%>>Hello</div>

用EL表达式的代码为:

<div style=${mystyle}>Hello</div>

区别:

所有的EL表达式以”${”开始,以“}”结尾,而所有的JSP脚本表达式是以”<%”开始,以”%>”结尾

③ 使用JSP脚本表达式在JSP中定义一个变量

Eg:<%!int JSPvariable=100;%>

    JSPvariable的值是:<%=JSPvariable%>

 

EL的主要目标是从JSP页面中消除Java代码,所以EL表达式不能在脚本中定义变量的,不能自己定义变量。

2. 在EL表达式中使用隐式变量

 

类别      隐式变量名   描述                  Eg

JSP      pageContext     当前页面的pageContext   ${pageContext.request.method}

作用域 pageScope   page作用域

requestScope request作用域

sessionScope Session作用域            ${  sessionScope .totalPrice}

applicationScope  Application作用域

 

请求参数 param  Request对象的参数,字符串 ${ param .name}或${param[“name”]}

paramValues Request对象的参数,字符串集合

 

请求头 header   HTTP信息头,字符串       ${ header .accpt}

headerValues HTTP信息头,字符串集合

 

Cookie cookie      Cookie

用于返回Servlet的getCookies()方法的结果

注:当容器解析EL表达式中的变量时,eg:${x}中的x,容器首先检查隐式变量。若找不到则依次查找page/request/session/application范围的属性。若还未找到就返回null。

1).默认变量pageScope、requestScope、sessionScope、applicationScope

4个默认变量包含Scope作用范围的参数集合,相当于被保存在java.util.Map中的某个参数。

eg:使用sessionScope变量的EL表达式

<%request.getSession().setAttribute("sampleValue",new Integer(10));%>

${sessionScope.sampleValue}

取得保存在Session中参数的sessionScope变量的EL表达式,“.”property访问操作符,在这里表示从Session中取得“sampleValue”的参数,并显示出来。显示结果为“10”

2).默认变量param、paramValues

这两个默认变量包含请求参数的集合,param表明请求包含的参数为单一控件,paramValues表明请求包含的参数为控件数组。

eg:提交请求的页面和接受的页面

<%@page contentType="text/html; charset=UTF-8"%>

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body>

<formaction="SampleJsp.jsp">

<inputtype="text" name="sampleValue" value="10">

<inputtype="text" name="sampleValue" value="11">

<inputtype="text" name="sampleValue" value="12">

<inputtype="text" name="sampleSingleValue"value="SingleValue">

<inputtype="submit" value="Submit">

</form>

</body>

</html>

在这个页面中定义了两组控件,控件名为“sampleValue”的是一套控件数组,控件名为“sampleSingleValue”的是单一控件,通过递交将请求参数传送到SampleJsp.jsp。

<%@page contentType="text/html; charset=UTF-8"%>

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<body>

${paramValues.sampleValue[2]}<br>

${param.sampleSingleValue}<br>

</body>

</html>

这是请求转发到的页面,通过EL表达式的paramValues变量得到控件数组中最后一个控件的递交参数,通过EL表达式的param变量得到单一控件的递交参数。控件数组参数的EL表达式使用“[]”来指定数组下标。本示例将显示控件数组中最后一个控件的值“12”和单一控件的值“SingleValue”。

 

3. EL运算符

1) 用于访问属性和集合的EL运算符:属性访问运算符使我们可以访问对象的成员,集合访问运算符可以返回Map/List/Array中的元素。

在EL中,这两种运算符的格式为:

① a.b:返回a的属性b的值。

② a[b]:返回a的键或索引为b的值。

Eg:若b是一个字符串,这两个运算符在EL中的操作方式是可以互换的。

${header[“host”]}

${header[‘host’]}

${header.host}

将产生相同的结果。在这种情况下,header是一个Map,所以会调用header.get(“host”)方法来取得并显示这EL表达式的结果。

HeaderValues.host则会返回一个数组,若要取出第0个元素,则:

${headerValuse.host[“0”]}

${headerValuse.host[‘0’]}

${headerValuse.host[0]}

2) EL算术、关系、逻辑运算符

 

类型      操作      运算符    示例      示例结果

算       加       +     ${6.80+-12}        -5.2

术       减       -

运       乘       *     ${2*3.14159} 6.283110.

算       除    /或div      ${-30.0/5}      -6.0

符       取模  %或mod      ${24%5}         4

 

关       等于      ==或=

系       不等于    !=

运       小于      <或it

算       大于      >或gt

符    小于等于     <=或le

大于等于     >=或ge

 

逻辑      逻辑与       &&或and

运算符    逻辑或       ||或or

逻辑非       !或not

 

其它      是否为空     empty

条件运算     a?b:c

 

操作符

功能和作用

.

访问一个bean属性或者Map entry

[]

访问一个数组或者链表元素

()

对子表达式分组,用来改变赋值顺序

? :

条件语句,比如:条件?ifTrue:ifFalse

如果条件为真,表达式值为前者,反之为后者

+

数学运算符,加操作

-

数学运算符,减操作或者对一个值取反

*

数学运算符,乘操作

/ 或div

数学运算符,除操作

% 或mod

数学运算符,模操作(取余)

== 或eq

逻辑运算符,判断符号左右两端是否相等,如果相等返回true,否则返回false

!= 或ne

逻辑运算符,判断符号左右两端是否不相等,如果不相等返回true,否则返回false

< 或lt

逻辑运算符,判断符号左边是否小于右边,如果小于返回true,否则返回false

> 或gt

逻辑运算符,判断符号左边是否大于右边,如果大于返回true,否则返回false

<= 或le

逻辑运算符,判断符号左边是否小于或者等于右边,如果小于或者等于返回true,否则返回false

>= 或ge

逻辑运算符,判断符号左边是否大于或者等于右边,如果大于或者等于返回true,否则返回false

&& 或and

逻辑运算符,与操作赋。如果左右两边同为true返回true,否则返回false

|| 或or

逻辑运算符,或操作赋。如果左右两边有任何一边为true返回true,否则返回false

! 或not

逻辑运算符,非操作赋。如果对true取运算返回false,否则返回true

empty

用来对一个空变量值进行判断: null、一个空String、空数组、空Map、没有条目的Collection集合

func(args)

调用方法, func是方法名,args是参数,可以没有,或者有一个、多个参数.参数间用逗号隔开

Eg:

${pageScope.sampleValue + 12} <br> //显示12

${(pageScope.sampleValue + 12)/3} <br> //显示4.0

${(pageScope.sampleValue + 12) /3==4} <br> //显示true

${(pageScope.sampleValue + 12) /3>=5} <br> //显示false

<input type="text"name="sample1" value="${pageScope.sampleValue + 10}"> //显示值为10Text控件

在EL表达式中不能使用Java方法。

二、标准标记库JSTL

Sun发布的标准JSTL1.1标签库有以下几个标签:

1)核心标签库:包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。

2)国际化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。

3)数据库标签库:可以做访问数据库的工作。

4)XML标签库:用来访问XML文件的工作,这是JSTL标签库的一个特点。

5)函数标签库:用来读取已经定义的某个函数。

1.通用标记

①用于异常捕获的<c:catch>标签

<c:catch var="err">

会抛出异常的代码

</c:catch>

如果标记之间的代码抛出了异常,异常的值会存储在页面范围变量e中。

否则,e会被删除。

<c:catch>标签允许在JSP页面中捕捉异常。它包含一个var属性,是一个描述异常的变量,改变量可选。若没有var属性的定义,那么仅仅捕捉异常而不做任何事情,若定义了var属性,则可以利用var所定义的异常变量进行判断转发到其他页面或提示报错信息。

Eg:

<c:catch var="err">

${param.sampleSingleValue[9] == 3}

</c:catch>

${err}

“${param.sampleSingleValue[9] == 3}”表达式有异常时,可以从var属性“err”得到异常的内容,通常判断“err”是否为null来决定错误信息的提示。

②用于显示的 <c:out>标签

<c:out>标签是一个最常用的标签,用于在JSP中显示数据。

类似于JSP脚本表达式<%=…%>

有一个必须的属性value,标记的功能就是显示value的值。

Eg<c:out  value=”${color}”/>

第一:如果value属性包括字符<>、‘、或者&,标记会显示相关的字符码

eg”>”显示成”&gt”……

第二:如果属性的变量还没有初始化,我们可以指定一个默认的值。通过第二个属性default设置。Eg<c:out value=”${color}”  default=”red” />

2.变量支持标记

①用于赋值的<c:set>标签
  <c:set>
标签用于为变量或JavaBean中的变量属性赋值的工作。
 
它的属性和描述如表所示:

<c:set>标签属性和说明:在设置JavaBeanMap

属性

描述

value

值的信息,可以是EL表达式或常量

target

被赋值的JavaBean实例的名称,若存在该属性则必须
    存在property属性(可选)

property

JavaBean实例的变量属性名称以及(可选)

var

被赋值的变量名(可选)

scope

变量的作用范围,若没有指定,默认为page(可选)

当不存在value的属性时,将以包含在标签内的实体数据作为赋值的内容。

Eg1<c:set  var=”num” value=”${4*4}”/>

             

        <c:set var=”num”>       ${8*2}    </c:set>

这两种方式都将num变量的值设置为16。第二种方式允许我们在<c:set>标记内插入标记操作。Eg<c:set var=”num”>

<c:out value=”${8+8}”/>

</c:set>输出结果相同

Eg2:若要设置JavaBean对象customer1zipcode属性

       <c:set target=”customer1”  property=” zipcode”>      55501    </c:set>

<c:set target=”customer1”  property=” zipcode”  value=”55501”>

用于删除的<c:remove>标签

<c:remove>标签用于删除存在于scope中的变量。

<c:remove>标签属性和说明

属性

描述

var

需要被删除的变量名,指定变量的名称

scope

(可选)变量的作用范围。指定其作用域,若不指定则先查找page作用域,然后是request,然后是session,最后是application

eg

使用<c:remove>标记从session作用域删除num变量

<c:remove var="num" scope="session"/>

${sessionScope.num} <br>EL表达式显示该变量时,该变量已经不存在了。

<c:remove>标记不能用于JavaBeanMap对象。

3.流程控制

1JSTL条件处理

标记<c:if><c:choose>的功能,与普通Java代码中的ifswitch-case语句基本一样。不同:没有else标记,同时这两个标记都需要一个用于设置布尔表达式的test属性。

Eg:只在显示x=9时才显示x的值:

<c:if test=”${x==’9’}”>  ${x}  </c:if>

注:变量的测试值必须用单引号括起来

标记<c:choose>本身并不包含任何属性,但它可以包含多个<c:when>标记,<c:when>标记中实现比较与测试属性分离。

Eg:基于color变量的值显示不同的文本

<c:choose>

<c:when test=”${color==’white’}”>

Light!

</c:when>

<c:when test=”${color==’black}”>

Dark!

</c:when>

<c:otherwise>

Colors!

</c:otherwise>

</ c:choose>

JSTL<c:choose>标记中,当没有满足条件时,我们使用可能的<c:otherwise>标记作为默认选项。

2)循环

<c:forEach>标签

<c:forEach>为循环控制标签。<c:forEach>标签属性和说明

属性

描述

items

进行循环的集合(可选)

begin

开始条件(可选)

end

结束条件(可选)

step

循环的步长,默认为1(可选)

var

做循环的对象变量名,若存在items属性,则表示循环集合中对象的变量名(可选)

varStatus

显示循环状态的变量(可选)

Eg1

<%ArrayList arrayList = new ArrayList();

arrayList.add("aa");

arrayList.add("bb");

arrayList.add("cc");

%>

<%request.getSession().setAttribute("arrayList",arrayList);%>

<c:forEach items="${sessionScope.arrayList}"var="arrayListI">

${arrayListI}

</c:forEach>

该示例将保存在Session中的名为“arrayList”ArrayList类型集合参数中的对象依次读取出来,items属性指向了ArrayList类型集合参数,var属性定义了一个新的变量来接收集合中的对象。最后直接通过EL表达式显示在页面上。

Eg2:简单循环:

<c:forEach var="i" begin="1" end="10"step="1">

${i}<br />

</c:forEach>

该示例从“1”循环到“10”,并将循环中变量“i”显示在页面上。

<c:forTokens>标签

<c:forTokens>标签可以根据某个分隔符分隔指定字符串,

相当于java.util.StringTokenizer类。

<c:forTokens>标签属性和说明

属性

描述

items

进行分隔的EL表达式或常量

delims

分隔符

begin

开始条件(可选)

end

结束条件(可选)

step

循环的步长,默认为1(可选)

var

做循环的对象变量名(可选)

varStatus

显示循环状态的变量(可选)

语法形式:

<c:forTokens  items="..."  delims="…"  [var="…"]  [varStatus=”…”] [begin="…"]  [end="…" ]  [step="…"] >

内容体

</c:forTokens>

 

eg

<c:forTokens items="aa,bb,cc,dd" begin="0"end="2" step="2" delims=","var="aValue">

${aValue}

</c:forTokens>

需要分隔的字符串为“aa,bb,cc,dd”,分隔符为“,”begin属性指定从第一个“,”开始分隔,end属性指定分隔到第三个“,”,并将做循环的变量名指定为“aValue”。由于步长为“2”,使用EL表达式${aValue}只能显示“aa

4.JSTL访问URL信息

<c:url>,重写URL并对其参数编码

<c:url>标签用于得到一个 URL地址。

<c:url>标签属性和说明

属性

描述

value

页面的URL地址

context

Web Context该属性用于得到不同Context下的URL地址,当出现context属性时,必须以“/”开头,此时也需要url属性以“/”开头(可选)

charEncoding

URL的字符集(可选)

var

存储URL的变量名(可选)

scope

变量名作用范围(可选)取值包括(page、)

下面看一个示例:

<c:url value="/MyHtml.html" var="urlPage" />

<a href="${urlPage}">link</a>

得到了一个 URL后,以 EL 表达式放入 <a> 标签的 href属性,达到链接的目的。

<c:import>:访问web应用程序之外的内容

若想访问Servlet容器外的内容,就必须使用<c:import>标记,通过url属性将URL的内容添加到JSP引用。URL可以是相对的,也可以是绝对的,若以斜线开始就会被当作应用程序内的绝对地址。可使用context属性设置URL的内容。

<c:url>配合,使用<c:url>var属性保存输入的内容;使用scope属性设置变量的作用域;或使用charEncoding属性控制其编码格式;可在<c:import>标记的内容中使用<c:param>标记,将参数添加到URL中。

Eg:创建一个变量newstuff,将变量设置等于content.html URL的内容中,在访问URL时添加两个参数:

<c:import  url=”/content.html”>  var=” newstuff”  scope=”session”>

<c:param  name=”par1”  value=”val1”/>

<c:param  name=”par2”  value=”val2”/>

</c:import>

<c:redirect>:重定向到不同的URL

<c:redirect>用于页面的重定向,该标签的作用相当于 response.setRedirect方法的工作。它包含 url context 两个属性,属性含义和 <c:url>标签相同。Eg1

<c:redirect url="/MyHtml.html"/>

该示例若出现在 JSP中,则将重定向到当前 Web Context下的“ MyHtml.html ”页面,一般会与 <c:if>等标签一起使用。

可以在<c:redirect>标记中使用context属性指定URL的上下文,使用<:param>标记添加参数。Eg2

<c:redirect  url=”/content.html”>

       <c:param  name=”par1” value=”val1”/>

<c:param  name=”par2”  value=”val2”/>

<c:redirect>