表达式语言

表达式语言

1.EL简介

 

EL是一种简单的语言,可以访问和处理应用程序数据,而无须使用JSP脚本元素或JSP表达式。

EL最初是在标准标签库JSTL1.0中定义,从JSTL1.1开始,sun公司将EL表达式语言从JSTL规范中分离开来,正式独立为JSP2.0标准之一,因此只要是支持servlet2.4、JSP2.0以上的web容器,都可以在JSP网页中直接使用EL。

每个jsp页面可以用page指令的isELlgnored属性单独设置其状态。

语法:

<%page isELlgonred = “true|false”>

 

如果为true 则会被当做字符串被输出,为false则会调用EL引擎来解释执行其中的表达式。EL的最大优势是可以使用jsp的隐含对象,和javaBean组件,完成使用<%%>、<%=%>的功能,它具有以下特点:

·可以访问JSP的内置对象

·简化了对JavaBean集合的访问方式

·可以对数据自动类型转换

·可以通过各种运算符进行运算

·可以使用自定义函数实现更加复杂的业务功能

2.EL语法

 

语法:${表达式}

表达式可以是常量、变量,可以使用EL隐含对象、EL运算符和EL函数

 

2.1)EL中的常量

EL中的常量包含布尔、整型、浮点、字符串可UNLL常量

 

2.2)EL中的变量

 

EL表达式不同与jsp表达式从当前页面中定义的变量进行查询,而是由EL引擎调用PageContext.findAttribute(String )方法从jsp四大作用域中查找,它会从小到大范围的按顺序的查找直到找到变量,返回。找到后不再继续查找。如果没有救返回unll

要遵循java变量的命名规则,不能使用EL的保留字。

and,or,not,empty,div,mod,instanceof,eq,ne,lt,gt,le,ge,true,false,null.

 

 

2.3)EL中的.和[]操作符

 

  1. .操作符和java中的一样,访问对象的某个属性
  2. “[]”也用于访问对象的属性,属性需要使用双引号括起来。当属性包含非字母数字时依旧要用[]操作符,如:${header[“user-agent”]}
  3. 可以访问有序集合中指定索引的某个元素,如:${array[0]}
  4. 可以访问Map对象的key关键的值 如:${map[“key”]}

 

2.4)错误处理

 

EL访问一个不存在的变量会返回一个null

EL访问一个不存在对象的属性,会返回一个空值,而不会抛出异常

EL访问一个对象不存在属性时,会抛出PropertyNotFoundException

 

3.EL的隐含对象

为了方便地进行数据访问,EL表达式也提供了一系列可以直接使用的隐含对象。EL隐含对象按照使用途径的不同,可以分为与范围有关的隐含对象、与请求参数有关的隐含对象和其他隐含对象。

与范围有关的隐含对象:

pageScope

requsetScope

sessionScope

applicationScope

与请求参数有关的隐含对象

param

paramValues

其他隐含对象

pageContext

Header

headerValues

Cookie

initParam

 

3.1)与范围有关的隐含对象

 

使用EL访问会话域中的属性

${sessionScope.user.sex}

上述代码等效于以下代码:

<%

User user = (User)session.getArrtibute(“user”);

String sex = user.getsex();

Out.print(sex);

%>

上面的代码与EL比,EL完成了自动类型转换,而且大大的简化了代码量

 

演示代码

package com.qst.chapter08.javabean;
public class Student {

    private String name;

    private int age;

    public Student(){

        super();

    }

    public Student(String name, int age) {

        super();

        this.name = name;
    
        this.age = age;

    }



    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;
    
    }

    public int getAge() {

        return age;

    }



    public void setAge(int age) {

        this.age = age;

    }

}

*******************************************

 

 


 

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

pageEncoding="UTF-8" import="com.qst.chapter08.javabean.Student"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>与范围有关的隐含对象</title>

</head>

<body>

<%

