EL表达式

一、EL 与 JSTL 作用:

? 简化JSP文件上java代码开发步骤

二、JSP的主要开发任务:

? 将域对象中数据读取并写入到响应体

三、在JSP文件上使用java命令,将域对象中数据读取并写入到响应体开发步骤

<%
	String value = (String)request.getAttribute("key");
	out.write(value);
%>
<%=value%>

1、从域对象读取数据

2、对得到数据进行类型转换

3、将最终结果写入到响应体

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"  language="java" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!-- 制造测试数据 -->
    <%
        request.setAttribute("key","abc");
    %>
    <%--java命令读取request数据并写入到响应体中--%>
    <%
        String value = (String)request.getAttribute("key");
        //out.write(value);
    %>
    Java 命令写入的结果:<%=value%><br/>

    EL 表达式写入的结果:${requestScope.key}
</body>
</html>

四、EL工具包

? 1、是一个由java开发的工具包

? 2、专门用于从域对象中数据读取并写入到响应体开发任务

? 3、语法格式:路径格式、类似于jQuery中选择器和过滤器语法

? 4、EL工具包自动存在Tomcat的lib中(el-api.jar)

? 开发时,可以直接使用,不需要额外导包

五、EL的标准格式:

? &{域对象别名.关键字} : 到指定域对象读取对应关键字的内容,并自动将内容写入到响应体中。

六、JSP文件中域对象:

? 1.application:全局作用域对象

? 2.session: 会话作用域对象

? 3.request: 请求作用域对象

? 4.pageContext:当前页作用域对象 (作用:1、用于初始化其他域 2、获取其它八大隐式对象,可以认为是一个入口对象。

? 3、获取其所有域中的数据)

七、EL表达式域对象别名

?

JSP EL
application applicationScope
session sessionScope
request requestScope
pageContext pageScope
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"  language="java" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!-- 制造测试数据 -->
    <%
        application.setAttribute("sid",10);
        session.setAttribute("sname","mike");
        request.setAttribute("sex","man");
        pageContext.setAttribute("home","北京");
    %>
    学员编号:${applicationScope.sid}<br/>

    学员姓名:${sessionScope.sname}<br/>

    学员性别:${requestScope.sex}<br/>

    学员住址:${pageScope.home}
</body>
</html>

八、EL表达式将高级对象属性写入到响应体中

? ${域对象别名.关键字.属性名}

? EL表达式使用反射机制,通过调用当前属性对应的get方法读取属性内容

九、EL表达式简化版:

? ${关键字}:可以省略域对象

[工作原理]:

? 首先到[pageContext]定位关键字,如果有读取输出并结束执行

? 如果[pageContext]没有找到关键字,到[request]定位关键字,如果有读取输出并结束执行

? 如果[request]没有找到关键字,到[session]定位关键字,如果有读取输出并结束执行

? 如果[session]没有找到关键字,到[application]定位关键字,如果有读取输出并结束执行

? 如果[application]没有找到关键字,返回null

[弊端]:

? 1、增加运行时间

? 比如数据存放application,使用${key}

? 执行轨迹:pageContext---request----session----application

? 2、定位错误

[使用场景]:专门为pageContext读取数据并写入响应体做准备

? ${key}

十、EL表达式支持的运算

? 1、数学运算

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--制造测试数据--%>
<%
  pageContext.setAttribute("key1","100");
  pageContext.setAttribute("key2","200");
%>
<%--java--%>
<%
  String num1 = (String)pageContext.getAttribute("key1");
  String num2 = (String)pageContext.getAttribute("key2");
  int sum = Integer.valueOf(num1) + Integer.valueOf(num2);
%>
Java 命令的运算结果:<%=sum%><br/>

EL 表达式运算结果:${key1+key2}

? 2、关系运算 > >= < <= == !=

? 别名: gt ge lt le eq !=

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--制造测试数据--%>
<%
    request.setAttribute("age",23);
%>
<%--java--%>
<%
    Integer age = (Integer) request.getAttribute("age");
    if(age>=18)
        out.write("欢迎光临");
    else
        out.write("谢绝入内");
%><br>

EL 表达式运算结果:${age ge 18?"欢迎光临":"谢绝入内"}

? 3、逻辑运算 && || !

十一、EL表达式中其他的内置对象

1、param:

? [使用]:${param.请求参数名}

? [作用]:读取请求协议包参数内容

? [代替]:String value = request.getParameter("请求参数名");

? out.write(value);

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
    访问网址时,后面直接带有参数
    http://localhost:8080/EL_01_war/test_05.jsp?uname=smith&password=123
--%>

登录名:${param.uname}<br>
密码:${param.password}

EL表达式

2、paramValues:

? [作用]:读取请求协议包中关联多个值的请求参数

? 将参数内容保存到数组

? [使用]:${paramValues.请求参数名}

? [代替]:String array[] = request.getParameterValues("key");

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
    访问网址时,后面直接带有参数
    http://localhost:8080/EL_01_war/test_06.jsp?empNo=10&empNo=20
--%>

第一个职员的编号:${paramValues.empNo[0]}<br>
第二个职员的编号:${paramValues.empNo[1]}

3、initParam

? [代替]: String value = application.getInitParamter("driver");

? out.write(value);

? [使用]: ${initParam.共享数据名}

    <!-- web.xml 中的共享数据内容 -->
	<context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--在jsp中利用EL表达式进行读取--%>
来自于 web.xml 的共享数据:${initParam.driver}

十二、相对路径与绝对路径

? 1、二者的区别

? 1)相对路径:以当前文件位置为起点,定位其他的资源文件

? 2)绝对路径:以网站的根目录为起点,定位其他的资源文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>相对路径定位</h1>
    <a href="test_01.jsp">test_01.jsp</a><br>
    <a href="../index.jsp">index.jsp</a><br>

    <h1>绝对路径定位</h1>
    <a href="/EL_01_war/test/test_01.jsp">test_01.jsp</a><br>
    <a href="/EL_01_war/index.jsp">index.jsp</a>
</body>
</html>

2、如何禁止相对路径,如何简化绝对路径写法

	<base href="/根目录/">

3、如何动态获得网站运行时的根目录

<%
	String root = request.getContextPath();  //   /EL_01_war
%>
<base href = "<%=root%>"/>

十三、EL表达式缺陷

1、只能读取域对象数据,不能向域对象中写入数据和更改数据

2、不支持控制语句,例如:if 判断 ,while 循环

如果单独使用 EL表达式 ,无法确保 JSP文件 中所有的 Java命令 都被替换掉

EL表达式

上一篇:UI-elemwent 前端框架元素定位之下拉框


下一篇:Rooted Subtrees 题解(LCA+思维)