`

剖析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标签库的使用.pdf

    EL、JSTL表达式案例精讲

    EL、JSTL表达式介绍并结合案例分析,简明扼要,通俗易懂

    解析Tomcat 6、7在EL表达式解析时存在的一个Bug

    主要是对Tomcat 6、7在EL表达式解析时存在的一个Bug进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    基于Java EE的B2B在线交易系统的设计与实现毕业设计论文

    PowerDesigner 、SQLyog等,在 J2EE 技术中主要采用了 Struts1.2 框架、Spring2.0 框架、EL表达式和公司内部数据处理框架(保密),系统的整体结构采用 MVC三层模式,项目中还大量运用了较新的 ajax 技术(避免页面...

    网页教程《跟姐姐学JSP》

    13. 剖析el表达式 13.1. 再谈el(Expression Language) 13.2. 作用域 13.3. 运算符 14. 生命周期 14.1. 生命周期 14.2. 线程模型 14.3. 在jsp中定义类变量 14.4. jsp九大默认对象 15. 分页 15.1. 数据库...

    JSP+SERVLET+MYSQL实现的增删改查javaweb新闻管理系统小例子,主页有具体介绍,界面图片

    能学到什么:①练习JSP,EL表达式,SERVLET关键点技术项目;②分层开发的管理系统,都是如何设计和实现的,简单的展现,通俗易懂。 阅读建议:此资源以开发简化版jsp学习其原理和内核,不仅是代码编写实现也更注重...

    老杜javaweb教程配套资料JavaEE帮助文档分享

    主要内容包括:Servlet、JSP、EL表达式、JSTL标签库、Filter过滤器、Listener监听器。在讲解过程中采用的手法是从0到1,让小白学会源码分析,让大牛眼前一亮。总之,不管你是小白,还是已经在从事Java开发的工作者,...

    El Tabelle for .NET--高性能的数据库网格.Net控件

    日期和数字的最大最小值/输入字符长度,字符类型,格式/IME 控制/使用正规表达式的掩码输入处理/输入验证。 开发环境 VB .NET/C# .NET 支持平台 Windows2000/XP 电话 021-58549800 Email: tools@sh.grapecity....

    《Java_Web应用开发实用教程》练习答案

    第2篇JSP高级技术分为7章,深入剖析了主流的Web开发框架,包括EL表达式语言、JSTL、自定义标签、Log4j、Hibernate、Spring框架;第3篇Java Web技术应用分为5章,介绍具体场景下的应用案例,包括注册登录模块的应用、...

    基于jsp的纯mvc的个人博客管理系统

    纯mvc模式,采用jsp+servlet+javabean技术,页面取值用的c标签和el表达式,将逻辑和页面分离,层次清楚,虽然页面很粗糙,但基本上实现了所有功能。

    动力节点老杜最新Javaweb教程学习文档分享

    主要内容包括:Servlet、JSP、EL表达式、JSTL标签库、Filter过滤器、Listener监听器。在讲解过程中采用的手法是从0到1,让小白学会源码分析,让大牛眼前一亮。总之,不管你是小白,还是已经在从事Java开发的工作者,...

    JSP网页民航售票系统课程设计源代码+文档

    每一个功能都是通过javabean获取前台页面的数据,传递给servlet,然后进一步通过service层与dao数据库层的交互进行功能数据的处理,处理结果通过bean返回给jsp页面进行显示,在显示时还结合使用了jstl和el表达式。...

    影音娱乐泉城JSP播客系统-video.rar

    在学习泉城JSP播客系统的过程中,学习者可以掌握JSP的基本语法、标签库、EL表达式、JSTL标签库等核心技术,同时还可以了解到如何使用JSP进行文件上传、文件下载、分页显示等常见功能的实现。此外,通过对比分析不同...

    Struts2核心包

    ognl-3.0.jar:对象图导航语言(Object Graph Navigation Language),它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,...

    jstl1.1.jar和standard1.1.jar

    今天做项目,用到了el表达式和jstl,在tomcat6.0上跑得好好的,没想到copy到tomcat5.5后,服务器起不来了,是tomcat版本的问题。查阅了不少资料,现在总结如下: 错误信息: java.lang.NoClassDefFoundError: javax...

    tot-jsp-cms.rar

    此外,这个资料包还包括了一些高级的JSP技术,如JSP标签库、自定义标签和EL表达式等。这些技术可以帮助你更好地组织和管理你的JSP代码,提高代码的可读性和可维护性。总之,tot-jsp-cms.rar是一个全面而实用的JSP...

    java文集

    正则表达式 lucene索引合并 探查Weblogic JDBC Multipool 问题 struts通用Exception处理 ... JDOM和数据库 DB封装 菜鸟编程那点事 JPA中的集合查询示例 EL表达式 彩金狮王I代46倍

    Java毕业设计-基于ssm框架开发的社区文化宣传网站+jsp-毕业论文(附源代码).rar

    通过JSP标签库和EL表达式的使用,开发者能够轻松实现数据的展示和交互,为用户带来良好的浏览体验。 此外,附带的毕业论文对项目的背景、意义、技术实现及创新点进行了深入剖析,不仅有助于学习者理解项目的整体...

    学习听说要过时的JSP技术内容 -JavaWeb篇

    EL表达式与JSTL在下篇文章。 JSP内容目录JSP介绍JSP为什么能替代用Servlet类回传页面?JSP的三种语法介绍:(1)声明脚本:(不常使用)(2)表达式脚本:(常用)(3)代码脚本jsp 中的三种注释jsp 九大内置对象jsp 四大域...

Global site tag (gtag.js) - Google Analytics