2022-08-23 16:47

EL表达式详解

wanmatea

JavaEE

(755)

(0)

收藏

1. EL表达式是什么

EL表达式的全称是 Expression Language ,表达式语言。

作用: 代替 jsp 页面中的表达式脚本在 jsp 页面进行数据输出。要比表达式脚本更简洁。使用EL表达式可以使JSP写起来更加简单。

2. EL中的内置对象

2.1.1 域属性相关

1、pageScope:从page范围域属性空间中查找指定的key

2、requestScope:从request范围域属性空间中查找指定的key

3、sessionScope:从session范围域属性空间中查找指定的key

4、applicationScope:从application范围域属性空间中查找指定的key

例如:

${pageScope.name}

${requestScope.name}

${sessionScope.name}

${applicationScope.name}

注:

JavaWeb的四大作用域为:PageContext,ServletRequest,HttpSession,ServletContext;

PageContext域:作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。

ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。

HttpSession域:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate() ,可以立即销毁session。

注意:服务器正常关闭,再启动,Session对象会进行钝化和活化操作。同时如果服务器钝化的时间在session 默认销毁时间之内,则活化后session还是存在的。否则Session不存在。  如果JavaBean 数据在session钝化时,没有实现Serializable 则当Session活化时,会消失。

ServletContext域:作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。

作用域从小到大为:PageContext(jsp页面),ServletRequest(一次请求),HttpSession(一次会话),ServletContext(整个web应用)。

2.1.2 pageContext

该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象。

注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取。

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

其中最常用的:${pageContext.request.contextPath },代表web应用下的根路径。等同于<%=request.getContextPath() %>。

2.1.3 param

其底层实际调用request.getParameter()

例如:

<input type="text" name="name"/>

EL表达式:

${param.name}

2.1.4 paramValues

获取如checkbox(名字相同,但值有多个)的数据。其底层实际调用request.getParameterValues()

例如:

<input type="checkbox" name="hobby" value="sleep">睡觉

<input type="checkbox" name="hobby" value="play">玩

<input type="checkbox" name="hobby" value="eat">吃

EL表达式:

${paramValues.hobby[0]}

2.1.5 initParam

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

例如:

Web.xml

<context-param>
    <param-name>name</param-name>
    <param-value>wanmait</param-value>
 </context-param>

EL表达式:

${initParam.name}

3. EL访问Bean中的属性

3.1.1 什么是java Bean

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

需要满足至少三个条件

1、有一个public默认构造器(例如无参构造器)

2、属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){}。

3、需要序列化。这个是框架,工具跨平台反映状态必须的

3.1.2  EL访问Bean属性

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

Bean类:

public class Person(){
   public Person(String name){
      this.name=name;
}
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}


jsp页面:

<%
       Person person=new Person();
       person.setName("张三");
       request.setAttribute("person", person);
%>


EL表达式:

${requestScope.person.name}

4. EL访问数组中的数据

 <%
        String[] names={"张三","李四","王五"};
        pageContext.setAttribute("names", names);
 %>


EL表达式:

${names[1]}

若访问的数组元素下标超出了数组下标上限,EL不会抛出越界异常,只是不显示

${names[5]}

也可以访问类的数组,以3.1.2中的Person类为例:

Person[] persons=new Person[2];
persons[0]=new Person(“张三”);
persons[1]=new Person(“李四”);

EL表达式:

${persons[0].name}

5. EL获取list中的数据

 <%
        List<String> names=new ArrayList<String>();
        names.add("张三");
        names.add("李四");
        pageContext.setAttribute("names", names);
    %>

EL表达式:

因为List底层是数组,所以可以这样写:

${names[1]}

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

6. EL访问Map

<%
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("age", 20);
        map.put("name", "张三");
        pageContext.setAttribute("map", map);
    %>

EL表达式:

${map.name}

${map.age}

7. EL中的运算符

7.1.1 常用运算符

算术运算符:+、-、*、/(div)、%(mod)(不支持++、--)

关系运算符:==(eq)、!=(ne)、>(gt)、>=(ge)、<(lt)、<=(le)

逻辑运算符:!(not)、&&(and)、||(or)

条件运算符:?:

取值运算符:[]、点号

例如:

${user==null? "对不起,您没有登陆 " : user.username}

7.1.2 empty运算符

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

String name1=null;

EL表达式:

${empty name1}

empty对于null的引用,运算结果为true。

8. EL总结

1、EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分

2、EL只能从四大域属性空间中获取数据(pageContext、request、session、application)

3、EL不会抛出空指针异常,只会不显示

4、EL不会抛出数组越界异常,只会不显示

5、EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)

0条评论

点击登录参与评论