一、EL表达式
1、先来谈一下为什么需要EL表达式和JSP标签?
JSP的产生在一定程度上将Servlet中负责表现的功能抽取了出来,但JSP页面嵌入的Java代码也破坏了页面中负责表现的页面结构,特别是当运算逻辑稍微复杂一点的话,那么JSP页面中大量的Java代码增加了页面维护的难度。所以使用简单的标签来表现复杂的逻辑以及使用简单的形式表现运算的关系,就是EL表达式和JSP标签出现的原因。
2.什么是EL表达式?
一套简单的运算规则,用于给JSTL标签的属性赋值,也可以直接用来输出而脱离标签单独使用。
3.EL表达式的作用
EL(Experssion Language)是从JavaScript脚本语言得到启发的一种表达式语言,它借鉴了JavaScript多类型转换无关的特点。 在使用EL从Scope中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。
4.访问Bean属性
在JSP页面中经常要输出系统定义的对象的属性,而按照以往的写法需要自己去对象域中获取、转换再输出,使用EL表达式可以非常的简化过程。
Bean:指的是一个公共的类,按照固定的方式提供属性的get/set访问方式。针对这种特殊类型的属性访问使用EL表达式实现有两种
4.1方式一:${对象名.属性名}
${user.name}
执行的过程:从pageContext、request、session、application中依次依次查找绑定名为“user”的对象,找到后调用“getName”方法,将返回值输出。
假定session中绑定了一个对象,如下:
User obj = new User(1,"胡萝不");
session.setAttrribute("user",obj);
那么${user.name}等价于下面代码:
<%
User u = (User)session.getAttribute("user");
out.print(u.getName());
%>
这种繁琐的取值,转换,输出的过程就都由系统代劳了。而且表达式比以上繁琐代码更会处理null。如果没有为name属性赋过值,页面输出“”,不会输出null。如果取值时绑定名写错了,如${obj.name},页面也会输出“”,而不是报空指针异常。但属性名写错会报错,如${user.naaa}.
4.2方式二:${对象名["属性名"]}
表达式也支持属性名的动态读取,这时需要采用方式二${user["name"]}的形式。
假定在Servlet中有如下代码:
User obj = new User(1,"胡萝不");
session.setAttribute("user",obj);
session.setAttribute("pName","id");
在JSP中编写如下代码会输出“1”:
${sessionScope.user["id"]}
在JSP中编写如下代码也会输出“1”:
${sessionScope.user[sessionScope.pName]}
如果pName在绑定时不指定id,而是name,那么这个表达式就会输出“胡萝不”,所以这种写法可以认为是表达式中有一个变量。sessionScope.pName等价于session.getAttribute("pName").
那么对于interests这个数组属性的值可以使用如下表达式访问:
${user.interests[0]}
5.指定对象的查找范围
在书写表达式时,如果没有指定搜索范围,那么系统会依次调用pageContext、reuest、session、application的getAttribute()方法。这样不限定查找范围的代码不利于排错,所以这种取值的操作可以限定对象的查找范围。
如:$(sessionScope.user.name}
一旦指定了对象所在的范围,那么只会在范围内查找绑定对象,不会再找不到的时候再去其他区域中查找了。
sessionScope的位置还可以填写pageScope、requestScope、applicationScope。
6.使用EL表达式进行计算
使用EL表达式可以单独进行运算得出结果并直接输出,如下代码所示,EL进行算术运算,逻辑运算,关系运算,及empty运算。空运算主要判断字符串,集合是否为空,是空或为null及找不到值时都会输出true。
例如:<%request.getSession().setAttribute("sampleValue",new Integer(10));%>
${sessionScope.sampleValue} //显示10
${sessionnScope.sampleValue+12} //显示22
${(sessionScope.sampleValue +12)/3} //显示7.3
${(sessionScope.sampleValue +12)/3==4} //显示false
${(sessionScope.sampleValue + 12)/3>=5} //显示true
<input type="text" name="sample" value="${sessionScope.sampleValue +10}">//显示值为20的Text控件
${empty null} //显示true
7.使用EL表达式获取请求参数值
以下两种写法分别等价:
${request.username} 与 request.getParameter("username");
${paramValues.city} 与request.getParameterValues("city");