pageContext.setAttribute("studentInPage", new Student("张三", 21));

%>

<jsp:useBean id="studentInSession"

class="com.qst.chapter08.javabean.Student" scope="session">

<jsp:setProperty name="studentInSession" property="name" value="李四" />

<jsp:setProperty name="studentInSession" property="age" value="22" />

</jsp:useBean>

<p>pageContext对象中获取属性值: ${pageScope.studentInPage.name}

${pageScope.studentInPage.age}</p>

<p>sessionScope对象中获取属性值: ${sessionScope.studentInSession.name}

${sessionScope.studentInSession.age} ${studentInSession.sage }</p>

</body>

</html>



3.2)与请求参数有关的隐含对象

 

下面演示一个请求地址中的参数


 

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

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>与请求参数有关的隐含对象</title>

</head>

<body>

<p>请求参数param1的值:${param.param1}</p>

<p>请求参数param2的值:${paramValues.param2[0]}</p>

</body>

</html>

 

 

地址:http://localhost:8080/xx/xxxx.jsp?param1=value1¶m2=value2.

 

他同样也适用于POST参数

 

 

3.3)其他隐含对象

 

对象

说明

pageContext

相当于jsp页面pageContext对象

Header

获取http请求头中的单个值

headerValues

获取http请求头中的一组值

Cookie

用于指定的Cookie

InitParam

用于获取上下文初始参数。

 

 

4.EL运算符

EL中的运算符和java大致相同,主要说empty运算符,empty运算符是一个前缀运算符,用于检测一个值是否为null

如:${empty sessionScope.username}

 

 

  1. EL的自定义函数

 

EL自定义函数就是提供一种语法允许在EL中调用某个Java类的静态方法EL自定义函数扩展EL表达式的功能,使其不再局限为一种数据访问语言,还可以通过方法调用实现一些更为复杂的业务处理。

EL函数语法如下:

${ns:func(a1,a2,...,an)}

 

EL自定义函数有一下几个步骤:

【步骤一】编写EL自定义函数的java类及类中的静态方法

次步骤中要求java类必须声明为public,映射的方法必须声明为public static类型。本实例将直接采用Tomcat自带的HTMLFilter类为样例,HTMLFilter类中定义了一个名称为filter的静态方法来实现特殊字符的转换。

package com.qst.xxx.util;



