EL表达式概述

  • (1)是什么是EL表达式
    EL(Express Lanuage)表达式可以嵌入在jsp页面内部
  • (2)EL表达式有什么意义?
    是要替代jsp页面中输出脚本的编写,减少jsp脚本的编写
  • (3)EL表达式怎么写?
${EL表达式内容}
  • (4)EL表达式的作用:
    1.从域对象中查找指定的数据。
    2.内置对象使用
    3.执行运算符

域对象

  • (1)jsp默认支持四个域对象:
HttpServletContext  application;   整个项目
HttpSession session; 一次会话
HttpServletRequest requst ; 一次请求
HttpPageContext pageContext;

(2)核心方法

setAttribute(键,值);
getAttribute();
removeAttribute();

web\demo1_el.jsp

<%--四大域中存数据--%>
<%
application.setAttribute("name1", "baoqiang1");
session.setAttribute("name1", "baoqiang2");
request.setAttribute("name1", "baoqiang3");
pageContext.setAttribute("name1", "baoqiang4");
%>
<%--方式1:从四大域中取数据--%>
<%--这种方式,如果找不到对应的键,返回null--%>
<%=application.getAttribute("name1")%>
<%=session.getAttribute("name2")%>
<%=request.getAttribute("name3")%>
<%=pageContext.getAttribute("name4")%>
<%--方式2:从四大域中取数据(EL表达式)--%>
<hr/>
<%--这种方式,如果找不到对应的键,返回空串--%>
${applicationScope.name1}
${sessionScope.name2}
${requestScope.name3}
${pageScope.name4}
<hr/>
<%--方式3:从四大域中取数据(EL表达式)--%>
<%--这种方式,如果找不到对应的键,返回空串--%>
<%--这种方式,会从作用范围最小的域开始找,所以每个域的键的名字不能重复--%>
${name1}
${name2}
${name3}
${name4}
  • 如果el表达式编写正确的话,还没有执行,那么可以打开页面的el表达式功能,因为它默认是关闭的
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>

EL表达式-存储对象

  • (1)定义User类
  • (2)定义Birthday类
  • (3)导包
  • (4)Java代码创建对象,并将对象存在作用域对象中
  • (5)使用el表达式取出对象,并访问成员变量值

src\pack01_java_bean\Birthday.java

项目中经常定义javaBean类,本质是建模

public class Birthday {
private int year;
private int month;
private int day;
}

src\pack01_java_bean\User.java

public class User {
private String name;
private int age;
private String gender;
private Birthday birthday;
}

web\demo2_el_object.jsp

将类导入到当前页面使用page指令

<%@ page import="pack01_java_bean.User" %>
<%@ page import="pack01_java_bean.Birthday" %>

导入之后,页面就可以识别该类,之后才可以使用类创建对象。

<%--向域中存储JavaBean对象--%>
<%
User user = new User("baoqiang",35,"male",new Birthday(1988,12,23));
request.setAttribute("user", user);
%>
<%=((User)request.getAttribute("user")).getName()%>
<%--使用EL表达式来简化--%>
${requestScope.user.name}
${user.name}
${requestScope.user.birthday.year}
${user.birthday.year}

EL表达式-存储集合List与Map**

  • (1)List集合里面添加多个User对象
    使用索引取出对象
  • (2)Map集合里面添加多个User对象
    使用key获取对象

使用类之前先导入类

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>

web\demo3_el_list.jsp

<%--向域中存储List集合对象--%>
<%
ArrayList<User> list = new ArrayList<User>();
list.add(new User("baoqiang1",35,"male",new Birthday(1988,12,23)));
list.add(new User("baoqiang2",35,"male",new Birthday(1989,12,23)));
list.add(new User("baoqiang3",35,"male",new Birthday(1990,12,23)));

request.setAttribute("key", list);
%>
<%--使用El来获取域中的数据--%>
${requestScope.key[0].name}
<%=((ArrayList<User>)request.getAttribute("key")).get(0).getName()%>
${key[0].name}
${key[1].birthday.year}
  • List有序表,使用索引访问,本质上还是数据,所以使用[index]

web\demo4_el_map.jsp

<%

Map<String, User> map= new HashMap<String, User>();
map.put("u1", new User("baoqiang1",35,"male",new Birthday(1988,12,23)));
map.put("u2", new User("baoqiang2",35,"male",new Birthday(1999,12,23)));
map.put("u3", new User("baoqiang3",35,"male",new Birthday(1900,12,23)));

request.setAttribute("map", map);
%>
<%--使用El来获取域中的数据--%>
<%=(( Map<String, User>)request.getAttribute("map")).get("u1").getName()%>
${requestScope.map.u1.name}
${map.u1.name}
${map.u3.birthday.month}

EL表达式-运算符 **

  • (1)Java运算符
    在​​​${}​​​中可以写java运算符,对数据进行计算
    必须要求先在作用域中存数据,因为​​​${}​​作用就是取数据
  • (2)​​empty​​​关键字
    不能在​​​empty​​​的内部写if语句,判断对象或者集合对象是否为空,所以得使用​​empty​​关键字
  • empty关键字可以
    判断 对象,字符串是否为空
    判断集合中元素个数是为0

web\demo5_el_yunsuanfu.jsp

<%--EL表达式的运算符--%>
<%
int num = 0;
request.setAttribute("num", num);
%>
<%=num*10%>
${3+2}
<%--El表达式使用的变量必须放在域中--%>
${num+1}
<hr/>
${3>2}
<hr/>
<%--
empty关键字
String 类型: 空串和null都为空
Java Bean对象: null为空
集合 集合中没有数据,则为空
--%>
<%
String str = null;
User user = null;
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
request.setAttribute("list", list);
%>
${empty list}

EL表达式-获取项目访问路径**

  • (1)在Servlet中获得web应用的名称:
    ​​​request.getContextPath();​
  • (2)在jsp页面上获得web应用的名称:​​${pageContext.request.contextPath}​
  • (3)有什么意义?动态获取项目访问路径,如果项目访问路径修改了,那么不会影响页面或者Servlet内的地址修改
  • (4)pageContext - WEB开发中的pageContext
  • (5)获取JSP中域中的数据​​(pageScope,requestScope,sessionScope,applicationScope)​