1、EL表达式的引出
特点:JSP中虽然可以写脚本(Java代码),但是不美观,为方便程序员引入新的规范
作用:主要是用来替代<%=%>的原始脚本的输出的!
说明:是JSP内置的,不需要外部导入!
2、什么是EL表达式
(1)它是一种获取数据的规范,主要目的就是用来简化java代码的
(2)格式:${变量或表达式}---不用写“%”和“=”JSP脚本的形式 <% =%>
(3)EL表达式输出变量的前提:变量"必须"保存在域对象中
(4)${s}说明---本质上用的pageContext.findAttribute()方法先找到属性名(字段名)为s的对象,然后再取对象里的属性值,也
就是说${s}相当于pageContext.findAttribute("s")或PageContext.getAttribute("name")?以JSP脚本的形式--<%=name%>
练习:从当前页面使用EL表达式获取四大域对象
3、EL表达式的用法
说明:针对四大域对象(1)普通字符串
<%
String email="zhangsanqq.com";
//存储到域对象
pageContext.setAttribute("email", email);
%>
${email}<!--主要是来获取(只能在此JSP页面使用!)的-->
(2)使用普通的类中----获取类对象和类中的属性值
已知:有一个Student类,给类提供一些属性name、pasword
思考:通过EL表达式如何获取属性?
传统方法:对象.getXXX()方法
遵循:EL表达式的规范
EL表达式规范:获取普通类中的属性---去掉"get"中间的变成小写同时去掉"()"
(3)用在数组中
注意:在EL表达式中不能使用迭代(集合)或遍历(数组)----引出核心标签库
方式1:不使用核心标签库
在EL表达式中"获取数组"元素是通过角标获取
<%
//创建一个学生数组
Student[] st=new Student[3];
//给学生数组中的元素进行赋值
st[0]=new Student("a","1234");
st[1]=new Student("b","4353");
st[2]=new Student("a","3454");
pageContext.setAttribute("st", st);//对象的传递
%><br/>
${st[0].name}--${st[0].password}<br/>
${st[1].name}--${st[1].password}<br/>
${st[2].name}--${st[2].password}
(4)用在集合中--单链集合和双链集合
遍历单列--已知:getIndex(角标)---获取数据集合中的数据
<%
List<Student> list=new ArrayList<Student>();
//赋值
list.add(new Student("eric","1234"));
list.add(new Student("jane","5342"));
list.add(new Student("tony","5459"));
pageContext.setAttribute("list", list);
%>
<%-- 得到index值--%%>
${list[0].name}---${list[0].password}<br/>
${list[1].name}---${list[1].password}<br/>
${list[2].name}---${list[2].password}
注意:单列集合底层的数据结构也是数组,所有也有通过索引来获取数据!
遍历双列集合-Map集合--已知getKey("key")---String value---getNam().getPassword()
<%
Map<String,Student> map=new HashMap<String,Student>();
map.put("001", new Student("eric","1234"));
map.put("002", new Student("jane","5342"));
map.put("003", new Student("tony","5459"));
pageContext.setAttribute("map", map);
%>
<%-- 得到key值--%%>
${map["001"].name }-${map["001"].password }<br/>
${map["002"].name }-${map["002"].password }<br/>
${map["003"].name }-${map["003"].password }
说明:双列集合是通过键来找值的(或者可以理解为键就是其索引)!
注意:它的另外一种形式的书写(重要!!!)--回头补充
(5)EL表达式的容错能力比较强
把s随便换成一个我们未定义的属性。那么上面一种写法中stu就是null值,这一步不会报错,但是下一步相当于
null.getName()就会报错NullPointerException。但是EL表达式不会报错,它会把取到的null值自动转化成空字符串。
回顾:原来通过<%=%>传递域对象,第一次没有获取数据时会是null值,可以采用三元运算符(判断是否为null),进而展示数据
(6)表达式的属性导航,也就是链式属性,本质上是一个类中包含了另一个,然后链式调用(.的形式)
[]比点.强大,强大之处主要体现在对键值对或对象之外的取值,因为点.是根据属性名(或key的名字)字来的,如果没有名
字就很难取值,比如针对List只有序列下标,可以用下面来根据序号取值。
(7)EL表达式支持的运算符
1)算术运算符---加减乘除2)比较运算符---大于、小于、不等于、大于等于之类的
3)逻辑运算符---支持"双与"或"双或"或非
4)重要:判空条件
1)空值 ==null---${name==null}
2)空字符串 ==""-----${name==“”}
5)判空条件的等价形式:
${empty 获取的变量值}==等价于${name==null}&&${name==null}
特点:不管是是空字符串或null值返回的都是true
注意:结果出现"null"的形式
(8)EL表达式支持三目运算符
应用:比如我们从数据库中取得某个数据,然后根据这个数据显示不同的状态等等(后续)
4、EL 11个(隐藏)内置对象
(1)pageContext----------等价于JSP中的pageContext内置对象
JSP脚本获取上下文对象:<%=pageContext.getRequest().getcontextPath()%>--向浏览器输出
EL表达式获取上下文对象:${pageContext.request.contextPath()}
补充:EL可以输出的东西都在11个内置对象中,除了pageContext不是Map,其余都是map集合,它就是PageContext类型!
突破口:通过pageContext可以获取JSP中其它的对象(request、session等)
过程:得到request对象,进而得到请求中的Web项目的名称(上下文路径)
原因:El表达式中并没有rquest这个内置对象,不能直接使用(迂回使用)
(2)pageScope、requestScope、sessionScope、applicationScope
特点:域属性(获取数据--区分request),但是是个Map集合,如果不想域对象挨个查询变量,指定查询某个域对象的此变量
方式:${sessionScope.s}--从session域中获取s变量,有针对性!
(3)parm(parmValues)、header(headerValues)、cookie、initParm(全局配置信息--从context-parm标签中获取)
作用:获取参数、请求头、会话数据、全局配置信息--直接是上面的开头
额外:cookie的集合形式是Map<String,Cookie>
说明:前三个对应request域对象 ,最后一个对应application对象(web.xml中配置)
理解:从等价形式(替代)的角度去理解EL表达式!
注意:(1)标签中可以写脚本,反过来不行;(2)标签中可以写EL表达式,反过来不行
应用:数据传递,获取数据、跳转、获取上下文对象
1、获取域中数据() ★
举例1:获取上下文文本路径进而实现页面跳转(重定向、a标签、href标签、src标签)!
特点:动态的得获取路径
举例2:在一个Servlet中存储数据,在另一个JSP中通过EL表达式获取域中的数据
2、执行运算 ★
3、获取常见的web对象★
说明:是从域对象传递过来的对象!
4、调用java的方法★★★
前提:域对象中存储的是对象,而不是字符串等!
注意:四大域对象可以存储的数据类型!
内置对象的掌握:重点是哪些是继承的、那些是特殊的、那些是没有的;Servlet、JSP、EL中内置对象的比较!
-----------------------------分割线--------------------------------------
练习:
<body>
<%--
1)pageContext对象: ---->等价于Jsp中的pageContext内置对象
通过pageContext获取其他几个jsp的内置对象
--%>
<%=pageContext.getRequest()%> <%--获取request对象的"原型",JSP中内置了request,而EL中没有内置JSP--%>
<%--获取上下文路径 --%>
获取上下文路径:EL的pageContext内置对象
<br/>
${pageContext.request.contextPath}
<hr/>
<%--
pageScope 当前jsp页面
requestScope 在同一个请求中
sessionScope 在同一个会话中(sesison)
applicationScope 在一个网站起作用
--%>
<%--
param:参数
之前获取参数
<%=request.getParameter("name") %>
getParameterValues:获取多个参数值的情况<!--复选框-->
<%=request.getParameterValues("name")[0] %><!--集合的形式-->
--%>
${param['name'] }
<br/>
${paramValues['name'][0] } - ${paramValues['name'][1] }
<hr/>
<%--
header:请求头内置对象
<%=request.getHeader("host") %>
<%=request.getHeaders("host").nextElement() %>
--%>
${header['host'] }<br/>
${headerValues['host'][0]}
<hr/>
<%--
initParam:获取全局参数
<%=application.getInitParameter("AAA") %>
--%>
${initParam['AAA'] }
<hr/>
<%--
cookie
<%=request.getCookies() %>
--%>
${cookie['JSESSIONID'].name } - ${cookie['JSESSIONID'].value }
</body>
未完待续。。。