EL表达式浅析以及使用场景
1.EL表达式简介:
>>>EL(Expression Language)表达式体现了程序员“懒惰”的优点,让程序员能够更加简单的去编写JSP
还记得在刚开始学JSP的时候,显示层中的所有动态内容都是直接写在一个页面当中和静态内容掺杂在一起的,个人认为在学习的过程中这样的做法无可厚非,但是试想一下在实际开发当中,这样做会让代码显得十分杂乱,在后期的维护上势必造成影响,由此可知这样的做法是可行,但是不可取的。(这是一个可不可以做和应不应该做的问题)那什么样的方法即可行,又可取呢? 为了解决这个问题,让页面中的静态内容和动态内容分离,就引出了EL表达式。EL表达式的出现代表了在页面的显示输出上的变革。
>>>参与EL表达式开发的组即为:JSP标准标签库专家组、JSP2.0专家组
既然连JSP标准标签库专家组都参与了EL表达式的开发,如果说标准标签和自定义标签不能使用EL有点说不过去了吧? 其实在Servlet 2.3/JSP1.2时默认就是不支持EL表达式的,但是在Servlet2.4/JSP2.0的时候EL表达式就已经标准化支持了。所以EL表达式适用于两个场景:1.静态文本;2.标准标签和自定义标签
>>> EL表达式的的语法
${EL Expression} , 以“${”作为开头,以“}”结尾,中间写入表达式。和<%= Expression %>这样的JSP表达式一样,不论多长多复杂,只有一句且不带分号。
(图1-1)
<html> <head> <title>表达式示例</title> </head> <% pageContext.setAttribute("color","#CCCCCC"); %> <body bgcolor = '${pageScope.color}'> 作为背景色属性值传递的EL表达式 </body> </html>
2.“[ ]”和“.”操作符
>>> 点运算符(".")和方括号("[ ]")用来访问变量的值
这一点十分简单也好理解,例如访问JavaBean的一个实体Bean —— User 的属性 name 可以用这两种办法来书写。
${user.name} ${user["name"]}
(图2-1)
(图2-2)
(图2-3)
3.隐式对象
>>>EL表达式在使用的时候注意分清两点,一个是如何从作用域中取值,一个是如何获取参数。
${xxxx}
先说四大作用域 —— pageContext , request , session , application,如果在${xxx}这样的表达式中没有明确表示从哪一个作用域范围内取值,则默认的取值是从小到大的。例如在会话作用域中保存一个值,然后EL表达式取值;
session.setAttribute("name","Jack"); //将 Jack 保存到会话中 ${seesionScope.age} /* 指定了从哪一个作用域中取值。如果作用域中没有这个只值,不会报错,但是页面中也不会显示。*/ ${name} /*如果没有比明确表示从哪个作用域中取值,将会按照pageContext --> request --> session --> application这样的顺序访问*/ //各个作用域的取值,以demo为例 ${pageScope.demo} ${requestScope.demo} ${sessionScope.demo} ${applicationScope.demo} /*如果在不同的作用域里,出现了相同名称,且取值时没有指定作用域,将会按照上面说的访问顺序,输出第一个被访问到的*/ request.setAttribute("name","Jack"); session.setAttribute("name","Rose"); //两个不同作用域中使用同样的"name"作为key ${name} //输出Jack ${requestScope.name} //输出Jack ${sessionScope.name} //输出Rose
${param.xxx}
这种表达式代表的是从参数中取值。例如在页面a,向页面b传递了一个名为name的参数。那么在页面b中如果想要获取到这个参数。就可以使用
${param.name}就可以成功获取参数值。例如传递一个实体对象。
public class Stu { private int sno; private String sname; private int sage; private String ssex; private String sintime; public Stu() { super(); } public Stu(int sno, String sname, int sage, String ssex, String sintime) { super(); this.sno = sno; this.sname = sname; this.sage = sage; this.ssex = ssex; this.sintime = sintime; } public int getSno() { return sno; } public void setSno(int sno) { this.sno = sno; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } public String getSintime() { return sintime; } public void setSintime(String sintime) { this.sintime = sintime; } }
<%@page import="java.util.Date"%> <%@page import="java.text.SimpleDateFormat"%> <%@page import="com.entity.Stu"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- EL表达式操作实体对象 --> <% SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Stu stu=new Stu(1,"jack",23,"男",sdf.format(new Date())); request.setAttribute("reqStu", stu); Stu[] stus=new Stu[3]; stus[0]=new Stu(1,"Lucy",20,"女",sdf.format(new Date())); stus[1]=new Stu(2,"Toms",23,"男",sdf.format(new Date())); stus[2]=new Stu(3,"Kite",16,"女",sdf.format(new Date())); request.setAttribute("reqStus", stus); %> 学生姓名:${reqStu.sname},${reqStu["sname"] }<br/> 学生年龄:${reqStu.sage }<br/> 学生性别:${reqStu.ssex }<br/> 入学时间:${reqStu.sintime.substring(0,10)}<br/> <hr/> 学生1姓名:${reqStus[0].sname }<br/>