EL 表达式

  EL 表达式,全名为 Expression Language

  EL 表达式主要作用:

  1. 获取数据。EL 表达式主要用于替换 JSP 页面中的脚本表达式,以便从各种类型的 web 域中检索 Java 对象、获取数据。例如:获取域中的对象、访问对象属性、访问 list / map、访问数组。
  2. 执行运算。利用 EL 表达式可以在 JSP 页面中执行一些基本的关系运算、逻辑运算和算术运算,以便在 JSP 页面中完成一些简单的逻辑运算。例如:${user==null}
  3. 获取 web 开发常用对象。EL 表达式定义了一些隐式对象,利用这些隐式对象,web 开发人员可以轻松的获取对 web 常用对象的引用,从而获得这些对象中的数据。
  4. 调用 Java 方法。EL 表达式允许用户开发自定义的 EL 函数,以便在 JSP 页面中通过 EL 表达式调用 Java 类的方法。
  1. EL 表达式一般常用的就是第一种和第二种使用。
  2. 在 JSP 中可以用<%= %>符号,来是表达式显示在 JSP 页面中,也可以使用 <% out.println();%> 的方式将数据显示在网页中,还可以使用 JSP 动作元素的方式。
    而之所以要使用 EL 表达式就是因为 EL 表达式是实现将数据显示在网页中的方式中最简单的方法

  几种获取数据到网页上的方法的使用对比,可以看到 EL 表达式非常简单

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false" import="D20210220.PersonModel"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	jsp 符号用法:
	<% request.setAttribute("str", "hello");
	out.println(request.getAttribute("str").toString()); %>
	<br>
	jsp 表达式用法:
	<%= request.getAttribute("str") %>
	<br>
	jsp 动作元素用法:
	<jsp:useBean id="pm1" class="D20210220.PersonModel" scope="request"></jsp:useBean>
	<jsp:setProperty name="pm1" property="name" value="youka" />
	<jsp:getProperty name="pm1" property="name" />
	<br>
	EL 表达式用法:
	${
    
    str}
	<br>	
</body>
</html>

EL 表达式的使用

  由于一些浏览器会默认忽视 EL 表达式,所以如果想在 JSP 文件中 使用 EL 表达式,那么最好在 page 指令处加上 isELIgnored="false" 表示不忽略 EL 表达式。
   使用 EL 表达式获取数据的语法:${ 内容 },注意 EL 表达式中的 $ 和 jQuery 中的 $ 没有关系,只是恰巧相同而已。

获取数据

获取数据的语法格式

  1. 获取普通数据

<br> EL 表达式用法:
<br> 1. 获取字符串数据
<%request.setAttribute("strData", "柚咖"); %>
${
    
    strData}

  2. 获取对象数据

<br> 2. 获取java对象数据
<% PersonModel pm = new PersonModel();
pm.setName("柚咖");
pm.setAge(22);
request.setAttribute("p", pm);
%>
<br> 2.1 获取对象的某个属性值:
${
    
    p.name}
<br> 2.2 获取对象的toString:
${
    
    p}

  3. 获取 List 数据

<br> 3. 获取List指定位置的数据:
<% PersonModel p1 = new PersonModel();
p1.setName("柚咖1");
p1.setAge(22);
PersonModel p2 = new PersonModel();
p2.setName("柚咖2");
p2.setAge(22);
List<PersonModel> list = new ArrayList<PersonModel>();
list.add(p1);
list.add(p2);
request.setAttribute("list", list);
%>
${
    
    list[1].name}

  4. 获取 Map 数据
  获取 Map 数据的标准用法:${map["key"]},简化用法:${map.key}
PS:如果使用简化用法,key 要求必须符合 Java 标识符的规则,即不能数字开头,不能和关键字相同,可以使用字母、数字、$、_。

4. 获取Map指定位置的数据:<br>
<% Map<String,String> map = new HashMap<String,String>();
map.put("a","aaa");
map.put("1","111");
request.setAttribute("map", map);
%>
${
    
    map.a}<br>
${
    
    map["1"]}

  因为 1 这个 key 不符合标识符规则,所以只能使用标准用法。不符合标识符规则的情况:特殊字符($、_之外的字符),数字开头等
在这里插入图片描述

EL 表达式查找顺序

  按照 page 域、request 域、session域、application域的顺序进行查找,如果都没有找到,输出的是空字符串,而不是 null !!!

  问题1:如果四个域中有相同的属性名,会出现什么情况?

<% pageContext.setAttribute("a1", "page域"); 
request.setAttribute("a1", "request域");
session.setAttribute("a1", "session域");
application.setAttribute("a1", "application域");
%>
${
    
    a1}

  会输出 page域,如果将pageContext.setAttribute("a1", "page域"); ,注释掉则会输出 request域。
  所以 EL 表达式在执行的时候,会先从 page 域中查找,如果没有找到,才会继续到下一个域中找。

  问题2:如果四个域中都有相同属性名,如何取出指定的域中的属性值?
  使用 域名["属性名"] 或者 域名.属性名的形式取出。但是要注意 EL 表达式中域对象和 JSP 中的内置对象并不是同一个对象。

JSP中对象 EL 表达式中对象
page 域 pageContext pageScope
request 域 request requestScope
session 域 session sessionScope
application 域 application applicationScope
${
    
    requestScope.a1}<br>${
    
    sessionScope["a1"]}

获取数据 + html → 表单数据回显

EL表达式 + HTML 实现表单数据回显
<%PersonModel temp1 = new PersonModel();
temp1.setAge(22);
temp1.setName("柚咖");
temp1.setGender("female");
request.setAttribute("user", temp1);%>
<br>
名字:
<input type="text" value="${user.name}" name="userName" />
<br>
年龄:
<input type="text" value="${user.age}" name="age" />
<br>
性别:
<input type="radio" name="gender" value="male" ${
    
    user.gender=='male'?'checked':''}/><input type="radio" name="gender" value="female" ${
    
    user.gender=='female'?'checked':''} />

在这里插入图片描述

运算符

  EL 表达式运算符除了使用符号的形式之外,还可以用字母。例如:${16%5} ${16 mod 5}都是取余运算
  EL 表达式使用 empty 运算符检查对象是否为 null 或者 空,也就是没对象和没数据

猜你喜欢

转载自blog.csdn.net/qq_40395874/article/details/114020540