表达式语言EL.docx

上传人:b****9 文档编号:25565884 上传时间:2023-06-09 格式:DOCX 页数:25 大小:38.74KB
下载 相关 举报
表达式语言EL.docx_第1页
第1页 / 共25页
表达式语言EL.docx_第2页
第2页 / 共25页
表达式语言EL.docx_第3页
第3页 / 共25页
表达式语言EL.docx_第4页
第4页 / 共25页
表达式语言EL.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

表达式语言EL.docx

《表达式语言EL.docx》由会员分享,可在线阅读,更多相关《表达式语言EL.docx(25页珍藏版)》请在冰豆网上搜索。

表达式语言EL.docx

表达式语言EL

表达式语言(EL)

表达式语言(ExpressionLanguage,EL)是JSP2.0中引入的性特性,在JSP中使用EL表达式可以获取并显示页面数据。

可以将业务逻辑编写在JavaBean中,然后搭配

useBean>、

setProperty>、

getProperty>来取得、生成JavaBean对象,设置或取得JavaBean的值,这样有助于减少页面上Scriptlet的分量。

对于JSP中一些简单的属性、请求参数、报头与Cookie等信息的取得,一些简单的运算或判断,则可使用表达式语言(EL)来处理,甚至可以将一些常用的公用函数编写为EL函数,这对于网页上的Scriptlet又可以有一定分量的减少。

JSP2.0之后,EL已经正式纳入成为标准规范之一,可以在JSP网页中直接使用EL。

若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器(如至少Tomcat6)。

EL表达式可以直接用在JSP页面的静态文本中,也可以作为JSP标签的属性值来使用。

EL主要作用有:

获取数据、执行运算、获取web开发常用对象、调用Java方法。

1、EL简介

EL语法很简单,主要的语法结构:

${expression},(所有的EL都是以${为起始、以}为结尾的)。

有效表达式可以包含字面值(Java中合法的常量,如任何由单引号或双引号限定的字符串、true、false、null、Null、数值等)、运算符、变量(对象引用)和函数调用。

${sessionScope.user.sex}或${user.sex}

相当于JSPScriptlet的写法如下:

Useruser=(User)session.getAttribute("user");

Stringsex=user.getSex();

直接来改写下面的add.jsp页面,其中编写了以下Scriptlet:

<%

Stringa=request.getParameter("a");

Stringb=request.getParameter("b");

out.println("a+b="+(Integer.parseInt(a)+Integer.parseInt(b)));

%>

如果使用EL,则可以优雅地用一行代码来改写,甚至加强这段Scriptlet。

例如:

JSPDemoadd2.jsp

<%@pagecontentType="text/html"pageEncoding="UTF-8"errorPage="error.jsp"%>

DOCTYPEhtml>

加法网页

${param.a}+${param.b}=${param.a+param.b}

--使用EL-->

EL是使用${与}来包括所要进行处理的表达式,可使用点运算符(.)指定要存取的属性,使用加号(+)运算符进行加法运算。

param是EL隐含对象之一,表示用户的请求参数,param.a表示取得用户所发出的请求参数a的值。

①EL可进行自动转变类型。

${param.count+20}相当于Stringstr_count=request.getParameter("count");intcount=Integer.parseInt(str_count);count=count+20;

在结果页面中可以看到,输入的请求参数自动转换为基本类型并进行运算,且在结果中还增加了显示操作数的功能。

原来的add.jsp要有这样的结果,还得再增加Java代码。

②EL优雅地处理了null值的情况,对于null值直接以空字符串加以显示,而不是直接显示null值,在进行运算时,也不会因此发生错误而抛出异常。

③EL的点运算符还可以连续存取对象,就如同在Java代码中一般。

例如,原先需要这么编写:

方法:

<%=((HttpServletRequest)pageContext.getRequest()).getMethod()%>

参数:

<%=((HttpServletRequest)pageContext.getRequest()).getQueryString()%>

IP:

<%=((HttpServletRequest)pageContext.getRequest()).getRemoteAddr()%>

