表达式语言EL.docx
- 文档编号:25565884
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:25
- 大小:38.74KB
表达式语言EL.docx
《表达式语言EL.docx》由会员分享,可在线阅读,更多相关《表达式语言EL.docx(25页珍藏版)》请在冰豆网上搜索。
表达式语言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> --使用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中设置 例如: ... ... web.xml中的 如果web.xml中的 如果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来编写,则可以修改如下: 在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对象中的值,点(.)运算符或[]运算符都可以使用。 例如,网页中若有某个地方有以下代码: <% Map 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时的键名称有空白或点字符时,这是可以正确取得值的方式。 例如: <% Map map.put("username","caterpillar"); map.put("local.role","admin"); request.setAttribute("login",map); %> ... User: ${login["username"]} User: ${login["local.role"]} []运算符的右边,除了可以是JavaBean、Map外,也可以是数组或List类型的对象。 之前示范过数组的例子,以下则是一个List的例子: <% List names.add("caterpillar"); names.add("momor"); request.setAttribute("names",names); %> ... User1: ${names[0]} User2: ${names[1]} 虽然可以在指定索引时使用双引号,如${names["0"]},不过一般指定索引不会这么特别写。 事实上,当[]运算符是使用双引号(")指定时,就是作为键名或索引来使用。 如果[]运算符中不是使用双引号,则会尝试做运算,结果再给[]来使用。 例如: <% List 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"。 所以,[]中也可以进行嵌套。 例如: <% List names.add("caterpillar"); names.add("momor"); request.setAttribute("names",names); Map 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${user.name}登录成功
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 表达式 语言 EL
![提示](https://static.bdocx.com/images/bang_tan.gif)