6.1 EL简介
EL全名为Expression Language,它原本是JSTL为方便存取数据而自定义的语言。(JSTL是JSP Standard Tag Library的缩写,翻译为JSP标准标签库)当时EL只能在JSTL标签中使用,到了JSP 2.0之后,EL已经正式成为标准规范之一。因此,只要是支持Servlet 2.4 / JSP 2.0 的Container,就都可以在JSP网页中直接使用EL。使用方法如下:
<p>Hi ! ${ username }</p>
注意
目前几乎所有的JSP服务器的最新版本都支持Servlet 2.4/JSP 2.0,如Tomcat 4.0以上版本,在选用JSP服务器时应该注意其版本说明,尽量选用最新的版本。
6.1.1 EL语法
EL语法很简单,它最大的特点就是使用方便。所有EL都是以“${”起始、以“}”结尾的,例如:
${sessionScope.user.sex}
上述EL范例的意思是:从Session的范围中,取得用户的性别。假若依照之前JSP Scriptlet的写法如下:
<% User user = (User)session.getAttribute("user"); String sex = user.getSex( ); %>
两者相比较之下,当然是EL的语法更为方便、简洁。
EL提供“.”和“[ ]”两种运算符来存取数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}
等价于
${sessionScope.user["sex"]}
使用“[]”有一个优势就是可以使用变量,而“.”无法做到动态取值。例如:
${sessionScope.user[data]}
此时,data是一个变量,假若data的值为“age”,那上述的例子等价于
${sessionScope.user.age}
6.1.2 EL变量
EL存取变量数据的方法很简单,例如:
${username}
它的意思是取出某一范围中名称为username的变量。因为并没有指定哪一个范围的username,所以它的默认值会先从Page范围找,假如找不到,再依次到Request、Session、Application范围找。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到,就回传null。流程如图6.1所示,属性范围如表6.1所示。
图6.1 EL查找变量流程图
表6.1 变量查找的属性范围表
也可以指定要从哪一个范围取出变量,如表6.2所示。
表6.2 指定取值范围查找变量
其中,pageScope、requestScope、sessionScope和applicationScope都是EL的隐含对象,由它们的名称可以很容易猜出它们所代表的意思。例如:
${sessionScope.username}
是取出Session范围的username变量。
String username = (String) session.getAttribute("username");
这种写法显然比之前JSP的写法容易、简洁许多。有关EL隐含对象将在后面的章节中详细介绍。
6.1.3 自动转变类型
EL除了提供方便存取变量的语法之外,它的另外一个方便的功能就是:自动转变类型。来看下面这个例子,把页面传来的参数count加20。
${param.count + 20}
假如窗体传来count的值为10,那么上面的结果为30。在JSP中获取用户输入,从窗体所传来的参数值,包括链接中的参数值,它们的类型一律是String,所以当接收之后,必须再将它转为其他类型,如int、float等,然后才能执行一些数学运算。而在JSP脚本中只能这样做:
<!--在JSP中到处存在着类型转化--> <% String str_count = request.getParameter("count"); int count = Integer.parseInt(str_count); count = count + 20; %>
说明
曾经有一种说法是,在Web这个String的世界中没有必要再定义有类型值对象,否则要来回转化很麻烦。有一段时间兴起了无类型的潮流,就是所有的输入输出参数的传递都用Java的Properties类来实现,而不再定义值对象。语言类型的丧失绝对不能说是一种进步,其实这正是没有自动转化的无奈之举。而EL给开发者提供了这个功能。
自动转化的规则如表6.3所示。
表6.3 EL类型自动转化表
6.1.4 EL隐含对象(内置对象)
本书第2章曾经介绍过9个JSP隐含对象,而EL本身也有自己的隐含对象,这些隐含对象给开发人员带来了极大的便利。EL隐含对象总共有11个,如表6.4所示。
表6.4 EL隐含对象表
与范围有关的EL隐含对象包含以下4个:pageScope、requestScope、sessionScope和applicationScope,它们基本上就和JSP的pageContext、request、session和application对应。不过必须注意的是,这4个隐含对象只能用来取得范围属性值,即JSP中的getAttribute(String name),却不能取得其他相关信息。例如,JSP中的request对象除可以存取属性之外,还可以取得用户的请求参数或表头信息等。但是在EL中,它就只能单纯用来取得对应范围的属性值。
例如,要在session中储存一个属性,它的名称为username,在JSP中使用
session.getAttribute("username")
但是在EL中,则是使用
${sessionScope.username}
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。一般而言,在JSP中在取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name) request.getParameterValues(String name)
在EL中则可以使用param和paramValues来取得数据。
${param.name} ${paramValues.name}
如果用户填了一个表格,表格名称为username,就可以使用${param.username}来取得用户填入的值。下面给出了一个利用EL隐含对象和EL语句的例子。源代码如实例6-1所示。
【实例6-1】EL输入示例:Param.html
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <html> 03 <head> 04 <title>CH6 - Param.html</title> 05 </head> 06 <body> 07 <h2> 08 EL 隐含对象 param、paramValues 09 </h2> <!--关于表单设置--> 10 <form method="post" action="Param.jsp"> 11 <p> 12 姓名:<!--关于用户名输入框--> 13 <input type="text" name="username" size="15" /> 14 </p> 15 <p> 16 密码:<!--关于密码输入框--> 17 <input type="password" name="password" size="15" /> 18 </p> 19 <p> 20 性别:<!--关于性别单选框--> 21 <input type="radio" name="sex" value="Male" checked /> 22 男 23 <input type="radio" name="sex" value="Female" /> 24 女 25 </p> 26 <p> 27 年龄:<!--关于年龄选择框--> 28 <select name="old"> 29 <option value="10"> 30 10 - 20 31 </option> 32 <option value="20" selected> 33 20 - 30 34 </option> 35 <option value="30"> 36 30 - 40 37 </option> 38 <option value="40"> 39 40 - 50 40 </option> 41 </select> 42 </p> 43 <p> 44 兴趣:<!--关于兴趣多选框--> 45 <input type="checkbox" name="habit" value="Reading" /> 46 看书 47 <input type="checkbox" name="habit" value="Game" /> 48 玩游戏 49 <input type="checkbox" name="habit" value="Travel" /> 50 旅游 51 <input type="checkbox" name="habit" value="Music" /> 52 听音乐 53 <input type="checkbox" name="habit" value="Tv" /> 54 看电视 55 </p> 56 <p> <!--关于传送和清除按钮--> 57 <input type="submit" value="传送" /> 58 <input type="reset" value="清除" /> 59 </p> 60 </form> 61 </body> 62 </html>
【运行程序】浏览该页面,结果如图6.2所示。
图6.2 EL输入示例界面图
【代码剖析】在上述代码中,在第13行创建了一个关于姓名的文本输入框,在第17行创建了一个关于密码的文本输入框,在第21行和第23行创建了一组关于性别的单选按钮,在第28行创建了一个关于年龄的下拉选择框,在第45行到第53行创建了一组关于兴趣的多选框,最后在第57行和第58行创建了关于传送和清除的按钮。
关于EL输出示例源代码如实例6-2所示。
【实例6-2】EL输出示例:Param.jsp
01 <html> 02 <head> 03 <title>Param.jsp</title> 04 </head> 05 <body> 06 <h2> 07 EL 隐含对象 param、paramValues 08 </h2> 09 姓名: ${param.username} <!--显示用户名--> 10 </br> 11 密码: ${param.password} <!--显示密码--> 12 </br> 13 性别: ${param.sex} <!--显示性别--> 14 </br> 15 年龄: ${param.old} <!--显示年龄--> 16 </br> <!--显示兴趣--> 17 兴趣: ${paramValues.habit[0]} ${paramValues.habit[1]} 18 </body> 19 </html>
【运行程序】浏览该页面,结果如图6.3所示。
图6.3 EL输出示例界面图
【代码剖析】在上述代码中,为了获取传送过来的参数值,通过EL表达式${param.参数名}获取相关参数名的值。
6.1.5 EL保留字
EL的保留字如表6.5所示。保留字的意思是指变量在命名时,应该避开上述的名字,以免程序编译时发生错误。
注意
避免保留字不仅局限于页面中,同样应该在JavaBean中避免,即使没有在EL表达式中涉及这个Bean,也会给以后的开发留下隐患。
表6.5 EL保留字