EL(Expression Language)是表达式语言,EL的使用可以减少JAVA代码的书写。
1、EL表达式中的常量:
<body bgcolor="#7fffd4"> 输出数字:${10}<br> 输出字符串:${'ni hao'}<br> </body>
EL表达式不必写在脚本内部。
2、从域中获取数据:
(1)建立学生类的JavaBean:
package pers.zhb.domain; public class Student { private String name; private int age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; } }
(2)向域中添加数据:
//request域存储字符串 request.setAttribute("zhai","1997"); //session域存储对象 Student student1 =new Student(); student1.setAge(12); student1.setName("李明"); student1.setSex("男"); session.setAttribute("student",student1); //application域存储一个集合 ArrayList <Student> list=new ArrayList<Student>(); Student student2=new Student(); student2.setName("赵云"); student2.setAge(13); student2.setSex("男"); list.add(student2); Student student3=new Student(); student3.setName("李艳"); student3.setAge(14); student3.setSex("女"); list.add(student3); application.setAttribute("list",list); %>
(3)从域中取出数据:
<%--域中值的获取--%> <%out.print("获取request域中的值:");%><br> ${requestScope.zhai}<br> <hr> <%out.print("获取session域中学生的所有属性:");%> ${sessionScope.student} <%out.print("获取学生的某一个属性:");%><br> ${sessionScope.student.name}<br> ${sessionScope.student.age}<br> <hr>
<%--获取application域中的集合元素--%> <%out.print("获取域中集合的所有元素:");%><br> ${applicationScope.list}<br> <%out.print("获取某一属性:");%><br> ${applicationScope.list[1].name}
3、el的全域查找:
在全域查找的时候,不会为el表达式指定域的范围,而是按照pageContext域,request域,session域,application域的顺序查找。
使用全域查找后代码更为简洁:
<%--域的全域查找--%> <%out.print("获取request域中的值:");%><br> ${zhai}<br> <hr> <%out.print("获取session域中学生的所有属性:");%> ${student} <%out.print("获取学生的某一个属性:");%><br> ${student.name}<br> ${student.age}<br> <hr>
<%--获取application域中的集合元素--%> <%out.print("获取域中集合的所有元素:");%><br> ${list}<br> <%out.print("获取某一属性:");%><br> ${list[1].name}
因为没有指定域的范围,如果在域中存储的时候,键的名字相同,会有什么情况呢?
<% //request域存储字符串 request.setAttribute("zhai","1997"); //session域存储对象 Student student1 =new Student(); student1.setAge(12); student1.setName("李明"); student1.setSex("男"); session.setAttribute("list",student1); //application域存储一个集合 ArrayList <Student> list=new ArrayList<Student>(); Student student2=new Student(); student2.setName("赵云"); student2.setAge(13); student2.setSex("男"); list.add(student2); Student student3=new Student(); student3.setName("李艳"); student3.setAge(14); student3.setSex("女"); list.add(student3); application.setAttribute("list",list); %> <%--域的全域查找--%> <%out.print("获取request域中的值:");%><br> ${zhai}<br> <hr> <%out.print("获取session域中学生的所有属性:");%> ${list} <%out.print("获取学生的某一个属性:");%><br> ${list.name}<br> ${list.age}<br> <hr> <%--获取application域中的集合元素--%> <%out.print("获取域中集合的所有元素:");%><br> ${list}<br> <%out.print("获取某一属性:");%><br> ${list[1].name}
将Session和application域中键的名字改为一样的:
从执行结果来看,会按照特定的顺序执行优先级别较高的域。
4、el表达式的好处:
(1)简化代码,使代码简洁:
如:从application域中获取以为同学的名字:
不使用EL:
ArrayList <Student> list1= ( ArrayList <Student>)application.getAttribute("list"); list1.get(1).getAge();
使用EL后:
${applicationScope.list[1].name}
使用全域查找后:
${list[1].name}
(2)不需要强制转换
传统方式的不足:
需要强转,代码多且过程复杂。