JSP之EL表达式基础详解

一、el表达式简介

  • el表达式全称:expression language,即表达式语言
  • el表达式作用:代替jsp页面中表达式脚本进行数据的输出
  • el表达式比jsp的表达式脚本简洁很多
  • el表达式的格式是:${表达式} ,注:el表达式写在jsp页面中,表达式一般是域对象的key
  • 代码演示:在web目录下创建test.jsp

         <%
            request.setattribute("key", "value");		
        %>
        <%--  表达式脚本输出key1的值  --%>
        <%=request.getattribute("key1")%>
        <%--  el表达式输出key1的值  --%>
        ${key1}
        <%--  表达式脚本输出null值时页面显示null
              el表达式输出null值时页面什么都不显示(空串)--%>

    运行结果:

    在这里插入图片描述

    二、el表达式搜索域数据的顺序

    el表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,el表达式会按照四个域对象的范围从小到大进行搜索,找到就输出,与四个域对象声明的先后顺序无关

    代码演示:在web目录下创建test.jsp

         <%							  
            //向四个域对象中都保存相同key的值
            request.setattribute("key", "request");
            session.setattribute("key", "session");
            application.setattribute("key", "application");
            pagecontext.setattribute("key", "pagecontext");
        %>
        <%--  使用el表达式输出key的值  --%>
        ${key}

    运行结果:

    三、el表达式输出java类的属性

    代码演示:创建person类

    public class person {
        //输出person类中普通属性,数组属性,list集合属性和map集合属性
        private string name;
        private string[] phones;
        private list cities;
        private map map;
        //注意:没有声明age属性
        public int getage() {
            return 18;
        }
        //以及全参、空参构造器,各属性的getter/setter方法
    }
    

    代码演示:在web目录下创建test.jsp

         <%
            person person = new person();
            person.setname("jaychou");
            person.setphones(new string[]{"123","456","789"});
            //给cities属性赋值
            list cities = new arraylist();
            cities.add("北京");
            cities.add("上海");
            cities.add("深圳");
            person.setcities(cities);
            //给map属性赋值
            map map = new hashmap<>();
            map.put("key1","value1");
            map.put("key2","value2");
            map.put("key3","value3");
            person.setmap(map);
            pagecontext.setattribute("p", person);
        %>
        <%--el表达式中对象名.属性名不找属性的值,而是找名字对应的getxxx方法,没有此方法会报错--%>
        输出person:${ p }
    
        输出person的name属性:${p.name} 
    
        输出person的phones数组地址值:${p.phones} 
    
        输出person的phones数组属性值:${p.phones[2]} 
    
        输出person的cities集合中的元素值:${p.cities} 
    
        输出person的list集合中个别元素值:${p.cities[2]} 
    
        输出person的map集合: ${p.map} 
    
        输出person的map集合中某个key的值: ${p.map.key1} 
    
        <%-- 注意,即使没有age属性,但因为有getage方法,也可得出结果 --%>
        输出person的age值:${p.age} 
    
    
    
    

    运行结果:

    四、el表达式的运算

    语法:${运算表达式},el表达式支持以下运算符:

    1. 关系运算

    2. 逻辑运算

    3. 算数运算

    4. empty运算

    empty运算可以判断一个数据是否为空,若为空,输出true,不为空,输出false
    以下几种情况为空(在原本的key之前加empty关键字):
    (1)值为null、空串
    (2)值为object类型的数组且长度为0 (注:其他类型的长度为0的数组值为非空)
    (3)list、map集合元素个数为0

    5. 三元运算

    表达式 1?表达式 2:表达式 3
    表达式1为真返回表达式2的值,表达式1为假返回表达式3的值

    代码演示:在web目录下创建test.jsp

         <%
            //1、值为null值时
            request.setattribute("emptynull", null);
            //2、值为空串时
            request.setattribute("emptystr", "");
            //3、值是object类型数组,长度为零的时候
            request.setattribute("emptyarr", new object[]{});
            //4、list集合,元素个数为零
            list list = new arraylist<>();
            request.setattribute("emptylist", list);
            //5、map集合,元素个数为零
            map map = new hashmap();
            request.setattribute("emptymap", map);
            //6、其他类型数组长度为0
            request.setattribute("emptyintarr", new int[]{});
        %>
        ${ empty emptynull } 
    
        ${ empty emptystr } 
    
        ${ empty emptyarr } 
    
        ${ empty emptylist } 
    
        ${ empty emptymap } 
    
        ${ empty emptyintarr} 
    
        <%-- 三元运算   --%>
        ${ 12 != 12 ? "相等":"不相等" }
    
    
    

    运行结果:

    6. “.”点运算和“[ ]”中括号运算

    点运算可以输出某个对象的某个属性的值(getxxx或isxxx方法返回的值)
    中括号运算可以输出有序集合中某个元素的值

    注:中括号运算可以输出map集合中key里含有特殊字符的key的值

    代码演示:在web目录下创建test.jsp

         <%
            map map = new hashmap();
            map.put("a.a.a", "aaavalue");
            map.put("b+b+b", "bbbvalue");
            map.put("c-c-c", "cccvalue");
            request.setattribute("map", map);
        %>
        <%--特殊的key需要去掉最开始的"."并使用中括号和单引号(双引号)包起来--%>
        ${ map['a.a.a'] } 
     <%--如果不加中括号则相当于三个.运算--%> //错误的是 ${map.a.a.a}
        ${ map["b+b+b"] } 
     <%--如果不加中括号则相当于三个+运算--%>
        ${ map['c-c-c'] } 
     <%--如果不加中括号则相当于三个-运算--%>
    
    

    运行结果:

    在这里插入图片描述

    五、el表达式的11个隐含对象

    el表达式中的11个隐含对象是el表达式自己定义的,可以直接使用

    (1) pagescope、requestscope、sessionscope、applicationscope对象的使用

    代码演示:在web目录下创建test.jsp

         <%
            pagecontext.setattribute("key1", "pagecontext1");
            pagecontext.setattribute("key2", "pagecontext2");
            request.setattribute("key2", "request");
            session.setattribute("key2", "session");
            application.setattribute("key2", "application");
        %>
        <%--  获取特定域中的属性  --%>
        ${ pagescope.key1 } 
    
        ${ applicationscope.key2 }
        <%--  若直接获取key1或key2依然按照之前范围从小到大检索,无法获取指定域  --%>

    运行结果:

    (2) pagecontext对象的使用

    代码示例:在web目录下创建test.jsp

    <%@ page contenttype="text/html;charset=utf-8" language="java" %>
    
    
        title     <%-- 先通过pagecontext对象获取request、session对象,再获取以下内容 --%>
        <%--
            获取请求的协议:request.getscheme()
            获取请求的服务器ip或域名:request.getservername()
            获取请求的服务器端口号:request.getserverport()
            获取当前工程路径:request.getcontextpath()
            获取请求的方式:request.getmethod()
            获取客户端的ip地址:request.getremotehost()
            获取会话的唯一标识:session.getid()
        --%>
    1.协议: ${ pagecontext.request.scheme }
    
    2.服务器ip:${ pagecontext.request.servername }
    
    3.服务器端口:${ pagecontext.request.serverport }
    
    4.获取工程路径:${ pagecontext.request.contextpath }
    
    5.获取请求方法:${ pagecontext.request.method }
    
    6.获取客户端ip地址:${ pagecontext.request.remotehost }
    
    7.获取会话的id编号:${ pagecontext.session.id}

    运行结果:

    (3) param、paramvalues对象的使用

    代码示例:在web目录下创建test.jsp

         获取请求参数username的值:${ param.username } 
    
        获取请求参数password的值:${ param.password } 
    
        获取请求参数中第一个hobby的值:${ paramvalues.hobby[0] } 
    
        获取请求参数中第二个hobby的值:${ paramvalues.hobby[1] } 
    
        <%--  有多个同名的key时使用paramvalues的索引值决定获取哪一个,使用param只可获取第一个  --%>
        使用param获取hobby的值:${ param.hobby } 

    运行结果:
    浏览器地址栏输入:http://localhost:8080/mytest/test.jsp?username=jaychou&password=123&hobby=sing&hobby=dance

    (4) header、headervalues对象的使用

    代码示例:在web目录下创建test.jsp

         输出请求头[user-agent]的值:${ header["user-agent"] }
    
        输出请求头中第一个[user-agent]的值:${ headervalues["user-agent"][0] }

    (5) cookie对象的使用

    代码示例:在web目录下创建test.jsp

         获取cookie的名称:${ cookie.jsessionid.name } 
    
        获取cookie的值:${ cookie.jsessionid.value } 

    运行结果:

    (6) initparam对象的使用

    代码示例:在web.xml中写参数 (修改了web.xml中内容之后,需要重启服务才可生效)

         username     root       url     jdbc:mysql:///test  

    在web目录下创建test.jsp

         输出<context-param>username的值:${ initparam.username } 
    
        输出<context-param>url的值:${ initparam.url } 

    运行结果:

    相关文章