若是使用EL,则可以这么编写:

方法:

${pageContext.request.method}

参数:

${pageContext.request.queryString}

IP:

${pageContext.request.remoteAddr}

④pageContext也是EL的隐含对象之一,通过点运算符之后接上xxx名称,表示调用getXxx()方法。

如果必须转换类型,EL也会自行处理,而不用像编写JSP表达式元素时,必须自行做转换类型的动作。

⑤可以使用page指示元素的isELIgnored属性(默认是false),来设置JSP网页是否使用EL。

会这么做的原因可能在于,网页中己含有与EL类似的${}语法功能存在,例如使用了某个模板(Template)框架之类。

也可以在web.xml中设置标签为true来决定不使用EL。

例如:

...

*.jsp

true

...

web.xml中的是用来默认符合的JSP网页是否使用EL。

如果web.xml中的与page指令元素的isELignored设置都没有设置,如果web.xml是2.3或以下的版本,则不会执行EL,如果是2.4或以上的版本,则会执行EL。

如果JSP网页使用page指令元素的isELignored设置是否支持EL,则以page指令元素的设置为主,不管web.xml中的的设置是什么。

EL的保留字:

and、eq、gt、true、or、ne、le、false、no、lt、ge、null、instanceof、empty、div、mod。

2、使用EL取得属性(.与[]运算符)

EL提供“.”和“[]”两种运算符来取数据。

“.”运算符用来访问JavaBean对象的属性值或者是Map对象的一个键值,如:

${user.name}。

“[]”可以访问JavaBean对象的属性值、数组对象的元素、List对象的元素以及是Map对象的一个键值,如:

${user["name"]}或${user['name']}。

当要存取的属性名称中包含一些特殊字符,如.或?

等并非字母或数字的符号,就一定要使用“[]“。

例如:

${user.My-Name}应当改为${user["My-Name"]}。

如果要动态取值时,就可以用“[]“来做,而“.“无法做到动态取值。

例如:

${sessionScope.user[data]}中data是一个变量。

下列两者所代表的意思是一样的:

${sessionScope.user.sex}等于${sessionScope.user["sex"]}

.和[]也可以同时混合使用,如下:

${sessionScope.shoppingCart[0].price}

可以在JSP中将对象设置至page、request、session或application范围中作为属性,基本上是通过setAttribute()方法设置属性,使用getAttribute()取得属性,但这些方法调用必须在Scriptlet中进行。

如果不想编写Scriptlet,可以考虑使用

useBean>,

setProperty>与

getPropery>。

不过

getProperty>在使用上,语法仍是较为冗长。

如果只是要“取得”属性,使用EL则可以更为简洁。

例如:

getPropertyname="user"property="name"/>登录成功

如果使用EL来编写,则可以修改如下:

${user.name}登录成功

在EL中,可以使用EL隐含对象指定范围来取属性,EL隐含对象将在稍后介绍。

EL存取变量数据的方法很简单,例如:

${user.name},它的意思是取出某一范围中名称为user.name的变量。

若不指定属性的存在范围,则默认是以page、request、session、application的顺序来寻找EL中所指定的属性,假如全部的范围都没有找到时,就回传null。

以上例而言,就是在page范围中找到了user属性,点运算符后跟随着name,表示利用对象的getNarne()方法取得值,而后显示在网页上。

如果EL访问的对象是个数组对象,则可以使用[]运算符来指定索引以存取数组中的元素。

例如,若网页的某处在请求范围中设置了数组作为属性:

<%

String[]names={"caterpillar","momor","hamimi"};

request.setAttribute("array",names);

%>

如果现在打算取出属性,并访问数组中的每个元素,则可以如下使用EL:

名称一:

${array[O]}

名称二:

${array["1"]}

名称三:

${array['2']}

不仅数组对象可以在[]中指定索引来访问元素,如果属性是个List类型的对象,也可以使用[]运算符指定索引来进行访问元素。

点运算符(.)与[]运算符需要特别说明。

