EL(表达式语言)的运用

EL(表达式语言)
一、EL(表达式语言)概述
在EL(表达式语言)没有出现之前,开发Java Web应用程序时,需要将大量的Java代码片段嵌入到JSP页面中,这样会使页面看起来很乱,而使用EL则比较简洁。
1、EL的基本语法
EL表达式语法非常简单,它以“${"开头,以“}”结束,中间为合法的表达式,具体的语法格式如下:
${expresssion}
参数说明:
expression:用于指定要输出的内容,可以是字符串,也可以是由EL运算符组成的表达式
注意:要想在页面显示“${”字符串,必须在前面加上“\”,即"\${",或者写成"${'${'}",也就是用EL表达式输出"${".
2、EL表达式的特点
EL除了具有语法简单、使用方便的特点,还具有以下特点:
(1)EL可以与JSTL结合使用,也可以与javaScript语句结合使用。
(2)EL中会自动进行类型转换。如果想通过EL输入两个字符串型数值的和,可以直接通过“+”号进行连接(如${number1+numbei2}).
3)EL不仅可以访问一般变量,还可以访问JavaBean中的属性以及嵌套属性和集合对象。
(4)在EL中可以执行算术运算、逻辑运算、关系运算和条件运算等操作。
(5)在EL中可以访问JSP的作用域(request、session、page、application)
(6)扩展函数可以与Java类的静态方法进行映射。

二、与低版本的环境兼容-禁用EL
EL已经是一项成熟、标准的技术,只要安装的Web服务器能够支持Servlet2.4/JSP2.0,就可以在JSP页面中直接使用EL。由于在JSP2.0以前的版本中没有EL,所以JSP为了和以前的规范兼容,提供了禁用EL的方法。JSP提供了三种禁用EL的方法,如下:
1、使用斜杠“\”符号
使用斜杠符号禁用是一种比较简单的禁用EL的方法,该方法只需在EL的其实标记“${”前面加一个“\”符号。
2、使用page指令
使用JSP的page指令也可以禁用EL表达式,其具体语法格式如下:
<%@ page isELIgnore="布尔值"%>
参数说明:
isELIgnore:用于指定是否禁用页面中的EL,如果属性值为true,则忽略页面中的EL,否则将解析页面中的EL。
3、在web.xml文件中配置<el-ignored>元素
在web.xml文件中配置<el-ignored>元素可以实现禁用服务器中的EL,如下:
<jsp-config>
   <jsp-property-group>
       <url-pattern>*.jsp</url-pattern>
       <el-ignored>true</el-ignored>
   </jsp-property-group>
</jsp-config>
该方法适合于禁用Web'应用中所有JSP页面中的EL.

三、EL的运算符优先级
EL可以访问数据运算符、算术运算符、关系运算符、逻辑运算符、条件运算符及empty运算符等。运算符的优先级决定了在多个运算符同时存在时,各个运算符的求值顺序,对于同级的运算符采用从左到右计算原则,使用括号可以改变优先级。
1、通过EL访问数据
通过EL提供的“[]”和“.”运算符可以访问数据。通常情况下,“[]”和"."运算符是等价,可以相互代替。
例如:${info.id}和${info[id]是等价的。
但是也不是所有的情况都可以相互替代,例如,当对象的属性名中包括一些特殊的符号(-或.)时,就只能用“[]”运算符来访问对象的属性。例如,${info[user-id]}是正确的,而${info.user-name}是错误的。另外,EL的“[]”还有一个用途,就是用来获取数组或List集合中的数据。
(1)数组元素的获取
应用“[]”运算符可以获取数组的指定元素,但是“.”运算符不能。
如:${info[0]}或
<body>
    <%
      String[] arr={"Java Web开发典型模块大全","Java范例完全自学手册","JSP项目开发全程实录"};
      request.setAttribute("book",arr);
    %>
    <%
    String[] arr1= (String[]) request.getAttribute("book");
    for(int i=0;i<arr1.length;i++){
        request.setAttribute("request1",i);
   %>
       ${request1}:${book[request1]}<br>
   <%
    }
  %>
  </body>
</html>
(2)List集合的获取
应用“[]”运算符还可以获取List集合中的指定元素,但是“.”运算符则不能。
2、在EL中进行算术运算
在EL中,也可以进行算术运算,同java语言一样,EL提供了加、减、乘、除和求余5种算术运算符。
3、在EL中判断对象是否为空
在EL中,判断对象是否为空,可以通过empty运算符实现,该运算符是一个前缀(prefix)运算符,即empty运算符位于操作数前方,用来确定一个对象或变量是否为null或空。empty运算符的格式如下:
${empty expression}
参数说明:
expression用于指定要判断的变量或对象。
注意:一个变量或对象为null或空的意义是不同的。null表示这个变量没有指明任何对象,而空表示这个变量所属的对象的内容为空,例如,空字符串、空的数组或空的List容器。
4、在EL中进行逻辑运算
在EL中,通过逻辑运算符和关系运算符可以实现逻辑关系运算。关系运算符用于实现对两个表达式的比较,进行比较的表达式可以是数值型,也可以是字符串型。而逻辑运算符,则常用对JavaBean型的数据进行操作。逻辑运算符和关系运算符经常一同使用。

五、EL也直接通过对象名的隐含对象
为了能够获得Web应用程序中的相关数据,EL提供了11个隐含对象,这些对象类似于JSP的内置对象,也是直接通过对象名进行操作。在EL的隐含对象中,除了PageContext是JavaBean对象,对应与javax.servlet.jsp.PageContext类型,其它的隐含对象都对应于Java.util.Map类型。这些隐含对象可以分为页面上下文对象、访问作用域范围对象和访问环境信息的隐含对象3种。
1、页面上下文对象
页面上下文对象为pageContext,用于访问JSP内置对象(如request、response、out、session、exception和page等,但不能获取application、config和pageContext对象)和servletContext。在获取到这些对象后,就可以获取其属性值。这些属性与对象的getXXX()方法相对应,在使用时,去掉方法名中的get,并将首字母改为小写即可。下面将分别介绍如何应用页面上下文对象访问JSP的内置对象和servletContext对象。
(1)访问request对象,如下:
${pageContext.request}
获取到request对象之后,就可以通过该对象获取与客户端相关的信息。例如,HTTP报头信息、客户信息提交方式、客户端主机IP地址与端口号,例如:
${pageContxt.request.serverPort}
(2)访问response对象,如下:
通过pageContext获取JSP内置对象中的response对象
${pageContext.response}
获取到response对象之后,就可以通过该对象获取与响应有关的信息,例如:
${pageContext.response.contentType},返回响应的内容类型,这里为“text/html;charset=UTF-8”;
(3)访问out对象,如下:
${pageContext.out}
获取out对象之后,就可以通过该对象获取与输出有关的信息,例如:
${pageContext.out.bufferSize}
(4)访问session对象
${pageContext.session}
获取session对象后,就可以通过该对象获取与session相关的信息,例如:
${pageContext.session.maxInactiveInterval}
(5)访问exception对象
${pageContext.exception}
获取exception对象之后,就可以通过该对象获取JSP页面的异常信息,例如:
${pageContext.exception.message}
(6)访问page对象
${pageContext.page}
获取page对象后,就可以通过该对象获取当前页面的类文件,例如:
${pageContext.page.class}
2、访问作用域范围的隐含对象
在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope、requestScope、sessionScope和applicationScope。应用这4个隐含对象指定所要查找的标识符的作用域后,系统将不再按照默认的顺序(page、request、session、application)来查找相应的标识符。它们与JSP中的page、request、session及application内置对象相似。只不过这4个隐含对象只能用来获取指定范围的属性值,而不能取得其他的相关信息。
(1)pageScope隐含对象
pageScope隐含对象用于返回page(页面)范围内的属性值的集合,返回值为java.util.Map对象。
(2)requestScope隐含对象
sessioinScope隐含对象用于返回包含session范围内的属性值的集合,返回值为java.util.Map对象。
(3)sessionScope隐含对象
sessionScope隐含对象返回session范围内属性值的集合,返回值为java.util.Map对象。
(4)applicationScope对象
applicationScope隐含对象返回application范围内的属性值的集合,返回值为java.util.Map对象。
3、访问环境信息的隐含对象
在EL中,提供了6个访问环境的隐含对象。下面分别介绍:
(1)param对象
param对象用于获取请求参数的值,应用在参数值只有一个的情况下。在应用param对象时,返回的结果为字符串。
例如:<input type="text" name="name">
当表单提交后,要获取name文本框的值,使用下面的代码:
${param.name}
(2)paramValues对象
如果请求参数名对应多个值时,则需要使用paramValues对象获取请求参数的值,返回的结果为数组。
(3)header和headerValues对象
header对象用于获取HTTP请求的一个具体的header的值,但是在有些情况下,可能存在同一个header拥有多个不同的值的情况,这时就需要使用headerValues对象。
(4)initParam对象
initParam对象用于获取Web应用初始化参数的值。
在web.xml文件中设置一个初始化参数author,用于指定作者。具体代码如下:
<context-param>
     <param-name>author</param-name>
     <parma-value>lyt</param-value>
</context-param>
应用EL获取参数author的值,${initParam.author}
(5)cookie对象
虽然在EL中,并没有提供向cookie中保存值的方法,但是它提供了访问由请求设置的cookie的方法,这可以通过cookie隐含对象实现。如果在cookie中已经设定一个名称为username的值,那么可以使用${cookie.username}来获取该cookie对象,但是如果要获取cookie中的值,需要使用cookie对象的value属性。例如:
<% 
       Cookie  cookie=new Cookie("user","mrbccd");
       response.addCookie(cookie);
%>
${cookie.user.value}
注意:所谓的cookie是一个文本文件,它是以key、value的方法将用户会话信息记录在这个文本文件内,并将其暂时存放在客户端浏览器中。

六、定义和使用EL函数
1.定义和使用函数
函数的定义和使用分为以下三步骤:
(1)编写一个Java类,并在该类中编写公用的静态方法,用于实现自定义EL函数的具体功能。
(2)编写标签库描述文件,对函数进行说明,该文件的扩展名为.tld被保存在Web应用的WEB-INF文件夹下。
(3)在JSP页面中引用标签库,并调用定义的EL函数,实现相应的功能。
例如:
第一步:
package com.wgh;

public class StringDeal {
    public static String shiftEnter(String str){
        String newStr=str.replaceAll("\r\n","<br>");
        newStr=newStr.replaceAll(" ","&nbsp;");
        return newStr;
    }
}
第二步:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        web-jsptaglibrary_2_0.xsd
        http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
    <tlib-version>1.0</tlib-version>
    <uri>/stringDeal</uri>
    <function>
        <name>shiftEnter</name>
        <function-class>com.wgh.StringDeal</function-class>
        <function-signature>java.lang.String shiftEnter(java.lang.String)</function-signature>
    </function>
</taglib>
第三步:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
      <form name="form1" method="post" action="deal.jsp">
          <textarea name="context" cols="30" rows="5"></textarea>
          <br>
          <input type="submit" value="提交" >
      </form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="/stringDeal" prefix="wghfn"%>
<%request.setCharacterEncoding("UTF-8");%>
<html>
<head>
    <title>显示结果</title>
</head>
<body>
    内容为:<br>
  ${wghfn:shiftEnter(param.context)}<!--param.context获取文本框的内容-->
</body>
</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值