zoukankan      html  css  js  c++  java
  • jsp的el表达式

    其实工作那么久,一直都是写的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,一劳永逸。

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

  • 相关阅读:
    Code Review 五问五答
    JavaScript 10分钟入门
    swagger editor使用
    Tyk API网关介绍及安装说明
    Castle 多继承选择
    线程信息的获取和设置
    s3 api接口的调用
    在Hadoop集群上的HBase配置
    OpenStack 单元测试
    在Hadoop集群上的Hive配置
  • 原文地址:https://www.cnblogs.com/yanggb/p/10788733.html
Copyright © 2011-2022 走看看