`

剖析el表达式

阅读更多

我们已经知道el是jsp-2.0规范的一部分,tomcat-5.x版本以上都已经能够支持jsp-2.0规范,但在更低版本的tomcat和webphere,weblogic中还是无法使用这一便捷方式。

其实我们也可以选择在jsp中禁止使用el表达式,使用jsp指令(directive)可以对禁用某一个jsp中的el表达式。

禁用之后的el表达式会以原样显示出来,如下图所示。

为了对照,我们还在13-01下放了一个可以正常使用el表达式的例子,运行效果如下图显示。

在13-01/index.jsp中禁用el表达式,是使用了isELIgnore="true"这样一条jsp指令(directive),请注意大小写。

<%@ page isELIgnored="true" %>
<%
    pageContext.setAttribute("hello", "Hello World");
%>

${hello}

还有一种批量禁用el的方法,我们可以在WEB-INF/web.xml中使用jsp-property-group标签批量禁用el,我们在13-02/WEB-INF/web.xml中进行如下配置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <el-ignored>true</el-ignored>
        </jsp-property-group>
    </jsp-config>

</web-app>

这样就会禁用所有以.jsp后缀的请求中的el表达式,使用这种方式需要注意两点。

  1. jsp-property-group标签是jsp-2.0中新增功能,如果你使用低版本的web.xml(2.3或以下)就不能使用这个标签了

  2. 设置jsp-config会影响jsp生成servlet的过程,如果程序修改时已经有jsp转换成servlet并缓存在work目录下,那么修改后需要先清除缓存,才能看到效果。

实际上还有第三种方法可以禁用掉所有jsp中的el表达式,那就是把web.xml定义为2.3版

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
</web-app>

这个就是13-03/WEB-INF/web.xml的定义,定义了web-app的版本号是2.3,这样一来所有的jsp都无法使用el表达式了,因为el表达式是2.4版才开始支持的功能。

注意

说了以上三种禁用el表达式的方法,不是希望大家抛弃el表达式,相反是希望大家在自己编写el时出现问题时,先去考虑是否有人在这三个地方做了设置造成el表达式的失效。建议大家多多使用el表达式,少用一些jsp中的scriptlet代码。
==================================================================

作用域

使用el的时候,默认会以一定顺序搜索四个作用域,将最先找到的变量值显示出来。

如果我们有${username}这样一个正则表达式,它回去依次调用pageContext.getAttribute("username") -> request.getAttribute("username") -> session.getAttribute("username") -> application.getAttribute("username"),只要找到某一个不为空的值就立刻返回。

这样的确方便我们的操作,但是随之也出现了另外一个问题,如果pageContext和request中有同名变量,但是我想取得request中的变量该如何是好呢?这就需要为el表达式引入作用域的概念了。

${pageScope.username}

${requestScope.username}

我们可以直接访问13-04这个应用,看看el表达式支持的所有对象。

下面我们分别对每个作用域对象进行讲解。

表 13.1. el中的作用域

el中的作用域对应关系
pageContext(1) 当前页的pageContext对象
pageScope 把page作用域中的数据映射为一个map对象
requestScope(2) 把request作用域中的数据映射为一个map对象
sessionScope 把session作用域中的数据映射为一个map对象
applicationScope 把application作用域中的数据映射为一个map对象
param 对应request.getParameter()
paramValues(3) 对应request.getParameterValues()
header(4) 对应request.getHeader()
headerValues 对应request.getHeaderValues()
cookie(5) 对应request.getCookies()
initParam(6) 对应ServletContext.getInitParamter()

 

(1)

例子中的${pageContext.request.contextPath}返回的是request.getContextPath()的值,在此例中就是/13-04,我们经常使用这个来拼接jsp中的绝对路径。

这里的${pageContext.request.contextPath}是一种特殊用法,不能使用${request.contextPath}的形式替代。

(2)

pageScope, requestScope, sessionScope, appliationScope都可以看作是Map型变量,调用其中的数据可以使用${pageScope.name}或${pageScope["name"]}的形式,这两种写法是等价的。

在某些情况下只能使用${pageScope["content-type"]},这里不能写成${pageScope.content-type},jsp无法解析连字符(-)会出现错误。

(3)

需要注意的是${paramValues.name}得到的是一个字符串数组,如果需要获得其中某个值,还需要使用${paramValues.name[0]}指定数组中的索引。

这与下面的${headerValues.name}是相似的。

(4)

${header.name}会取得http请求中的header参数,现实工作中很少用到这里的数据。

例子中使用Host是指请求访问的主机地址,包括ip和端口号。而Referer比较有趣,如果用户通过超链接跳转过来的,Referer会保存上次访问页面的地址,我们就可以通过它来统计哪些用户是从哪里转来的了。

(5)

${cookie.name}将获得对应cookie的对象,比如我们用jsp将一段cookie发送给客户端。

Cookie cookie = new Cookie("username", "Username in cookie");
response.addCookie(cookie);

创建一个名称为username,值为"Username in cookie"的Cookie对象,然后发送给客户端。

然后我们就可以使用${cookie.username}获得这个cookie了,${cookie.username.name}获得cookie名称,${cookie.username.value}获得cookie值。

(6)

ServletContext.getInitParamter()指的应用的初始变量,这些变量都是定义在web.xml中的。

<context-param>
    <param-name>username</param-name>
    <param-value>username with context param</param-value>
</context-param>

${initParam.username}就会得到这里的变量值。

以上都是死记硬背的东西,建议实际用到的时候翻看一下就好了,演示代码都放在13-04下,为了获得param和cookie还要点击一下最下边的连接才可以。

顺便说一下如果想在jsp中显示${name}而不让jsp把它当作el计算出来,可以写成\${name},这样最后显示的结果就是${name}了。


分享到:
评论

相关推荐

    JAVAEE实验报告EL表达式和jstl标签库的使用.pdf

    JAVAEE 实验报告 EL 表达式和 JSTL 标签库的使用 EL 表达式(Expression Language)是一种在 JSP 页面中使用的脚本语言,用于简化 JSP 页面的开发。EL 表达式可以访问 JSP 页面中的变量、对象和集合,进行逻辑操作...

    el表达式不起作用解决方案

    然而,有时开发者可能会遇到EL表达式不工作的问题,这可能给开发过程带来困扰。本篇文章将详细探讨这个问题,并提供几种有效的解决方案。 1. **检查JSP页面的DOCTYPE** EL表达式在JSP 2.0及更高版本中默认启用。...

    maven项目中的EL表达式问题

    通过本文的分析与解决方案,我们可以更好地理解如何解决EL表达式未被解析的问题,避免类似错误的发生。同时,对于新手开发者来说,熟悉Maven的基本用法以及Web规范的不同版本之间的差异也是十分必要的。

    JXL使用模板通过el表达式生成excel文件

    通过JXL库和EL表达式,开发者可以快速生成动态的、格式化的Excel文件,这在数据分析、报表生成或数据导出场景中非常有用。尽管JXL库在处理现代Excel格式上可能稍显过时,但它仍然是一个实用的工具,尤其适合处理较旧...

    JSP EL表达式 代码案例快速入门

    EL表达式通常以`${}`包围,它可以直接输出变量的值或者执行简单的运算。例如,如果有一个名为"user"的JavaBean,其中包含一个"name"属性,那么在JSP页面中,我们可以用`${user.name}`来获取并显示这个属性的值。 **...

    javaJSTL_EL表达式

    本文将重点介绍JSTL_EL表达式的概念、特点及其应用场景。 #### 二、EL 表达式的概念 EL表达式是一种简洁的数据访问语言,它允许开发者在JSP页面中直接获取和操作Java对象。这种表达式的语法非常直观易懂,比如`"${...

    el表达式如${s}中s的要求

    ### EL表达式中`s`的要求解析 #### 一、EL表达式概述 EL(Expression Language)表达式是一种在JSP页面中使用的简化数据访问语法,主要用于获取存储在不同作用域中的对象属性。EL表达式的典型格式为`${expression}...

    EL表达式函数

    ### EL表达式函数详解 #### 一、引言 在Web开发中,特别是使用Java Server Pages (JSP)进行开发时,我们经常会遇到需要在页面上动态处理数据的情况。为了提高开发效率并确保代码的简洁性和可维护性,Java Standard...

    EL表达式无效问题《ZT》

    通过上述分析,我们可以看出,解决EL表达式无效问题需要从多个角度进行排查,包括检查依赖、语法、作用域、类型转换以及服务器配置等。理解并熟练运用这些知识,将有助于我们在开发过程中更有效地诊断和修复此类问题...

    jsp页面中EL表达式被当成字符串处理不显示值问题的解决方法.docx

    ### jsp页面中EL表达式被当成字符串处理不显示值问题的解决方法 #### 背景介绍 在Java Web开发中,JSP(JavaServer Pages)是一种广泛使用的服务器端技术,用于创建动态网页。EL(Expression Language)是JSP 2.0...

    有关JSP EL表达式的资料

    ### JSP EL表达式的深入解析 #### 一、EL表达式概述 ...通过上述分析,我们可以看出EL表达式不仅简化了数据的获取过程,还提供了丰富的运算符和功能支持,极大地提升了JSP页面的开发效率和代码质量。

    jsp 不支持EL表达式,解决办法

    2. **局部开启EL表达式支持**:对于特定的JSP页面,可以通过设置`isELIgnored`属性为`false`来单独启用EL表达式支持。 #### 三、详细步骤 ##### 3.1 整体升级项目配置 如果希望整个项目都能够支持EL表达式,可以...

    el表达式empty的用法

    在探讨EL表达式的`empty`操作符之前,我们先简要了解一下什么是EL表达式。EL,全称为Expression Language,是JavaServer Pages (JSP) 技术中的一个重要组成部分,用于在JSP页面中访问和操作JavaBean对象。EL表达式...

    Java代码中使用JSP/JSF表达式语言EL

    至于“工具”,可能是指一些辅助开发的工具,如IDE(如Eclipse、IntelliJ IDEA)中的EL表达式检查器,它们可以帮助开发者在编写代码时实时检查EL表达式的正确性,或者像Tomee、Glassfish这样的服务器提供的EL表达式...

    el表达式教程

    ### EL表达式教程 #### EL简介 EL (Expression Language),即表达式语言,是一种简洁的数据访问语言,专门设计用于在JSP页面中访问JavaBeans属性和执行简单的运算。EL表达式可以大大简化JSP页面中Java代码的编写,...

    EL表达式及JSTL标准标签

    在探讨“EL表达式及JSTL标准标签”的过程中,我们深入分析了这些技术在Java Server Pages(JSP)中的应用及其对Web开发的影响。以下是对该主题的详细阐述: ### 1. EL表达式(Expression Language) EL表达式是...

    在js文件中写el表达式取不到值的原因及解决方法

    在Web开发中,JSP页面经常使用EL表达式(Expression Language)来获取Java代码中定义的属性值。EL表达式的主要用途是在JSP页面中表达式语言的脚本表达式中动态获取值,其解析过程在服务器端执行。而JavaScript是一种...

    EL表达式+JSTL.zip

    EL表达式语言主要用于简化Java Servlets和JSP页面中的数据访问,而JSTL则提供了一套丰富的标签库,帮助开发者更高效地处理常见任务。 EL表达式: 1. EL是一种简洁的脚本语言,用于获取和设置JavaBeans或其他可绑定...

Global site tag (gtag.js) - Google Analytics