随笔-13  评论-6  文章-0  trackbacks-0

简单的表达式语言


Sun Microsystems 在 1997 年下半年推出了 Servlet API,将它定位为 CGI 开发人员使用的一种功能强大的工具,这些开发人员正在寻找比 CGI(通用网关接口)编程更高效和轻便的优秀解决方案。但是,开发人员很快就发现 Servlet API 有其自身的缺点,从代码的可维护性和可扩展性方面来看,该解决方案难以实施。在某种程度上,这种缺点促使团队开发一种允许在 HTML 中嵌入 Java 代码的解决方案 — JavaServer Pages (JSP) 因此而出现。

不久以后,开发人员意识到将表达与商务逻辑混合在一起的复杂 JSP 页不易于理解和维护。不能编写 scriplet 的页面制作人员所面临的另一个问题是由于标准标记集而带来的 JSP 限制。这些限制使得难点变成利用 JSP 实施自定义标记的机制来创建 JSP 自定义标记。

JSP 标准标记库 (JSTL) 是自定义标记库的集合,它将许多 JSP 应用程序通用的核心功能封装为简单的标记。它不再需要使用 JSP scriptlet
和表达式,而使用表达式的更高级语法。它还实现了通用目的的功能,如迭代和条件化、数据管理格式化、XML 操作、数据库访问、国际化和对本地化信息敏感的格式化标记以及 SQL 标记。JSTL 1.0 推出了 EL 的概念,但只限于 JSTL 标记。在 JSP 2.0 中,您可以使用带模板文本的 EL,甚至可以通过 javax.servlet.jsp.el 获得编程方式的访问。

在我们了解 JSTL 如何适应环境以及与 JSTL 表达式语言相关的限制以后,我们来看 JSP 2.0 的重要优点之一 — JSP 表达式语言 (EL)。我们将特别涉及到以下内容:

JSP 表达式语言定义
在无脚本的 JSP 页面中支持 EL 的机制
表达式语言语法
JSP EL 中有效的表达式
使用 EL 表达式

JSP 表达式语言定义

表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。

EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。

脚本编制元素具有三个从属形式:

  • 声明
  • Scriptlet
  • 表达式。

    让我们来看代码中的这三种从属形式:

    <%! int i = 1; %> <% -- Declaration --%>
    <% for (int i =0; i < 10; i++) { %> <% -- Scriptlets --%>
    table.getColumn( ) <% -- Expression --%>

    在将 EL 添加到 JSP 工具包以后,可以使用更简单的语法来编写以上的代码,而获得与以上 JSP 元素相同的结果。EL 表达式的另一个优势是,可以在不允许使用上述任何脚本编制元素从属形式的无脚本的 JSP 页中使用它。但是必须注意,可以不使用三种脚本编制元素从属形式中的任一种来编写 JSP 页,而对 JSP 页是否应该为无脚本形式的选择则完全基于应用程序的需求。如果您希望明确分开表达与商务逻辑,则还可以选择将页面强制为无脚本形式。通过强制成为无脚本页 面,必须通过其他元素(如 JavaBean、EL 表达式、自定义操作和标准标记库)提供 JSP 页的动态行为。

    在无脚本的 JSP 页中支持 EL 的机制

    有两种机制可以确保页面不包含任何脚本编制元素。每种机制还提供在无脚本的 JSP 页中支持 EL 的方法。

    • 使用页面指示:

      在使用页面指示时,您可以通过将 isELEnabled 指示的值相应地设为“true”或“false”,指定是否支持 EL,如下所示:

      <%@ page isScriptingEnabled="true|false" isELEnabled="true|false"%>
    • 使用部署描述符的元素:

      当使用部署描述符的元素时,您可以通过在 标记间包含布尔值“true”或“false”,指定是否支持 EL,如下所示:
      ...


      *.jsp
      true
      true


      ....

    表达式语言语法

    JSP 表达式语言允许页面制作人员使用简单语法访问组件,如:


    ${expr}

    在以上的语法中,expr 代表有效的表达式。必须注意,该表达式可以与静态文本混合,还可以与其他表达式结合成更大的表达式。

    JSP EL 中的有效表达式

    有效表达式可以包含文字、操作符、变量(对象引用)和函数调用。我们将分别了解这些有效表达式中的每一种:

    文字

    JSP 表达式语言定义可在表达式中使用的以下文字:

  • 文字文字的值

    Boolean

    true 和 false

    Integer

    与 Java 类似。可以包含任何正数或负数,例如 24、-45、567

    Floating Point

    与 Java 类似。可以包含任何正的或负的浮点数,例如 -1.8E-45、4.567

    String

    任何由单引号或双引号限定的字符串。对于单引号、双引号和反斜杠,使用反斜杠字符作为转义序列。必须注意,如果在字符串两端使用双引号,则单引号不需要转义。

    Nullnull

    让我们来看一些使用文字作为有效表达式的示例:

    ${false} <%-- evaluates to false --%>
    ${3*8)

    操作符

    JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符:

    术语定义

    算术型

    +、-(二元)、*、/、div、%、mod、-(一元)

    逻辑型

    and、&&、or、||、!、not

    关系型

    ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。

    空操作符是前缀操作,可用于确定值是否为空。

    条件型A ?B :C。根据 A 赋值的结果来赋值 B 或 C。

    让我们来看一些使用操作符作为有效表达式的示例:

    ${ (6 * 5) + 5 } <%-- evaluates to 35 --%>
    ${empty name}

    隐式对象

    JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用:

    术语定义

    pageContext

    JSP 页的上下文。它可以用于访问 JSP 隐式对象,如请求、响应、会话、输出、servletContext 等。例如,${pageContext.response} 为页面的响应对象赋值。

    此外,还提供几个隐式对象,允许对以下对象进行简易访问:

    术语定义

    param

    将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。

    paramValues

    将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。

    header

    将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。

    headerValues

    将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。

    cookie将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。
    initParam将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。

    除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面:

    术语定义

    pageScope

    将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。

    requestScope

    将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。

    sessionScope

    将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:

    <% session.put (name", "John Doe"); %>
    $sessionScope.name} <%-- evaluates to John Doe --%>
    <%= session.get("name"); %> <%-- This is an equivalent scripting expression --%>

    applicationScope

    将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象。

    必须注意,当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。

    使用 EL 表达式

    EL 表达式可用于两种情况:

    • 作为标准操作和自定义操作中的属性值

    • 在 JSP 文件的模板文本中,如 HTML 或非 JSP 元素 — 在这种情况下,模板文本中的表达式被赋值并插入到当前的输出中。但是,必须注意,如果标记的主体被声明为与标记相关,则不会对表达式赋值。
    posted on 2006-03-23 09:51 java之海 阅读(623) 评论(0)  编辑  收藏 所属分类: struts

    只有注册用户登录后才能发表评论。


    网站导航: