JavaWeb从入门到精通(视频实战版)
上QQ阅读APP看书,第一时间看更新

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保留字