在某些情况下,可以使用点运算符(.)的场合,也可以使用[]运算符。

以下先进行归纳:

·如果使用点(.)运算符,则左边可以是JavaBean或Map对象。

·如果使用[]运算符,则左边可以是JavaBean、Map、数组或List对象。

所以不只可以使用点(.)运算符来取得JavaBean属性,也可以使用[]运算符。

例如,可以用点(.)运算符取得User的name属性:

${user.name}

也可以使用[]运算符采取得User的name属性:

${user["name"]}

如果想取得Map对象中的值,点(.)运算符或[]运算符都可以使用。

例如,网页中若有某个地方有以下代码:

<%

Mapmap=newHashMap)();

map.put("user","caterpillar");

map.put("role","admin");

request.setAttribute("login",map);

%>

则可以在网页某处使用点运算符取得Map中的值:

User:

${login.user}

User:

${login.role}

也可以在网页某处使用[]运算符取得Map中的值:

User:

${login["user"]}

User:

${login["role"]}

基本上,当左值是Map对象时,建议使用[]运算符,因为如果设置Map时的键名称有空白或点字符时,这是可以正确取得值的方式。

例如:

<%

Mapmap=newHashMap();

map.put("username","caterpillar");

map.put("local.role","admin");

request.setAttribute("login",map);

%>

...

User:

${login["username"]}

User:

${login["local.role"]}

[]运算符的右边,除了可以是JavaBean、Map外,也可以是数组或List类型的对象。

之前示范过数组的例子,以下则是一个List的例子:

<%

Listnames=newArrayList();

names.add("caterpillar");

names.add("momor");

request.setAttribute("names",names);

%>

...

User1:

${names[0]}

User2:

${names[1]}

虽然可以在指定索引时使用双引号,如${names["0"]},不过一般指定索引不会这么特别写。

