针对EL表达式的本质以及规范的透析

简介: EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

1.EL表达式介绍


  • EL(Expression Language ),表达式语言。是一种在JSP页面中 获取数据的简单方式。EL表达式的基本语法很简单:在JSP页面的任何静态部分均可以通过 ${experssion} 的形式获取指定表达式的值。
  • EL表达式只能处理四大域中的属性值以及常量


2. EL表达式获取数据方式


  • EL只能从四大域中获取数据。 其查找顺序是:依此按照由小到大的范围从四大域名中查找指定名称的属性值。
  • 四大域名的范围大小:application>session>request>pageContext
  • 注意:在Servlet中只有三个作用域,没有pageContext作用域。
<%
    String username = "今天天气不错";
%>
username = ${username } <br>   <%--获取不到这个username属性值--%>
<%
    String username = "今天天气不错";
    pageContext.setAttribute("username",username);
    request.setAttribute("username",username);
%>
username = ${username }<br>  <%--输出结果:username=--%>
<%
    pageContext.setAttribute("username","北京");
    request.setAttribute("username","上海");
    session.serAttribute("username","重庆");
    application.setAttribute("username","武汉");
%>
username = ${username }<br> <%---输出结果:username=北京--%>
复制代码


3.使用EL表达式提供的作用域别名来获取数据


  • JSP中为四大作用域提供了作用域别名

微信截图_20220609232023.png

<%
    pageContext.setAttribute("username","北京");
    request.setAttribute("username","上海");
    session.serAttribute("username","重庆");
    application.setAttribute("username","武汉");
%>
username = ${pageScope.username}<br> <%---输出结果:username=北京--%>
username = ${sessionScope.username}<br>  <%--输出结果:username=重庆--%>
复制代码


4.获取对象的属性值


  • 定义一个student类,在JSP文件中使用EL表达式来获取student的属性

注意:EL表达式中的这个属性并不是student类中的成员变量名,而是getName()、getAge()去掉get以及括号将Age改为小写age,这个才是EL表达式的属性值,一般情况下属性值等于student类中的成员变量名,但是boolean类型的属性值和成员变量的不相等的。boolean类型的成员变量的获取成员变量的方式是isSex(),所以对应的EL表达式的属性值是sex。

<body>
    <%
        Student student = new Student("张三",23);
        pageConntext.setAttribute("student",student);
    %>
    student = ${student}  <%--可以获取到student的信息(重写了toString()方法)--%>
    <%--EL表达式属性值要和student类中的属性相对应--%>
    name = ${student.name} <%--获取到student对象的name值--%>
    age = ${student.age} <%--获取到student对象的name值--%>
    name = ${student['name']} <%--获取到student对象的name值--%>
    age = ${student['age']} <%--获取到student对象的name值--%>
</body>
复制代码


5.几种特殊的属性值


  • 当一个类不存在的时候,要获取这个类中属性。此时不会抛出空指针异常,其仅仅是不显示而已。
name = ${student1.name}   <%--此时的输出结果是:name=  --%>
复制代码
  • 当student类中声明了一个school类的时候,要获取到school类中的属性值,此时使用多次点的方式。
school = ${student.school.sname}  <%-- 此时获取到的是student类中调用的school类中的snames属性值-->
复制代码


6. EL访问数组(Array)


  • 访问普通的数组
<%
    String[] name = new String[]{"李四","张三","王五"};
    pageContext.setAttribute("names",name);
%>
name[1] = ${names[1]}   <%--取出的数据为:张三--%>
<%--若访问的数组元素的下标超过了数组下标最大值,EL不会输出下标越界异常--%>
name[5] = ${name[5]} 
复制代码
  • 访问对象数组
<%
    Student[] students = new Student[2];
    students[0] = new Student("张三",20);
    student[1] = new Student("李四",30);
    pageContext.setAttribute("students",students);
%>
student[0].name = ${student[0].name}  <%--输出的结果为:张三--%>
student[1].age = ${student[1].age}  <%--输出的结果为:30--%>
复制代码


7. EL访问集合(List)


  • EL表达式可以通过索引访问List集合,但无法访问Set。因为Set中不存在索引。
<%
    List<Sting> names = new ArrayList<>();
    names.add("张三");
    names.add("李四");
    names.add("王五");
    pageContext.setAttribute("names",names);
%>
<%--第一个输出结果为王五,和上边一样,不会报下标越界异常--%>
name[2] = ${name[2]}
name[200] = ${name[200]}
复制代码


8. EL访问Map集合(map)


  • Map中可以使用key来获取到values值
<%
    // map集合中存储的是Object类型。可以存储任意类型
    Map<String,Object> map = new HashMap<>();
    map.put("student",new Student("张三",age));
    map.put("mobile","123456");
    map.put("age",20);
    pageContext.setAttribute("map",map);
%>
<%--这里发生了一个类型的向下转型,将Object类型转换为student类型--%>
student.name = ${mpa.student.name}
mobile = ${map.mobile}
age = ${map.age}
复制代码


9.EL表达式中的运算符


  • EL表达式支持的运算符

微信截图_20220609232152.png

  • 除了上述运算符之外,非常重要的运算符 empty,这个运算符用于判断变量值是否为空,其用法为${empty 变量},如果变量为空则返回true
  • 若变量为定义,返回值是 true
  • 若变量为String类型,且其值为空串,则返回 true
  • 若变量为引用和类型,且其值为null,则返回 true
  • 若变量为集合类型,且不包含任何元素,则返回true

微信截图_20220609232207.png

10. EL内置对象

