EL表达式详解

该篇博客主要关于EL表达式,废话不多说=-=进入正题

博客目录

1、EL表达式介绍
2、EL获取数据
3、EL中的内置对象
4、EL访问Bean的属性
5、EL访问数组中的数据
6、EL获取list中数据
7、EL访问Map
8、EL中的运算符(empty)
9、自定义EL函数
10、总结

一、EL表达式介绍

  • Expression Language表达式语言
  • 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
  • 在JSP2.0开始引入概念

语法格式

在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值


二、EL获取数据(从四大域中获取属性)

  • EL只能从四大域中获取属性

1、如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值

- pageContext
        
        
        
        
        Insert title here
        
        
            <%
                pageContext.setAttribute("name", "linjie");
                request.setAttribute("name", "lucy");
                session.setAttribute("name", "king");
                application.setAttribute("name", "bilibili");
            %>
            name=${name }
        
        

EL表达式详解_第1张图片

可以看出没有使用EL内置对象时查找顺序是由小到大,所以最先显示的是pageContext域中的

2、使用EL内置对象,从指定域中获取数据,提高了查找效率

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




Insert title here


    <%
        pageContext.setAttribute("name", "linjie");
        request.setAttribute("name", "lucy");
        session.setAttribute("name", "king");
        application.setAttribute("name", "bilibili");
    %>
    name=${applicationScope.name }


EL表达式详解_第2张图片

可以看出,使用applicationScope即可指定application域中的name输出,当然其他域也是类似,下文会说这四大域属性相关的内置对象


三、EL中的内置对象

EL有11个内置对象,这里主要讲域属性相关的4个和其他4个
EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型

1、域属性相关(4个)

  1. pageScope:从page范围域属性空间中查找指定的key
  2. requestScope:从request范围域属性空间中查找指定的key
  3. sessionScope:从session范围域属性空间中查找指定的key
  4. applicationScope:从application范围域属性空间中查找指定的key

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    
    
    
    Insert title here
    
    
        <%
            pageContext.setAttribute("name", "linjie");
            request.setAttribute("name", "lucy");
            session.setAttribute("name", "king");
            application.setAttribute("name", "bilibili");
        %>
    
        name=${applicationScope.name }
    name=${pageScope.name }
    name=${sessionScope.name }
    name=${requestScope.name }

EL表达式详解_第3张图片


2、其他重要内置对象(4个)

1、pageContext

该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取

  • 在EL中直接${pageContext.request}即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象

重点:其中最常用的:${pageContext.request.contextPath },代表web应用下的根,可以看出下面action中的路径可读性更强了

Regster.java

package linjie.com;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Regster extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

index.jsp

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




Insert title here


<%-- ${pageContext.request.contextPath }代表web应用的根 --%>
    
xxx
yyy

EL表达式详解_第4张图片

2、param(获取请求中的指定参数)
  • 其底层实际调用request.getParameter()

index.jsp

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




Insert title here


<%-- ${pageContext.request.contextPath }代表web应用的根 --%>
    
xxx
yyy

show.jsp

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




Insert title here


    name=${param.name }
age=${param.age }

客户浏览器访问结果

EL表达式详解_第5张图片

EL表达式详解_第6张图片

3、paramValues

获取请求中的指定参数的所以值,其底层实际调用request.getParameterValues()


index.jsp

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




Insert title here


<%-- ${pageContext.request.contextPath }代表web应用的根 --%>
    
xxx
yyy
爱好: 睡觉

show.jsp

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




Insert title here


    name=${param.name }
age=${param.age }
hobby[0]=${paramValues.hobby[0] }
hobby[1]=${paramValues.hobby[1] }

客户浏览器显示结果

EL表达式详解_第7张图片

EL表达式详解_第8张图片

4、initParam

获取初始化参数,其底层调用的是ServletContext.getInitParameter()


web.xml



  07eltttt
  
    index.jsp
  


  
    name
    林杰
  


  
    Regster
    Regster
    linjie.com.Regster
  
  
    Regster
    /regster
  

index.jsp

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




Insert title here


    name=${initParam.name }


客户浏览器显示结果

EL表达式详解_第9张图片


四、EL访问Bean的属性

1、什么是java Bean

JavaBean是公共Java类,但是为了编辑工具识别

需要满足至少三个条件

  • 有一个public默认构造器(例如无参构造器)
  • 属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。
  • 需要序列化。这个是框架,工具跨平台反映状态必须的

2、EL访问Bean属性

EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法


Demo.java

package linjie.com;
/*
 *Bean 
 */
public class Demo {
    private String name;
    private int age;
    public Demo(String name,int age){
        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;
    }
    @Override
    public String toString() {
        return super.toString();
    }

}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="linjie.com.Demo"
    pageEncoding="UTF-8"%>




Insert title here


    <%
        Demo test=new Demo("linjie",12);
        request.setAttribute("ELttt", test);
    %>
    name=${requestScope.ELttt.name }
age=${requestScope.ELttt.age }
names=${requestScope.ELtttxx.name }

客户浏览器显示结果

EL表达式详解_第10张图片


五、EL访问数组中的数据

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




