EL表达式的隐式对象_动力节点Java学院整理

在使用EL时,其实EL是先看标识符是否是其隐式对象之一,如果不是,才从四个域(page、request、session、application)中顺序搜索(使用pageContext.findAttribute方法)。

EL总共有如下隐式对象:

而这里,EL和JSP一样拥有pageContext对象,通过在EL中使用pageContext对象,能获取JSP中其它几个隐式对象,然后再获得这些对象中的属性。例如获取当前web工程的名称的经典EL表达式:${ pageContext.request.contextPath },就是由pageContext先获取request对象(因为在JSP的API中,我们可以看到pageContext有getRequest方法),获取到request对象后,因为request中含有getContextPath方法,因此我们还可以获得request对象中contextPath属性的值。

pageScope、requestScope、sessionScope、applicationScope这四个EL隐式对象分别代表了各自域中的Map对象(每个域以关键字来保存数据或对象,肯定是使用Map集合),这Map对象保存了存在这些域中的键值对。通过EL表达式和这些隐式对象,我们可以直接从指定的域中获取存储的数据。

例1:

<%
      User u = new User();
      u.setUsername("fjdingsd");
      session.setAttribute("user", u);
   %>
 欢迎您:${sessionScope.user.username}

在浏览器中观察:

对于用户登录这样的案例来说,我们检查用户是否登录肯定只需要从session域中查询,这样使用EL表达式的sessionScope隐式对象就足够了。

param隐式对象:表示所有请求参数的Map集合对象。例如表单提交,那么在请求参数中的数据就以键值对存储在param对象所代表的Map集合中,下面的例子我以get方式来替代post方式来模拟表单请求参数:

例2:

 ${param.username}

在地址栏上添加URL参数,可以看到:

使用param隐式对象同样也能作为数据回显功能,在以前JSP页面提交的表单如果想做出数据回显功能,必须创建一个form的bean对象,当表单校验失败时,重新将这个bean对象通过转发(forward)传回JSP页面再取出。而使用param对象,不需要新建form的bean对象,只需要在表单校验失败时转发回表单所在的JSP页面,通过param对象就可以从请求中取出之前的表单数据。

例3:表单验证失败的数据回显demo

在JSP页面beantag.jsp中:

 <form action="${pageContext.request.contextPath}/servlet/FormHandler" method="post">
用户名 <input type="text" name="username" value="${param.username}" />
<input type="submit" value="提交" >
</form>

在处理表单的Servlet中:

 //省略表单验证过程,验证失败重新转发到表单页面
 request.getRequestDispatcher("/beantag.jsp").forward(request, response);

刚进入表单注册页面:

假设表单验证失败,则转发请求到表单注册页面,并回显数据:

paramValues隐式对象:也是表示一个保存所有的请求参数的Map集合对象,但是paramValues对象和param对象的区别是,对任何一个参数,paramValues都是以字符串数组(String[])作为保存数据的类型,因此paramValues对象适合在有同名参数的情况下使用。

例4:

 ${paramValues.name[0]}

浏览器中观察:

例5:

${paramValues.name[1]}

浏览器中观察:

header隐式对象:表示一个保存了该JSP页面发出请求的请求头字段的Map集合对象。

