EL工具包介绍
由Java技术开发一个jar包
作用:降低JSP文件开发时Java命令开发强度
Tomcat服务器本身自带了EL工具包(Tomcat安装地址/lib/el-api.jar)
JSP文件作用
代替响应对象 将Servlet中doGet/doPost的执行结果写入到响应体
JSP文件中主要开发步骤
将作用域存放的处理结果读取出来并写入到响应体
<%
String value = (String)request.getAttribute("key");
%>
<%=value%>
第一步:从指定的作用域对象读取处理结果
第二步: 将得到数据进行类型强转
第三步: 将转换后的数据写入到响应体
EL表达式
命令格式
${作用域对象别名.共享数据名}
命令作用
执行时从指定的【作用域对象】中读取指定【共享数据】的内容并自动的写入到响应体
1)EL表达式是EL工具包提供一种特殊命令格式【表达式命令格式】
2)EL表达式在JSP文件上使用
3)负责在JSP文件上从作用域对象读取指定的共享数据并输出到响应体
EL表达式作用域对象别名
JSP文件可以使用的作用域对象
ServletContext application: 全局作用域对象
HttpSession session: 会话作用域对象
HttpServletRequest request: 请求作用域对象
PageContext pageContext: 当前页作用域对象,这是JSP文件独有的作用域对象。Servlet中不存在
在当前页作用域对象存放的共享数据仅能在当前JSP文件中使用,不能共享给其他Servlet或则其他JSP文件
真实开发过程,主要用于JSTL标签与JSP文件之间数据共享
EL表达式提供作用域对象别名
JSP EL表达式
application ${applicationScope.共享数据名}
session ${sessionScope.共享数据名}
request ${requestScope.共享数据名}
pageContext ${pageScope.共享数据名}
EL表达式将引用对象属性写入到响应体
命令格式:
${作用域对象别名.共享数据名.属性名}
命令作用:
从作用域对象读取指定共享数据关联的引用对象的属性值。并自动将属性的结果写入到响应体
属性名:
一定要去引用类型属性名完全一致(大小写)
EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出
.与 [ ] 运算符
EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}
等于
${sessionScope.user["sex"]}
. 和 [ ] 也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
不过,以下两种情况,两者会有差异:
当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ]
例如:
${user.My-Name }
上述是不正确的方式,应当改为:
${user["My-Name"] }
我们来考虑下列情况:
${sessionScope.user[data]}
此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于:
${sessionScope.user.sex};
假若data 的值为"name"时,它就等于
${sessionScope.user.name}
因此,如果要动态取值时,就可以用上述的方法来做,但. 无法做到动态取值
简化版EL表达式
命令格式
${共享数据名}
命令作用
EL表达式允许开发人员开发时省略作用域对象别名
工作原理
由于在EL简化版中没有指定作用域对象别名。所以EL表达式采用"猜测算法"
首先到【pageContext】定位共享数据,如果定位成功读取输出并结束执行
如果在【pageCotnext】没有找到共享数据,到【request】定位共享数据,如果定位成功读取输出并结束执行
如果在【request】没有找到共享数据,到【session】定位共享数据,如果定位成功读取输出并结束执行
如果在【session】没有找到共享数据,到【application】定位共享数据,如果定位成功读取输出并结束执行
如果在【application】没有找到共享数据,此时返回null
pageContext--->request--->session--->application
存在弊端
增加程序运行时间
导致定位数据错误
使用场景
简化版设计之初就是为了从当前页作用域对象读取数据并输出。所以从request,session,application读取数据并输出时应该避免使用简化版
EL表达式简化版尽管存在很多隐患,但是在实际开发过程中,开发人员为了节省时间,一般都使用简化版,拒绝使用标准版
EL表达式支持运算表达式
前提: 在JSP文件有时需要将读取共享数据进行一番运算之后,将运算结果写入到响应体
EL表达式允许开发人员将读取共享数据进行相关运算之后,再进行输出
EL表达式支持运算:
数学运算表达式
关系运算表达式
逻辑运算表达式
数学运算
关系运算:
= == < <= !=
gt ge eq lt le !=
逻辑运算: && || !
EL表达式将高级类型对象的属性输出
命令格式
${作用域对象别名.共享数据名.属性名}
命令作用
从作用域对象读取到指定的高级类型对象,并将高级类型对象中指定属性内容写入到响应体
EL表达式专有异常
异常描述
javax.el.PropertyNotFoundException:类型【xxxx】不存在【属性名】既在某个类中没有找到对应的属性
异常原因分析
EL表达式在读取对象中属性时,通过【反射机制】调用当前属性对应的get方法得到属性的值,如果当前属性没有声明对应get方法,此时EL表达式认为当前类文件没有这个属性
隐式对象
定义
在EL表达式中可以直接使用的一组工具对象,用于提供对EL表达式功能扩充
详解
EL表达式禁用
在当前JSP文件中禁用EL表达式
<%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止
在整个项目中禁用EL表达式
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
EL表达式提供内置对象
命令格式: ${param.请求参数名}
命令作用: 通过请求对象读取当前请求包中请求参数内容并将请求参数内容写入到响应体
代替命令: 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.请求参数名[下标]}
命令作用: 如果浏览器发送的请求参数是[一个请求参数关联多个值]此时可以通过paramVaues读取请求参数下指定位置的值并写入到响应体
代替命令: 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]%>