一、传统JSP文件开发步骤
- 第一步:从指定的作用域对象读取处理结果
- 第二步:将得到数据进行类型强转
- 第三步:将转换后的结果写入到响应体
<%
String value = (String)request.getAttribute("key");
%>
<%=value%>
二、EL表达式介绍
EL 的全称为 Expression Language ,即表达式语言。在JSP页面使用 EL 表达式可以获取并显示页面数据,简化对于变量和对象的访问。
- 命令格式
${作用域对象别名.共享数据名}
- 命令作用
- EL 表达式是EL工具包提供的一种特殊的命令格式 ------- 表达式命令格式
- EL 表达式在JSP文件上使用
- EL 表达式负责在JSP文件从作用域对象读取指定的共享数据并输出到响应体
三、EL表达式作用域对象别名
JSTL名称 | EL名称 | 中文名称 | EL表达式 |
---|---|---|---|
pageContext | pageScope | 当前页作用域对象 | ${ pageScope.共享数据名 } |
request | requestScope | 请求作用域对象 | ${ requestScope.共享数据名 } |
session | sessionScope | 会话作用域对象 | ${ sessionScope.共享数据名 } |
application | applicationScope | 全局作用域对象 | ${ applicaionScope.共享数据名 } |
在当前页作用域对象存放的共享数据仅能在当前JSP文件中使用,不能共享给其他Servlet或则其他JSP文件。在真实开发过程中,主要用于JSTL标签与JSP文件之间数据共享数据。
JSTL------->pageContext---->JSP
四、EL表达式输出对象属性
- 命令格式:
${作用域对象别名.共享对象名.属性名}
-
命令作用:从作用域对象读取指定共享数据关联的引用对象的属性值。并自动将属性的结果写入到响应体
-
属性名:要跟引用类型的属性名大小写等方面完全一致
-
EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出
Student stu = new Student("Mike", 18);
request.setAttribute("key", stu);
request.getRequestDispatcher("/index.jsp").forward(request, response);
<%requestScope.stu.name%>
五、简化版EL表达式
- 命令格式
${共享数据名}
-
命令作用 :EL表达式允许开发人员在开发时省略作用域对象别名
-
工作原理 :
EL表达式简化版由于没有指定作用域对象,所以在执行时采用猜测的算法
首先到 pageContext 定位共享数据,如果存在直接读取输出并结束执行
如果在 pageContext 没有定位成功,到 request 定位共享数据,如果存在直接读取输出并结束执行
如果在 request 没有定位成功,到 session 定位共享数据,如果存在直接读取输出并结束执行
如果在 session 没有定位成功,到 application 定位共享数据,如果存在直接读取输出并结束执行
如果在 application 没有定位成功,返回null
流程 : pageContext—>request—>session—>application
也就是说在session和application添加同一个共享数据,如果用简化版的EL表达式,输出的session中的共享数据
- 缺点:增加程序运行时间和导致数据定位错误
- 设计目的:简化版设计之初就是为了从当前页作用域对象读取数据并输出,所以从request,session,application读取数据并输出时应该避免使用简化版
- 注: EL表达式简化版尽管存在很多隐患,但是在实际开发过程中,开发人员为了节省时间,一般都使用简化版,不使用标准版
六、EL表达式支持运算
- 背景:在JSP文件有时需要将读取共享数据进行一番运算之后,将运算结果写入到响应体
- 运算表达式:
(1) 数学运算: + 、-、 * 、/
(2) 关系运算: >、>= 、== 、< 、<= 、!=
gt 、ge 、eq 、lt、 le、 !=
(3) 逻辑运算:&&、|| 、 !
- 使用:
我们已经添加两个数num1和num2作为共享数据,要求将num1和num2进行加和运算并写到响应体中
直接写即可:
${num1 + num2}
七、EL表达式中隐式对象
对象 | 介绍 |
---|---|
param | 将请求参数名称映射到单个字符串参数值,${param . name} 相当于 request.getParameter (name) |
paramValues | 将请求参数名称映射到一个数值数组,表达式 ${paramvalues. name} 相当于 request.getParamterValues(name) |
cookie | 将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值 |
header | 将请求头名称映射到单个字符串头值,${header. name} 相当于 request.getHeader(name) |
我们重点来看一下 param 这个参数
- 命令格式:
${param.请求参数名}
- 命令作用:通过请求对象读取当前请求包中请求参数内容,并将请求参数内容写入到响应体
- 使用
请求:http://localhost:8080/myWeb/index.jsp?userName=mike&password=123
用户名:${param.username} <br/>
密码:${param.password}
如果浏览器发送的请求是一个请求参数关联多个值,即这种:
http://localhost:8080/myWeb/index.jsp?deptNo=10&deptNo=20&deptNo=30
可以用 [] 的方式输出对应位置的值
第一个部门编号:${paramValues.deptNo[0]}<br/>
第二个部门编号:${paramValues.deptNo[1]}<br/>
第三个部门编号:${paramValues.deptNo[2]}<br/>
八、EL表达式常见异常
- 异常:javax.el.PropertyNotFoundException : 在对象中没有找到指定属性
- 异常分析:EL表达式在读取对象中属性时,通过反射机制调用当前属性对应的get方法得到属性的值,如果当前属性没有声明对应get方法,此时EL表达式认为当前类文件没有这个属性