注意:这个对象只能获取请求头字段的信息,不能获取响应头字段的信息。另外如果头字段中含有小横线的”-”,例如”Accept-Encoding”,则要使用中括号加引号的EL取数据形式,例如 ${ header[‘accept-encoding'] }。

例6:

${header.connection}

在浏览器中观察:

例7:

${header['accept-encoding']}

在浏览器中观察:

headerValues隐式对象功能类似于header隐式对象,但以字符串数组封装每个保存的请求头字段信息,这点跟paramValues隐式对象是一样的。

cookie隐式对象:表示一个保存了该请求中所有的Cookie的Map集合对象。

假设在请求中有一个cookie,cookie的键值对为:

JSESSIONID=E9546AE9C86FB722BDBD7AF947157379

例8:

 ${cookie.JSESSIONID}

在浏览器中观察:

可以看到,cookie隐式对象的名称(cookie)是Map集合的名称,而在这个Map集合中,有一个键值对的key命名为JSESSIONID,而通过${cookie.JSESSIONID}获取到的是一个Cookie对象,那么我们如何获取该Cookie的值呢?

之前说过EL表达式都是通过对象的具有的属性来获取属性值,能被称为属性的都有getXXX方法,而Cookie正是具有getName()方法和getValue()方法,因此在EL表达式中获取了Cookie对象后可以再获取这两个属性:

例9:

${cookie.JSESSIONID.name} <br>
${cookie.JSESSIONID.value}  <br>

在浏览器中观察:

initParam隐式对象:表示一个保存了所有web应用初始化参数(context-param)的Map集合对象。

<context-param>标签用于配置全局性的web参数,在Servlet中可以使用 ServletContext.getInitParameter方法获取指定参数的值。

而在JSP页面中,我们可以同EL表达式的initParam方法来获取为web应用配置的全局性参数。

例10:

在web.xml文件中配置:

 <context-param>

<param-name>username</param-name>

 <param-value>fjdingsd</param-value>

</context-param>

在JSP页面中:

${initParam.username }

在浏览器中观察:

(0)

相关推荐

  • Java中的隐式参数和显示参数实例详解

    在学习Java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数. 隐式参数,是在类的方法中调用了类的实例域.这个被调用的实例域就是隐式参数.在以下的这个类中调用了a.ariseSalary(100),就用到了隐式参数.比如: public class Abc { private double salary; public Abc(){ } public void ariseSalary(double

  • Java基础之隐式转换vs强制转换

    Java中,经常可以遇到类型转换的场景,从变量的定义到复制.数值变量的计算到方法的参数传递.基类与派生类间的造型等,随处可见类型转换的身影.Java中的类型转换在Java编码中具有重要的作用. 在定义变量时,有许多要注意的问题,一不小心就会出现损失精度或者不兼容类型等问题. 例如: 1.定义长整型数据时,必须加后缀l或L long l =123456789012345L 2.定义单精度类型时(7-8位有效数字),必须加后缀 f 或 F float f = 12.5F 3. boolean类型不可

  • EL表达式的隐式对象_动力节点Java学院整理

    在使用EL时,其实EL是先看标识符是否是其隐式对象之一,如果不是,才从四个域(page.request.session.application)中顺序搜索(使用pageContext.findAttribute方法). EL总共有如下隐式对象: 而这里,EL和JSP一样拥有pageContext对象,通过在EL中使用pageContext对象,能获取JSP中其它几个隐式对象,然后再获得这些对象中的属性.例如获取当前web工程的名称的经典EL表达式:${ pageContext.request.c

  • JavaScript之浏览器对象_动力节点Java学院整理

    JavaScript可以获取浏览器提供的很多对象,并进行操作. window window对象不但充当全局作用域,而且表示浏览器窗口. window对象有innerWidth和innerHeight属性,可以获取浏览器窗口的内部宽度和高度.内部宽高是指除去菜单栏.工具栏.边框等占位元素后,用于显示网页的净宽高. 兼容性:IE<=8不支持. // 可以调整浏览器窗口大小试试: alert('window inner size: ' + window.innerWidth + ' x ' + win

  • JavaScript对象_动力节点Java学院整理

    JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成. JavaScript的对象用于描述现实世界中的某个对象.例如,为了描述"小明"这个淘气的小朋友,我们可以用若干键值对来描述他: var xiaoming = { name: '小明', birth: 1990, school: 'No.1 Middle School', height: 1.70, weight: 65, score: null }; JavaScript用一个{...}表示一个对象,键值对以xx

  • mybatis实现表与对象的关联关系_动力节点Java学院整理

    所需要用到的其他工具或技术: 项目管理工具 : Maven 测试运行工具 : Junit 数据库 : Derby Maven Dependencies: <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.7</version> </dependen

  • Java数组优点和缺点_动力节点Java学院整理

    数组是Java语言的基本知识之一,在深入学习Java基础后,我们都知道那些容器,在之后,在我们学习.工作的过程中基本就是使用容器了,很少很使用数组,那么为什么还要有数组呢,我也是今天才遇到这个问题,专门的找资料学习了一下. 数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力,当然现在有泛型,保存类型的区别已经不大了. 数组较容器,最大的优点就是效率.在Java中,数组是一种效率最高的存储和随机访问对象引用序列的方式,数组就是一个简单的线性序列,这使得元素访问非常快速,无论使用

  • Java中抽象类和接口的区别_动力节点Java学院整理

    接口 1 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口. 2 接口里面的成员变量默认都是public static final类型的.必须被显示的初始化. 3 接口里面的方法默认都是public abstract类型的.隐式声明. 4 接口没有构造方法,不能被实例化. 5 接口不能实现另一个接口,但可以继承多个接口. 6 类如果实现了一个接口,那么必须实现接口里面的所有抽象方法,否则类要被定义为抽象类. 抽象类 1 如果将一个类

  • struts2数据处理_动力节点Java学院整理

    Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理.值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:ValueStack一种数据结构,操作数据的方式为:先进后出 OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技术底层采用反射实现. 一:数据的提交方式

  • Java Scaner类详解_动力节点Java学院整理

    Java.util.Scanner是Java5.0的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎么地. 一.扫描控制台输入  这个例子是常常会用到,但是如果没有Scanner,你写写就知道多难受了. 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象.如果要获取输入的内容,则只需要

  • Java Iterator迭代器_动力节点Java学院整理

    迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的.只要拿到这个对象,使用迭代器就可以遍历这个对象的内部. 1.Iterator Java提供一个专门的迭代器<<interface>>Iterator,我们可以对某个序列实现该interface,来提供标准的Java迭代器.Iterator接口实现后的功能是"使用"一个迭代器. 文档定义: Package java.util; publici

  • Java 中的HashMap详解和使用示例_动力节点Java学院整理

    第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,HashMap中的映射不是有序的. HashMap 的实例有两个参数影响其性能:"初始容量" 和 "加载因子&quo

随机推荐