Insert title here
     

    <%
        String[] names={"xlj","lucy","king"};
        pageContext.setAttribute("names", names);
    %>
    name[1]=${names[1] }
names[5]=${names[5] }

下面是访问类的数组

Stu.java

package linjie.com;
/*
 *Bean 
 */
public class Stu {
    private String sname;
    private String address;
    public Stu() {
        super();
    }

    public Stu(String sname, String address) {
        super();
        this.sname = sname;
        this.address = address;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return super.toString();
    }


}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="linjie.com.*"
    pageEncoding="UTF-8"%>




Insert title here



    <%
        Stu[] stus=new Stu[3];
        stus[0]=new Stu("xlj","A");
        stus[1]=new Stu("lucy","B");
        stus[2]=new Stu("kingA","C");
        pageContext.setAttribute("stus",stus);
    %>
    stus[1].Sname=${stus[1].sname }


客户浏览器显示结果

EL表达式详解_第11张图片


六、EL获取list中数据

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


    <%
        List names=new ArrayList();
        names.add("xlj");
        names.add("lucy");
        pageContext.setAttribute("names", names);
    %>

    
    names[1]=${names[1] }

客户浏览器显示结果

EL表达式详解_第12张图片

注意:

EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念


七、EL访问Map

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


    <%
        Map map=new HashMap();
        map.put("age", 20);
        map.put("name", "xlj");
        pageContext.setAttribute("map", map);
    %>
    name=${map.name }
age=${map.age }

客户浏览器显示结果

EL表达式详解_第13张图片


八、EL中的运算符(empty)

1、先说说几个常用运算符

  • 算术运算符:+、-、*、/、%(不支持++、–)
  • 关系运算符:==、!=、>、>=、<、<=
  • 逻辑运算符:!、&&、||、not、and、or
  • 条件运算符:?:
  • 取值运算符:[]、点号

2、empty运算符

用法为${empty 变量},结果为布尔值

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


    <%
        String name1=null;
        String name2="";
        List name3=new ArrayList();

        pageContext.setAttribute("name1", name1);
        pageContext.setAttribute("name2", name2);
        pageContext.setAttribute("name3", name3);
    %>
    empty对于没有定义的变量,运算结果为true:
    empty namex=${empty namex }
empty对于null的引用,运算结果为true: empty name1=${empty name1 }
empty对于为空串的String引用,运算结果为true: empty name2=${empty name2 }
empty对于没有元素的数组或集合,运算结果为true: empty name3=${empty name3 }

客户浏览器显示结果

EL表达式详解_第14张图片


九、自定义EL函数

因为EL本身不具有处理字符串能力,所以可以自定义EL函数
- 定义函数(新建MyEL.java类)
- 注册:先找到jsp2-example-taglib.tld,将头部以及注册函数复制到自己创建的.tld文件中(.tld放在WEB-INF下)
- 在index.jsp中使用,使用时需要<%@ taglib uri=”http://tomcat.apache.org/jsp2-example-taglib” prefix=”MyEL” %>

1、定义函数MyEL.java

package linjie.com;


//自定义函数
//该类及其函数,需要在扩展名为.tld的xml文件中注册
//tld:tag library definition(标签库定义)
//xml文件是需要约束的,即需要配置文件头部。这个头部约束可以从一下文件中进行复制
//在Tomcat安装目录下:webapps\examples\WEB-INF\jsp2
//文件为:jsp2-example-taglib.tld

//这个.tld的xml文件,需要定义在当前web项目的WEB-INF目录下,在此目录下创建以.tld结尾的xml文件
//将jsp2-example-taglib.tld中头部复制到创建的xml文件中

//再将函数注册,还是在jsp2-example-taglib.tld底部中复制
public class MyEL {
    private static MyEL instance;
    public static MyEL getInstance() {
        if(instance==null)
        {
            instance=new MyEL();
        }
        return instance;
    }

    //字符串小写变大写
    public static String LowerToUpper(String str) {
        return str.toUpperCase();
    }
}

2、将jsp2-example-taglib.tld中头部部分以及底部的注册函数部分复制到自己创建的tld(在WEB-INF下)文件中

EL表达式详解_第15张图片

这里写图片描述

EL表达式详解_第16张图片

EL表达式详解_第17张图片

MyEL.tld




    
    A tag library exercising SimpleTag handlers.
    1.0
    MyEL
    http://tomcat.apache.org/jsp2-example-taglib

   
     
        MyLowerToUpper
        linjie.com.MyEL
        java.lang.String LowerToUpper( java.lang.String )
    

3、在index.jsp中使用,使用时需要<%@ taglib uri=”http://tomcat.apache.org/jsp2-example-taglib” prefix=”MyEL” %>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://tomcat.apache.org/jsp2-example-taglib" prefix="MyEL" %>




Insert title here


    
    ${MyEL:MyLowerToUpper("sasas") }
<% String name="xlj"; pageContext.setAttribute("name", name); %> ${MyEL:MyLowerToUpper(name) }

客户浏览器显示结果

EL表达式详解_第18张图片


十、EL总结

  • EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
  • EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
  • EL不会抛出空指针异常,只会不显示
  • EL不会抛出数组越界异常,只会不显示
  • EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)

你可能感兴趣的:(●,Java基础)