public final class HTMLFilter {

public static String filter(String message) {

    if (message == null)
    return (null);



    char content[] = new char[message.length()];

    message.getChars(0, message.length(), content, 0);

    StringBuilder result = new StringBuilder(content.length + 50);

    for (int i = 0; i < content.length; i++) {

        switch (content[i]) {

            case '<':

                result.append("<");

                break;

            case '>':

                result.append(">");

                break;

            case '&':

                result.append("&");

                break;

            case '"':

                result.append(""");

                break;

            default:

        result.append(content[i]);

    }

}

    return (result.toString());


 }

}

 

 

【步骤二】编写标签库描述文件(TLD文件)在TLD文件中描述自定义函数

Java类及其静态方法定义完成后,为此静态方法映射成为EL自定义函数,需要在一个标签库描述符(TLD)文件中对其进行描述。标签库描述文件是一个XML格式文件,拓展名为.TLD,名称任意,通常储存在项目WEB-INF目录下。

TLD文件的编写是一项非常繁琐且容易出错的的工作,此处将以一个Tomcat提供的TLD文件样例,以下为代码演示以样例为基础编写的特殊字符过滤函数的标签库描述符文件。

<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"

version="2.0">

<tlib-version>1.0</tlib-version>

<short-name>htmlFilter</short-name>

<uri>http://localhost:8080/chapter08/htmlFilter</uri>

<function>

<description>过滤特殊字符</description>

<name>filter</name>

<function-class>com.qst.chapter08.util.HTMLFilter</function-class>

<function-signature>java.lang.String filter( java.lang.String )</function-signature>

</function>

</taglib>

 

<taglib>是TLD的根元素,不应对其进行修改。

<uri>元素用于指定改TDL文件的URI,在jsp文件中需要通过此URI来引入该标签库文件。

<function>元素用来描述一个EL自定义函数,其中<name>子元素用于指定EL自定义函数的名称,<function-class>用于指定完整的java类名,<function-signature>子元素用于指定java类的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分开,编写完标签符文件后,需要将它放置在<EL应用程序的主目录WEB-INF下的除了classes和lib文件之外的任意子目录。>

 

【步骤三】在jsp页面中导入和使用自定义函数

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

pageEncoding="UTF-8"%>

<%@taglib prefix="qst" uri="http://localhost:8080/chapter08/htmlFilter"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>EL自定义函数的使用</title>

</head>

<body>

<%

String htmlContent = "<b>Hello,EL function!</b>";

pageContext.setAttribute("htmlContent", htmlContent);

%>

<p>使用EL字符过滤函数后的效果:</p>

${qst:filter(htmlContent)}

<p>直接输出含HTML字符内容的效果:</p>

${htmlContent}

</body>

</html>

通过以上:EL字符过滤函数的处理流程如下:

  1. 根据EL函数的前缀在页面中查询prefix属性设置为qst的taglib指令,并获得其uri在项目发布目录<TOMCAT_HOME>\webapp\xxx\WEB-INF目录及其子目录下查找uri相同的TDL文件,找到ELFuntion.tld文件。
  2. 在tld文件中找到name子元素的值为filter的<function>元素,获取该元素的子元素<function-class>指定的java类以及<function-signature>子元素指定的静态方法。
  3. 在项目发布<TOMCAT_HOME>\webapp\xxx\classes目录下查找HTMLFilter类,然后在查找签名形式为java.lang.String filter(java.lang.String)的public型的静态方法。
  4. 将EL中传递的EL自定义函数的参数值转换为TLD文件中对应的方法签名中的类型,然后调用EL自定义函数对应的java类中的静态方法。EL表达式获得并输出java类的静态方法返回结果。

 

 

                                                                                                                                 ------20180923周四 上午 图书馆

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring表达式语言(SpEL)是一种强大的表达式语言,用于在运行时计算表达式的值。SpEL可以用于配置文件、注解和代码中,支持对Bean的属性、方法和构造函数进行访问和操作,提供了很多常用的运算符和函数,是Spring框架中非常重要的一部分。 SpEL支持以下特性: 1. 引用Bean的属性和方法。可以使用“#”符号引用Bean的属性和方法,如“#user.name”表示引用名为user的Bean的name属性。 2. 调用静态方法和常量。可以使用“T()”关键字调用静态方法和常量,如“T(java.lang.Math).PI”表示引用Math类的PI常量。 3. 访问数组和集合。可以使用“[]”符号访问数组和集合,如“list[0]”表示访问名为list的集合的第一个元素。 4. 进行算术运算和比较运算。SpEL支持常见的算术运算和比较运算符,如“+”、“-”、“*”、“/”、“%”、“==”、“!=”、“<”、“>”等。 5. 定义变量和使用占位符。可以使用“#{}”定义变量和使用占位符,如“#{T(System).currentTimeMillis()}”表示定义一个名为currentTimeMillis的变量并赋值为当前时间的毫秒数。 6. 调用Bean的构造函数。可以使用“new”关键字调用Bean的构造函数,如“new java.util.Date()”表示调用java.util.Date类的无参构造函数。 SpEL可以在Spring的XML配置文件、@Value注解以及SpEL表达式注解中使用,可以方便地实现复杂的条件判断和动态计算。例如,可以使用SpEL表达式注解来实现@Scheduled注解的cron表达式的动态计算,或者在XML配置文件中使用SpEL表达式来实现Bean之间的依赖注入和条件配置等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值