大家好!我是你们的老朋友Java学术趴。今天给大家分享一种简化JSP文件开发的技术,可以省略掉Java代码块以及Java表达式。更加快速便捷的帮助我们编写代码。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作用域。
<%Stringusername="今天天气不错";%>username=${username}<br><%--获取不到这个username属性值--%><%Stringusername="今天天气不错";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中为四大作用域提供了作用域别名
<%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><%Studentstudent=newStudent("张三",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=newString[]{"李四","张三","王五"};pageContext.setAttribute("names",name);%>name[1]=${names[1]}<%--取出的数据为:张三--%><%--若访问的数组元素的下标超过了数组下标最大值,EL不会输出下标越界异常--%>name[5]=${name[5]}
访问对象数组
<%Student[]students=newStudent[2];students[0]=newStudent("张三",20);student[1]=newStudent("李四",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=newArrayList<>();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=newHashMap<>();map.put("student",newStudent("张三",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表达式支持的运算符
除了上述运算符之外,非常重要的运算符 empty,这个运算符用于判断变量值是否为空,其用法为${empty 变量},如果变量为空则返回true
若变量为定义,返回值是 true
若变量为String类型,且其值为空串,则返回 true
若变量为引用和类型,且其值为null,则返回 true
若变量为集合类型,且不包含任何元素,则返回true
10. EL内置对象
就像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文件中的数据提交到的位置文件。
注意:EL表达式只能用于JSP文件。
在EL表达式的11个内置对象中,除了pageContext外,其他10个内置对象,其类型均为java.util.Map类型
10.2 EL表达式中与参数相关的内置对象
10.2.1 param对象
${param.属性值}:底层调用的是 request.getParameter()方法,这个方法获取到的是一个属性对应的一个值。
param对象用来获取请求信息中的参数信息。
使用form提交表单可以将请求参数传递到任何的文件(Java、JSP都可以)
<%--提交界面--%><body><formaction=""${pageContext.request.contextPath}/show.jsp"method="get">姓名:<inputtype="text"name="name"/><br>年龄:<inputtype="text"name="age"/><br><inputtype="submit"value="注册"/></form></body>
在提交界面中给定请求参数的属性值
<%pageContext.setAttribute("username","北京");request.setAttribute("username","上海");session.serAttribute("username","重庆");application.setAttribute("username","武汉");%>username=${pageScope.username}<br><%---输出结果:username=北京--%>username=${sessionScope.username}<br><%--输出结果:username=重庆--%>0
在结果界面(show.jsp)中显示获取到的请求参数值
10.2.1 paramValues对象
${paramValue.属性值}:这个属性底层调用的是 req.getParameterValues(),这个方法获取到的属性的属性值有多个,获取到的是一个结果的集合。
11. EL表达式不支持对字符串的处理
<%pageContext.setAttribute("username","北京");request.setAttribute("username","上海");session.serAttribute("username","重庆");application.setAttribute("username","武汉");%>username=${pageScope.username}<br><%---输出结果:username=北京--%>username=${sessionScope.username}<br><%--输出结果:username=重庆--%>1
12. EL表达式总结
EL不能出现在Java代码块、表达式块等JSP动态部分。
EL只能从pageContext、request、session、application四大域属性空间中获取数据。
EL表达式只能获取数据,不可以修改数据。
EL表达式不会抛出空指针异常,若访问一个null对象的属性,则什么也不显示。
EL不会抛出数组下标越界已异常,若访问一个数组中的不存在的元素,则什么也不显示。
EL不具备对字符串进行处理的能力,旧连简单的字符串拼接都不可以(此时需要使用JSTL中提供的标准标签中的方法来处理字符串。)
文章来源:公众号「Java学术趴」