微信截图_20220609232225.png

  • 就像JSP一样代码以及表达式中可以使用九个内置对象一样,EL表达式中,同样也存在内置对象,并且存在11个内置对象。


10.1 pageContext内置对象


  • 该pageComtext与JSP内置对象中的pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象。 注意:这些对象不是EL中的内置对象。这些对象只能pageContext获取。
  • 在EL表达式中可以通过 ${pageContext.request}获取request对象。 其底层实际调用的pageContext.getRequest()方法。同理,也可以通过类似的方式获取到其他对象。
  • 在这些获取的对象中,有一个是实际工程中最常用的: ${pageContext.request.contextPath},用于获取当前项目的发布到服务器的名称。一般用在JSP页面的路径前。
  • ${pageContext.reuquest.contextPath}代表是的当前的项目,registerServler代表的是将该JSP文件中的数据提交到的位置文件。

微信截图_20220609232334.png

  • 注意:EL表达式只能用于JSP文件。
  • 在EL表达式的11个内置对象中,除了pageContext外,其他10个内置对象,其类型均为java.util.Map类型


10.2 EL表达式中与参数相关的内置对象


10.2.1 param对象


  • ${param.属性值}:底层调用的是 request.getParameter()方法,这个方法获取到的是一个属性对应的一个值。
  • param对象用来获取请求信息中的参数信息。
  • 使用form提交表单可以将请求参数传递到任何的文件(Java、JSP都可以)
<%--提交界面--%>
<body>
    <form action=""${pageContext.request.contextPath}/show.jsp" method="get">
        姓名:<input type="text" name="name"/><br>
        年龄:<input type="text" name="age"/><br>
        <input type="submit" value="注册"/>
    </form>
</body>
复制代码
  • 在提交界面中给定请求参数的属性值

微信截图_20220609232417.png

<%--获取请求参数界面,获取请求中的指定参数值,其底层实际调用的是request.getParameter--%>
name = ${param.name}<br>
age = ${param.age}<br>
复制代码
  • 在结果界面(show.jsp)中显示获取到的请求参数值

微信截图_20220609232430.png

10.2.1 paramValues对象


  • ${paramValue.属性值}:这个属性底层调用的是 req.getParameterValues(),这个方法获取到的属性的属性值有多个,获取到的是一个结果的集合。


11. EL表达式不支持对字符串的处理


${"ab" + "c"} <%--会报错--%>
复制代码


12. EL表达式总结


  • EL不能出现在Java代码块、表达式块等JSP动态部分。
  • EL只能从pageContext、request、session、application四大域属性空间中获取数据。
  • EL表达式只能获取数据,不可以修改数据。
  • EL表达式不会抛出空指针异常,若访问一个null对象的属性,则什么也不显示。
  • EL不会抛出数组下标越界已异常,若访问一个数组中的不存在的元素,则什么也不显示。
  • EL不具备对字符串进行处理的能力,旧连简单的字符串拼接都不可以(此时需要使用JSTL中提供的标准标签中的方法来处理字符串。)



相关文章
|
数据安全/隐私保护
如何把DDD应用到实际项目中来,例子中需要包含具体的领域模型设计,这么做的理由,以及一位这个设计而引进的坑
如何把DDD应用到实际项目中来,例子中需要包含具体的领域模型设计,这么做的理由,以及一位这个设计而引进的坑
151 4
|
4月前
|
Java 关系型数据库 程序员
11 Java接口(语法、规范、微观&宏观接口)
11 Java接口(语法、规范、微观&宏观接口)
59 6
|
7月前
【突破常规:让函数规范成为注目的亮点】(上)
【突破常规:让函数规范成为注目的亮点】
|
7月前
【突破常规:让函数规范成为注目的亮点】(下)
【突破常规:让函数规范成为注目的亮点】
|
存储 Java 程序员
【C#本质论 六】类-从设计的角度去认知(封装)(上)
【C#本质论 六】类-从设计的角度去认知(封装)(上)
112 0
|
编译器 C#
【C#本质论 六】类-从设计的角度去认知(封装)(下)
【C#本质论 六】类-从设计的角度去认知(封装)(下)
91 0
|
XML 前端开发 JavaScript
针对JSP文件的本质以及规范的透析
JSP(全称Java ServerPages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言),为用户的HTTP)请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
针对JSP文件的本质以及规范的透析
|
设计模式 Java 程序员
怎样才能写出规范的好代码?
最近发现一件事情,自己写的代码和公司里工作5到10年的前辈写的代码虽然功能一样,但是他们的代码更规范,更优雅。比如有时候我会给一个需求写一个方法,但是有些人就可以好几个需求通过同一个方法实现。因此有了今天这个疑问,怎样才能写出规范的好代码?
|
Java C++
保守VS开放?看清封装对象属性 | 带你学《Java面向对象编程》之四
高楼万丈,起于平地。本节通过对比正反几个实例剖析了封装对象属性的必要性,介绍了进行封装的基本原则。
保守VS开放?看清封装对象属性   |  带你学《Java面向对象编程》之四
|
XML IDE 安全
插件推荐:如何将Java编码规范落地实际开发中
阿里近万名Java技术开发者通过不断总结与提炼,并经历了多次大规模一线实战检验及完善,出版了众所周知的《阿里巴巴Java开发手册》,但对于很多人而言,手册始终无法直接应用在日常的开发工作中,如果有相应的IDE插件进行支持,那简直完美。因此,Cloud Toolkit应运而生。
3070 0
插件推荐:如何将Java编码规范落地实际开发中