1. EL表达式是什么
EL表达式的全称是 Expression Language ,表达式语言。
作用: 代替 jsp 页面中的表达式脚本在 jsp 页面进行数据输出。要比表达式脚本更简洁。使用EL表达式可以使JSP写起来更加简单。
2. EL中的内置对象
2.1.1 域属性相关
1、pageScope:从page范围域属性空间中查找指定的key
2、requestScope:从request范围域属性空间中查找指定的key
3、sessionScope:从session范围域属性空间中查找指定的key
4、applicationScope:从application范围域属性空间中查找指定的key
例如:
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
注:
JavaWeb的四大作用域为:PageContext,ServletRequest,HttpSession,ServletContext;
PageContext域:作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。
ServletRequest域:作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。
HttpSession域:作用范围是一次会话。生命周期是在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。如果调用session提供的invalidate() ,可以立即销毁session。
注意:服务器正常关闭,再启动,Session对象会进行钝化和活化操作。同时如果服务器钝化的时间在session 默认销毁时间之内,则活化后session还是存在的。否则Session不存在。 如果JavaBean 数据在session钝化时,没有实现Serializable 则当Session活化时,会消失。
ServletContext域:作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。
作用域从小到大为:PageContext(jsp页面),ServletRequest(一次请求),HttpSession(一次会话),ServletContext(整个web应用)。
2.1.2 pageContext
该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象。
注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取。
在EL中直接用${pageContext.request}即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象。
其中最常用的:${pageContext.request.contextPath },代表web应用下的根路径。等同于<%=request.getContextPath() %>。
2.1.3 param
其底层实际调用request.getParameter()
例如:
<input type="text" name="name"/>
EL表达式:
${param.name}
2.1.4 paramValues
获取如checkbox(名字相同,但值有多个)的数据。其底层实际调用request.getParameterValues()
例如:
<input type="checkbox" name="hobby" value="sleep">睡觉
<input type="checkbox" name="hobby" value="play">玩
<input type="checkbox" name="hobby" value="eat">吃
EL表达式:
${paramValues.hobby[0]}
2.1.5 initParam
获取初始化参数,其底层调用的是ServletContext.getInitParameter()
例如:
Web.xml
<context-param> <param-name>name</param-name> <param-value>wanmait</param-value> </context-param>
EL表达式:
${initParam.name}
3. EL访问Bean中的属性
3.1.1 什么是java Bean
JavaBean是公共Java类,但是为了编辑工具识别
需要满足至少三个条件
1、有一个public默认构造器(例如无参构造器)
2、属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){}。
3、需要序列化。这个是框架,工具跨平台反映状态必须的
3.1.2 EL访问Bean属性
EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法。
Bean类:
public class Person(){ public Person(String name){ this.name=name; } private String name; public void setName(String name){ this.name=name; } public String getName(){ return name; } }
jsp页面:
<% Person person=new Person(); person.setName("张三"); request.setAttribute("person", person); %>
EL表达式:
${requestScope.person.name}
4. EL访问数组中的数据
<% String[] names={"张三","李四","王五"}; pageContext.setAttribute("names", names); %>
EL表达式:
${names[1]}
若访问的数组元素下标超出了数组下标上限,EL不会抛出越界异常,只是不显示
${names[5]}
也可以访问类的数组,以3.1.2中的Person类为例:
Person[] persons=new Person[2]; persons[0]=new Person(“张三”); persons[1]=new Person(“李四”);
EL表达式:
${persons[0].name}
5. EL获取list中的数据
<% List<String> names=new ArrayList<String>(); names.add("张三"); names.add("李四"); pageContext.setAttribute("names", names); %>
EL表达式:
因为List底层是数组,所以可以这样写:
${names[1]}
注意:EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念。
6. EL访问Map
<% Map<String,Object> map=new HashMap<String,Object>(); map.put("age", 20); map.put("name", "张三"); pageContext.setAttribute("map", map); %>
EL表达式:
${map.name}
${map.age}
7. EL中的运算符
7.1.1 常用运算符
算术运算符:+、-、*、/(div)、%(mod)(不支持++、--)
关系运算符:==(eq)、!=(ne)、>(gt)、>=(ge)、<(lt)、<=(le)
逻辑运算符:!(not)、&&(and)、||(or)
条件运算符:?:
取值运算符:[]、点号
例如:
${user==null? "对不起,您没有登陆 " : user.username}
7.1.2 empty运算符
用法为${empty 变量},结果为布尔值
String name1=null;
EL表达式:
${empty name1}
empty对于null的引用,运算结果为true。
8. EL总结
1、EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
2、EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
3、EL不会抛出空指针异常,只会不显示
4、EL不会抛出数组越界异常,只会不显示
5、EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)
0条评论
点击登录参与评论