jsp的el表达式

荒凉一梦 提交于 2019-12-20 09:01:09

其实工作那么久,一直都是写的Freemarker模板页面,直到最近才开始写JSP页面,所以这里完整学一下JSP原生支持的EL表达式(web.xml的3.0版本默认支持,后面说)。

EL的全名是Expression Language,它原本是JSTL 1.0为了方便存储数据所自定义的语言,发展到现在已经是一项成熟、标准的技术。

使用EL表达式获取数据

EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的WEB域中检索Java对象并获取数据,比如某个WEB域中的Java Bean、List集合、Map集合或数组等对象。

使用EL表达式获取数据的通常语法是:${标识符}。EL表达式在执行的时候,会调用pageContext.findAttribute方法,用标识符作为关键字,分别从page、request、session、application四个域中查找并返回匹配的对象,找不到则返回空字符串。

使用EL表达式执行运算

语法和获取数据的语法一样:${运算表达式}。EL表达式支持以下运算符:

关系运算符:

逻辑运算符:

empty运算符:检查对象是否为空(null),比如 ${empty user} 。

三目运算符:${user != null ? user.name : "游客"} 。

下标/属性运算符和属性运算符:${users[0]} 或 ${users[name]} 和 ${user.name} 。

使用EL表达式获得WEB开发常用对象

EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取WEB开发中的一些常见对象,并读取这些对象的数据。语法也是一样样的:${隐含对象名称}

隐含对象名称 描述
pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)
pageScope 代表page域中用于保存属性的Map对象
requestScope 代表request域中用于保存属性的Map对象
sessionScope 代表session域中用于保存属性的Map对象
applicationScope 代表application域中用于保存属性的Map对象
param 表示一个保存了所有请求参数的Map对象
paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
header 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”]
headerValues 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
cookie 表示一个保存了所有cookie的Map对象
initParam 表示一个保存了所有web应用初始化参数的map对象

使用EL表达式调用Java方法(EL自定义函数)

EL表达式允许开发人员开发自定义函数,以调用Java类的方法,用于扩展EL表达式的功能,让EL表达式完成普通Java程序代码所能完成的功能。

在EL表达式中调用的只能是Java类的静态方法,这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。

使用上还是熟悉的语法:${prefix: methiod(params)}

一般来说,EL自定义函数的开发与应用包含以下三个步骤:

1.编写一个Java类的静态方法。

public class SayHello {
    public static String sayHello(String name) {
        return "你好," + name;
    }
}

2.在WEB-INF目录下编写TLD(标签库描述符)文件,在TLD文件中描述自定义函数。

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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">
    <tlib-version>1.0</tlib-version>
    <short-name>EL Function</short-name>
    
    <!-- 自定义EL函数库的引用URI,
        在JSP页面中可以这样引用:<%@taglib uri="/sayHelloFunction" prefix="fn" %> -->
    <uri>/sayHelloFunction</uri>
    
    <!-- <function>元素用于描述一个EL自定义函数 -->
    <function>
        <description>html标签转义处理方法</description>
        
        <!-- <name>子元素用于指定EL自定义函数的名称 -->
        <name>sayHello</name>
        
        <!-- <function-class>子元素用于指定完整的Java类名 -->
        <function-class>me.gacl.util.SayHello</function-class>
        
        <!-- <function-signature>子元素用于指定Java类中的静态方法的签名,
            方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。-->
        <function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
    </function>    
</taglib>

3.在JSP页面中导入和使用自定义函数。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%-- 引入EL自定义函数库 --%>
<%@taglib uri="/sayHelloFunction" prefix="fn" %>
<!DOCTYPE HTML>
<html>
<head>
    <title>使用EL调用Java方法</title>
</head>

<body>
    <%-- 使用EL调用filter方法 --%>
    ${fn:sayHello("静静")}
</body>
</html>

注意,编写完TLD(标签库描述符)文件后,需要将它放置到<web应用>\WEB-INF\目录下的除了classes和lib目录之外的任意子目录中。TLD文件中的<uri>标签用于指定该TLD文件的URI,在JSP文件中可以通过这个URI来引入该标签库描述文件。

EL表达式保留关键字

EL表达式无效的原因及解决办法

EL表达式是JSP 2.0规范中的一项技术。因此,若想正确解析EL表达式,需要使用支持Servlet2.4/JSP2.0技术的WEB服务器。同时也要注意Tomcat 6以下是不能支持EL表达式的。

在3.0版本的web.xml环境下,JSP是默认支持EL表达式的。但是3.0之前的版本则是需要通过JSP页面上的一个标签中的一个属性去控制是否能使用EL表达式的:

<%@ page isELIgnored="false"%>

这个属性值默认是true,即默认是关闭EL表达式的,我们可以在JSP页面上加上这段代码使JSP页面开启EL表达式的使用支持。但是这样的话,每个JSP页面都要把这段代码写一遍,比较麻烦,最好是直接升级web.xml的版本到3.0,一劳永逸。

 

"我想哭,你可不可以暂时别要睡。"

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!