JSP 表达语言(EL)

  • 表达语言(EL)

    通过JSP表达式语言(EL),可以轻松访问存储在JavaBeans组件中的应用程序数据。JSP EL允许您创建:
    • (a)算术表达式
    • (b)逻辑表达式
    在JSP EL表达式中,可以使用整数,浮点数,字符串,布尔值的内置常量true和false以及null。
  • 简单语法

    通常,当您在JSP标记中指定属性值时,只需使用字符串即可。例如-
    
    <jsp:setProperty name = "box" property = "perimeter" value = "100"/>
    
    JSP EL允许您为任何这些属性值指定一个表达式。JSP EL的简单语法如下-
    
    ${expr}
    
    这里expr指定表达式本身。JSP EL中最常见的运算符是.[]。这两个运算符使您可以访问Java Bean和内置JSP对象的各种属性。例如,上面的语法<jsp:setProperty>标记可以用类似-的表达式编写:
    
    <jsp:setProperty name = "box" property = "perimeter" value = "${2*box.width+2*box.height}"/>
    
    当JSP编译器在属性中看到${}形式时,它将生成代码以计算表达式并替换expresson的值。您还可以在模板文本内使用JSP EL表达式作为标记。例如,<jsp:text>标记只是将其内容插入JSP主体中。以下<jsp:text>声明将<h1> Hello JSP!</h1>插入JSP输出-
    
    <jsp:text>
       <h1>Hello JSP!</h1>
    </jsp:text>
    
    现在,您可以在<jsp:text>标记(或任何其他标记)的主体中包含JSP EL表达式,并使用与属性相同的${}语法。例如-
    
    <jsp:text>
       Box Perimeter is: ${2*box.width + 2*box.height}
    </jsp:text>
    
    EL表达式可以使用括号将子表达式分组。例如,${(1 + 2)* 3}等于9,${1 +(2 * 3)}等于7。要停用EL表达式的求值,我们指定page指令的isELIgnored属性,如下所示:
    
    <%@ page isELIgnored = "true|false" %>
    
    此属性的有效值为true和false。如果为true,则EL表达式出现在静态文本或标记属性中时将被忽略。如果为假,则由容器评估EL表达式。
  • EL中的基本运算符

    JSP表达式语言(EL)支持Java支持的大多数算术和逻辑运算符。下表列出了最常用的运算符-
    运算符 说明
    . 访问bean属性或Map条目
    [] 访问数组或列表元素
    () 分组子表达式以更改计算顺序
    + 加成
    - 值的减法或负数
    * 乘法
    / or div
    % or mod 模(余数)
    == or eq 测试平等
    != or ne 检验不平等
    < or lt 测试小于
    > or gt 测试大于
    <= or le 测试小于或等于
    >= or ge 测试大于或等于
    && or and 测试逻辑与
    || or or 测试逻辑或
    ! or not 一元布尔补码
    empty 测试空变量值
  • JSP EL中的函数

    JSP EL还允许您在表达式中使用函数。这些功能必须在自定义标签库中定义。函数用法具有以下语法-
    
    ${ns:func(param1, param2, ...)}
    
    其中ns是函数的名称空间,func是函数的名称,param1是第一个参数值。例如,函数fn:length,它是JSTL库的一部分。可以按如下方式使用此函数来获取字符串的长度。
    
    ${fn:length("Get my length")}
    
    要使用任何标签库(标准或自定义)中的函数,您必须在服务器上安装该库,并且必须使用<taglib>指令将库包含在JSP中,如JSTL章节所述。
  • JSP EL隐式对象

    JSP表达式语言支持以下隐式对象-
    对象 说明
    pageScope 页面作用域内的作用域变量
    requestScope 来自请求作用域的作用域变量
    sessionScope 会话作用域的作用域变量
    applicationScope 来自应用程序作用域的作用域变量
    param 请求参数为字符串
    paramValues 请求参数作为字符串集合
    header HTTP请求标头为字符串
    headerValues HTTP请求标头作为字符串的集合
    initParam 上下文初始化参数
    cookie Cookie值
    pageContext 当前页面的JSP PageContext对象
    您可以在表达式中使用这些对象,就像它们是变量一样。以下示例将帮助您理解概念-
  • pageContext对象

    pageContext对象使您可以访问pageContext JSP对象。通过pageContext对象,您可以访问请求对象。例如,要访问请求的传入查询字符串,可以使用以下表达式-
    
    ${pageContext.request.queryString}
    
  • 作用域对象

    pageScope,requestScope,sessionScope,和applicationScope变量提供访问存储在每个作用域级别的变量。例如,如果需要在应用程序作用域中显式访问box变量,则可以通过applicationScope变量作为applicationScope.box对其进行访问。
  • param和paramValues对象

    使用param和paramValues对象可以访问通常可通过request.getParameter和request.getParameterValues方法获得的参数值。例如,要访问名为order的参数,请使用表达式${param.order}或${param[“order”]}。
    以下是访问名为username的请求参数的示例-
    
    <%@ page import = "java.io.*,java.util.*" %>
    <%String title = "Accessing Request Param";%>
    
    <html>
       <head>
          <title><% out.print(title); %></title>
       </head>
       
       <body>
          <center>
             <h1><% out.print(title); %></h1>
          </center>
          
          <div align = "center">
             <p>${param["username"]}</p>
          </div>
       </body>
    </html>
      
    param对象返回单个字符串值,而paramValues对象返回字符串数组。
  • header和headerValues对象

    header和headerValues对象使您可以访问通常可通过request.getHeader和request.getHeaders方法获得的头值。例如,要访问名为user-agent的标头,请使用表达式${header.user-agent}或${header[“ user-agent”]}。
    以下是访问名为user-agent的头参数的示例-
    
    <%@ page import = "java.io.*,java.util.*" %>
    <%String title = "User Agent Example";%>
    
    <html>
       <head>
          <title><% out.print(title); %></title>
       </head>
       
       <body>
          <center>
             <h1><% out.print(title); %></h1>
          </center>
          
          <div align = "center">
             <p>${header["user-agent"]}</p>
          </div>
       </body>
    </html>
      
    header对象返回单个字符串值,而paramValues对象返回字符串数组。