事实上,当[]运算符是使用双引号(")指定时,就是作为键名或索引来使用。

如果[]运算符中不是使用双引号,则会尝试做运算,结果再给[]来使用。

例如:

<%

Listnames=newArrayList();

names.add("caterpillar");

names.add("momor");

request.setAttribute("names",names);

%>

User:

${names[param.index]}

在这个范例的EL中,使用了param.index,param是EL隐含对象,表示请求参数,这个范例会先寻找参数中index的值,让后再作为索引值给[]使用。

所以如果请求时使用了index=0,则显示"caterpillar",若index=1,则显示"momor"。

所以,[]中也可以进行嵌套。

例如:

<%

Listnames=newArrayList();

names.add("caterpillar");

names.add("momor");

request.setAttribute("names",names);

Mapdatas=newHashMap();

datas.put("caterpillar","caterpillar'sdata");

datas.put("momor","momor'sdata");

request.setAttribute("datas",datas);

%>

...

User:

${datas[names[param.index]]}

根据EL,如果请求时使用了index=0,则会取得names中索引0的值"caterpillar",然后用取得的值作为键,再从datas中取得对应的"caterpillar'sdata"。

3、EL隐含(内置)对象

在EL中提供有11个隐含对象(ImplicitObject),其中除了pageContext隐含对象对应javax.servlet.jsp.PageContext之外,其他隐含对象都是对应java.util.Map类型。

类别

对象

描述

JSP页面上下文

pageContext

引用当前JSP页面的pageContext内置对象

作用域

pageScope

获得页面作用范围中的属性值,相当于pageContext.getAttribute()

requestScope

获得请求作用范围中的属性值,相当于request.getAttribute()

sessionScope

获得会话作用范围中的属性值,相当于session.getAttribute()

applicationScope

获得应用程序作用范围中的属性值,相当于application.getAttribute()

请求参数

param

获得请求参数的单个值,相当于request.getParameter()

paramValues

获得请求参数的一组值,相当于request.getParameterValues()

HTTP请求头

header

获得HTTP请求头中的单个值,相当于request.getHeader()

headerValues

获得HTTP请求头中的一组值,相当于request.getHeadersValues()

Cookie

cookie

获得请求中的Cookie值

初始化参数

initParam

获得上下文的初始参数值

(1)、pageContext隐含对象:

对应于javax.servlet.jsp.PageContext类型,PageContext本身就是个JavaBean,只要是getXxx()方法(参考API),就可以用${pageContext.xxx}来取得。

可以使用${pageContext}来取得其他有关用户要求或页面的详细信息。

Expression

说明

${pageContext.request.queryString}

取得请求的参数字符串

${pageContext.request.requestURL}

取得请求的URL,但不包括请求之参数字符串

${pageContext.request.contextPath}

服务的webapplication的名称

${pageContext.request.method}

${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是否为新的,所谓新的session,表示刚由server产生而client尚未使用

${pageContext.session.id}

取得session的ID

${pageContext.servletContext.serverInfo}

取得主机端的服务信息

${pageContext.exception.message}

取得页面异常信息

(2)、属性范围相关隐含对象:

与属性范围相关的EL隐含对象有pageScope、requestscope、sessionScope与applicationScope,分别可以取得使用JSP隐含对象pageContext、request、session与application的setAttribute()方法所设置的属性对象。

如果不使用EL隐含对象指定作用范围,则默认从pageScope的属性开始寻找。

${sessionScope.username}相当于Stringusername=(String)session.getAttribute("username");

注意:

EL隐含对象pageScope、requestScope、sessionScope与applicationScope不等同于JSP隐含对象pageContext、request、session与application。

EL隐含对象pageScope、requestScope、sessionScope与applicationScope仅仅代表作用范围。

(3)、请求参数相关隐含对象:

与请求参数相关的EL隐含对象有param与paramValues。

举例来说,${pararm.user}其作用相当于<%=request.getParameter("user")%>。

paramValues则相当于request.getParameterValues(),可以取得窗体复选项的值,由于返回的是多个值,可以使用[]运算符来指定取得哪个元素,例如${paramValues.favorites[0]}就相当于<%=request.getParameterValues("favorites")[0]%>。

(4)、报头(Header)相关隐含对象:

如果要取得用户请求的报头数据,则可以使用header或headerValues隐含对象。

例如,${header["User-Agent"]}相当于<%=request.getHeader("User-Agent")%>,headerValues则相当于request.getHeaders()方法。

(5)、cookie隐含对象:

cookie隐含对象可用来取得用户的Cookie对象。

${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}。

如在Cookie中设置了username属性,则可使用${cookie.username.value}取得Cookie值。

(6)、初始参数隐含对象:

initParam可以用来取得web.xml中设置的ServletContent初始参数,也就是在中设置的初始参数。

例如,${initParam.initCount}的作用相当于<%=servletContext.getInitParamer("initCount")%>。

4、EL运算符

使用EL可以直接进行一些算术运算、逻辑运算与关系运算,就如同在一般常见的程序语言中的运算。

①empty运算符:

${emptyexpression},判断expression的值是否是null、空字符串、空数组、空Map或空集合(作用于一个集合,若该集合不存在或集合中没有元素,其结果都为true)。

②?

:

是个三元运算符:

?

前为true就返回:

前的值,若为false就返回:

后的值。

例如:

${user!

=null?

user.name:

“”}

③算术运算符:

有加法(+)、减法(-)、乘法(*)、除法(/或div)与求模(%或mod)。

④逻辑运算符:

有and、or、not。

⑤关系运算符:

有表示“小于”的<及lt(Less-than),表示“大于”的>及gt(Greater-than),表示“小于或等于”的<=及le(Less-than-or-equal),表示“大于或等于”的>=及ge(Greater-than-or-equal),表示“等于”的==及eq(Equal),表示“不等于”的!

=及ne(Not-equal)。

关系运算符也可以用来比较字符或字符串,而==、eq与!

=、ne也可以用来判断取得的值是否为null。

例子:

表达式

结果

表达式

结果

${1}

1

${1<2}或${1lt2}

true

${1+2}

3

${1>(4/2)}或${1gt(4/2)}

false

${1.2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1