学习记录23
一、EL表达式
1、命令格式:
${作用域对象别名.共享数据}
2、命令作用:
- 一种特殊命令格式【表达式命令格式】
- 在JSP文件上使用
- 负责在JSP文件上从【作用域对象】读取指定的【共享数据】并输出到【响应体】
3、举例
(共享数据已经由Servlet传输到作用域对象中)
- 传统方式
<%
Integer sid = (Integer) application.getAttribute("sid");
String sname = (String) session.getAttribute("sname");
String home = (String)request.getAttribute("home");
%>
Student's ID: <%=sid%><br/>
Student's name: <%=sname%><br/>
Student's address: <%=home%>
- EL表达式
Student's ID: ${applicationScope.sid}<br/>
Student's name: ${sessionScope.sname}<br/>
Student's address: ${requestScope.home}
二、EL表达式所用作用域对象的别名
1、JSP文件可以使用的作用域对象
- ServletContext application: 全局作用域对象
- HttpSession session: 会话作用域对象
- HttpServletRequest request: 请求作用域对象
- PageContext pageContext: 当前页作用域对象,这是JSP文件独有的作用域对象
Servlet中不存在
在当前页作用域对象存放的共享数据仅能在当前JSP文件中使用,不能共享给其他Servlet或则其他JSP文件
真实开发过程,主要用于JSTL标签与JSP文件之间数据共享(实际开发不存在)
(数据)
JSTL------->pageContext---->JSP
<%
pageContext.setAttribute("Sex", "Male");
%>
Sex: ${pageScope.Sex} <!--pageScope后面的键名需要开发人员自己写出来,较麻烦-->
2、EL表达式提供作用域对象别名
**
JSP | EL表达式 |
---|---|
application | ${applicationScope.共享数据名} |
session | ${sessionScope.共享数据名} |
request | ${requestScope.共享数据名} |
pageContext | ${pageScope.共享数据名} |
三、EL表达式将引用对象属性写入到响应体
1、命令格式
${作用域对象别名.共享数据名.属性名}
2、命令作用
- 从作用域对象读取指定共享数据关联的引用对象的属性值
- 并自动将属性的结果写入到响应体
3、属性名
- 一定要去引用类型属性名完全一致(大小写)
4、EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出
四、EL表达式简化版
1、命令格式:
${共享数据名}
2、命令作用:
EL表达式允许开发人员开发时省略作用域对象别名
3、工作原理:
EL表达式简化版由于没有指定作用域对象,所以在执行时采用【猜】算法
- 首先到【pageContext】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【pageContext】没有定位成功,到【request】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【request】没有定位成功,到【session】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【session】没有定位成功,到【application】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【application】没有定位成功,返回null
- 优先级顺序:pageContext—>request—>session—>application
4、存在隐患:容易降低执行速度、容易数据定位错误
5、应用场景:简化从pageContext读取共享数据的难度,因为pageContext优先级最高
6、EL表达式简化版尽管存在很多隐患,但是在实际开发过程中,开发人员为了节省时间,一般都使用简化版,拒绝使用标准版
五、EL支持的运算表达式
1、传统方法:在JSP文件中,读取共享数据进行运算之后,将结果写入到响应体<%=%>
2、运算表达式
- 数学运算:+ - * /
- 关系运算:>(gt) >=(ge) ==(eq) <(lt) <=(le) !=(!=)
- 逻辑运算:&& || !
六、EL表达式提供内置对象
对象一:param
1、命令格式:
${param.请求参数名}
2、命令作用:
通过请求对象读取当前请求包中请求参数内容,并将请求参数内容写入到响应体
3、代替命令:index.jsp
发送请求:Http://localhost:8080/myWeb/index.jsp?userName=mike&password=123
<%
String userName = request.getParameter("userName");
String password = request.getParameter("password");
%>
<%=userName%>
<%=password%>
对象二:paramValues
1、命令格式:
${paramValues.请求参数名[下标]}
2、命令作用:
如果浏览器发送的请求参数是【一个请求参数关联多个值】
此时可以通过paramVaues读取请求参数下【指定位置】的值,并写入到响应体
3、代替命令:http://localhost:8080/myWeb/index_2.jsp?pageNo=1&pageNo=2&pageNo=3
此时,pageNO请求参数再请求包以数组形式存在:pageNo:[1, 2, 3]
<%
String array[]= request.getParameterValues("pageNo");
%>
第一个值:<%=array[0]%>
第二个值:<%=array[1]%>
七、EL表达式常见异常:
- javax.el.PropertyNotFoundException:在对象中没有找到指定属性
- 原因分析:
EL表达式在读取对象中属性时,通过【反射机制】调用当前属性对应的get方法得到属性的值
如果当前属性没有声明对应get方法,此时EL表达式认为当前类文件没有这个属性
八、EL的禁用
1、在当前JSP文件中禁用
<%@ page isELIgnored="true" %>
表示是否禁用EL语言:TRUE表示禁止;FALSE表示不禁止
2、在整个项目中禁用
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>