JSP内置对象

更新时间:2024-05-19 21:32:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第2章 XX

第1章 JSP内置对象

本章学习目标

? 掌握request对象的使用方法 ? 掌握response对象的使用方法 ? 掌握session对象的使用方法 ? 掌握application对象的使用方法 ? 掌握pageContext对象的使用方法 ? 掌握out对象的使用方法 ? 掌握exception对象的使用方法

第2章 XX

简介

在前面的章节,我们已经详细介绍了JSP的基本语法,使读者对JSP技术有一个比较初步的了解,但是应用第7章讲述的JSP知识只能编写一部分简单的程序,如果需要实现一些比较复杂高级的功能,例如网上购物、在线聊天室等,仅靠第7章介绍的知识是明显不够的。在JSP内部,已经定义好了若干个JSP内置对象,应用这些内置对象,可以实现很多很重要的功能。在JSP内部已经被定义完善的对象有:out对象、request对象、response对象、exception对象、config对象、page对象、pageContext对象、application对象、session对象等。

下表列出了可用的内置对象及其使用说明: 对象名 request response pageContext session application out config exception page

对象说明 代表与请求相关的HttpServletRequest对象 代表与响应相关的HttpServletResponse对象 代表封装请求某个JSP页面时请求环境的pageContext对象 代表特定用户会话的HttpSession对象 代表Web应用程序的ServletContext对象 代表与响应输出流相关的JspWriter对象 代表JSP页面的Servlet相关的ServletConfig对象 代表JSP页面抛出的Trowable对象,只能在JSP错误页面使用 等于Java编程语言中的this变量,表示本页面 1.1 request 对象

request 是与用户请求相关的 request类型的对象,它是 HttpServletRequest的一个子类。该对象包含了所有有关当前浏览器请求的信息,包括 Cookies 和 HTML 表单变量等。通过 HttpServletRequest 能访问到请求的参数、请求的类型(GET 或 POST)以及文件头(Header)信息。request是最常用的对象,希望大家要能够灵活运用。

request 对象常用方法如下表所示:

第2章 XX

方法名 getParameter() getParameterNames() getParameterValues() getAttribute() setAttribute() getAttributeNames() getRequestURL() getQueryString() getProtocol() getContextPath() getMethod() getServerName() getServerPort() getRemoteAddr() getLocalAddr() getScheme() getCharacterEncoding() setCharacterEncoding() getHeader() 下面的示例演示了request对象的用法,代码如下所示: 代码: 返回某个指定名称的参数的值 说明 返回一个包含请求消息中的所有参数名的Enumeration对象 获得HTTP请求消息中的同一个参数名所对应的所有参数值 用于从ServletRequest对象中返回指定名称的属性对象 用于将一个对象与一个名称关联后存储进ServletRequest对象 用于返回一个ServletRequest对象中的所用属性名的Enumeration对象 返回请求行中的资源名部分的内容 返回请求行中的资源名部分的内容 返回请求行中的协议名和版本 返回请求URL所属于的Web应用程序的路径 返回HTTP请求消息中的请求方式 返回当前请求所指向的主机名 返回当前请求所连接的服务器端口号 返回发出请求的客户机的IP地址 返回Web服务器上接受当前请求的网络接口的IP地址 返回请求的协议名 返回请求消息的实体部分的字符集编码 覆盖请求消息中实体内容的字符集编码名称的设置 返回一个指定名称的头字段的值 <%@ page language=\ pageEncoding=\

request方法测试

request方法测试

getMethod方法 <%=request.getMethod() %> getRequestURL方法 <%=request.getRequestURI() %> getQueryString方法 <%=request.getQueryString() %> getProtocol方法 <%=request.getProtocol() %> getContextPath方法 <%=request.getContextPath() %> getServerName方法 <%=request.getServerName() %> getSchema方法 <%=request.getScheme() %> getRemoteAddr方法 <%=request.getRemoteAddr() %> getCharacterEncoding方法 <%=request.getCharacterEncoding() %> getHeader方法 <%=request.getHeader(\第2章 XX

getParameter方法 <%=request.getParameter(\ <%request.setAttribute(\ getAttribute方法 <%=request.getAttribute(\ 我们在浏览器中输入http://localhost:8080/项目名/test_request.jsp?username=qiaochu,这可以到如下显示效果,如图所示: 图8-1

第2章 XX

1.2 response对象

response 对象是最重要的对象之一,只有通过它,才能响应客户端的请求,才能向客户端输出信息。它的作用与 request 对象正好相反,request 对象包含了客户请求的有关信息,而 reponse 对象包含了响应客户请求的有关信息。

虽然在 JSP 代码中很少直接用到 response 对象,但它的作用是明显的。它在 Servlet 里的原型是HttpServletResponse, 也是运行doGet()和doPost()等方法时接收到的另外一个对象。它可以使用 HttpServletResponse 的所有方法。由于 HttpServletResponse 是继承于ServletResponse,所以它还可以使用 ServletResponse的所有方法。response 对象最常用的方法就是 getWriter()和 setContentType()。一般响应时首先必须指定 MIME 类型,也就是调用setContentType()方法,然后才能调用 getWriter()创建 PrintWriter对象并利用它的方法向客户端输出内容。

response 对象常用方法如下表所示: 方法名 setContentType() setCharacterEncoding() addHeader() setHeader() containsHeader() getWriter() 用于设置输出内容的MIME类型 用于设置输出内容的MIME声明中的字符集编码 增加一个新的头字段,同名的不覆盖而是增加一个新的 增加一个新的头字段,同名的覆盖 用于检查某个名称的头字段是否已被设置 返回Servlet创建的字符输出流对象 说明

下面的代码演示了部分response对象的用法,代码如下所示: 代码: <%@ page language=\ Insert title here

response测试

<% response.setContentType(\response.setCharacterEncoding(\response.getWriter().println(\%>

<%=response.containsHeader(\ 浏览器中的显示效果如下图所示: 第2章 XX

图8-2

1.3 session对象

session对象是十分重要的一个JSP内置对象,它可以用来在每一个用户之间分别保存用户信息,这与application对象不同。application对象用于在多个程序之间保存信息,application对象只有一个,它可以绑定若干个相当于全局变量的参数或者Java对象,每个JSP程序所访问的都是application对象的一个同步副本,都是一样的,而且application对象的生命周期贯穿服务器的整个运行周期。但是,服务器上的session对象却可以有多个,不同的用户所面临的session对象一般来说是不同的,当用户登录网站,系统将为他生成一个独一无二的session对象,用以记录该用户的个人信息,一旦该用户退出网站,那么该session对象将会被注销。session对象也可以绑定若干个参数或者Java对象,这些参数或者Java对象就相当于局部变量,不同session对象间的同名变量是不会相互干扰的。我们使用session对象的功能,可以十分简单地实现购物车等功能。 session对象其实是javax.servlet.http.HttpSession接口的实例对象。因此,session对象的方法其实就是HttpSession接口的方法,下面我们将挑选一些比较重要的方法进行介绍:

方法 getAttribute() getAttributeNames() getCreationTime() getId() invalidate() getMaxInactiveInterval() removeAttribute() setAttribute() 获得指定名称的属性值 返回 session 对象中一个包含所有属性名的Enumeration 对象 返回该 session 对象创建的时间 返回与当前session对象关联的会话标识号 强制令当前的session对象无效 返回当前session对象可空闲的时间 从当前的session中删除指定名称的属性 用于将一个对象与一个名称关联后存进当前的session中 说明 第2章 XX

session 对象是一个非常有用的内部对象,在具体的编程过程中会经常用到。为说明session 对象的具体应用,下面介绍一个session的应用实例

1. 我们首先编写一个表单页面(test_session.jsp) 代码: <%@ page language=\ pageEncoding=\ session测试 在页面中输入名字和邮箱,其效果如下图所示:

图8-3

2. 然后再编写一个显示页面(test_session2.jsp)用于从session中获得属性值 代码: 第2章 XX

<%@ page language=\ pageEncoding=\ session测试2 <% request.setCharacterEncoding(\String username = request.getParameter(\session.setAttribute(\String email = request.getParameter(\session.setAttribute(\%> <% username = (String)session.getAttribute(\email = (String)session.getAttribute(\%> 用户名:<%=username %>
邮箱:<%=email %> 在点击确定后,页面跳转到test_session2.jsp页面,该页面的显示效果如下所示:

图8-4

第2章 XX

1.4 application对象

application对象是一个特别重要的JSP对象,它存在于服务器的内存空间中,服务器一旦启动,就会自动产生一个application对象,除非服务器被关闭,否则这个application对象将一直保持下去。在application对象的生命周期中,在当前服务器上运行的每一个JSP程序都可以任意存取和这个application对象绑定的参数(或者Java对象)的值。application对象的这些特性为我们在多个JSP程序中、多个用户共享某些全局信息(如当前的在线人数等)提供了方便。由此我们可以不借助数据库就实现聊天室的功能。

application对象其实是实现javax.servlet.ServletContext接口的类的实例对象,可以把它看做一个Web应用的封装对象,每个Web应用程序都会有一个application对象,下面我们将挑选一些比较重要的方法进行介绍:

方法 说明 setAttribute() 用于将一个对象与一个名称关联后存进当前的application中 getAttribute() 获得指定名称的属性值 getInitParameter() 获得Web.xml中的context初始参数 log() 记录日志 getRealPath() 返回某个虚拟路径所映射的本地文件系统路径 application是一个非常有用的内置对象,为了说明该对象的方法,我们举例演示一下 首先我们需要在Web.xml中添加如下代码:

app http://www.itttop.com 然后再编写test_application.jsp,注意其中的getRealPath()方法中的参数为“/”,表示当前Web应用程序的根目录;而log()方法则是将

代码:

第2章 XX

<%@ page language=\ pageEncoding=\ Insert title here <% application.setAttribute(\out.println(application.getAttribute(\%>
<% out.println(\中设置的初始参数值:\out.println(application.getInitParameter(\%>
<%=application.getRealPath(\

图8-5

1.5 pageContext对象

pageContext对象是JSP中很重要的一个内置对象,它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。实际上,pageContext对象提供了对JSP页面所有的对象及命名空间的访问,正如前面所介绍的一样,使用pageContext对象可以访问application对象、exception对象,还有session对象等。pageContext对象的方法可以访问除本身以外的8个JSP内部对象,还可以直接访问绑定在application对象、

第2章 XX

page对象、request对象、session对象上的Java对象。pageContext对象相当于JSP程序中所有对象功能的集成者。

pageContext对象的主要用法如下:

方法 getOut() getSession() getPage() getResponse() getRequest() getException() getServletConfig() getServletContext() setAttribute() getAttributeNameInScope() findAttribute() getAttributeScope() getAttribute() PageContext类提供了四个常量,用来表示四个作用域的范围: ? PAGE_SCOPE:表示存储在pageContext对象中,只在当前页面有效 ? REQUEST_SCOPE:表示存储在request对象中,在request作用域中有效 ? SESSION_SCOPE:表示存储在session对象中,在session作用域中有效 ? APPLICATION_SCOPE:表示存储在application对象中,在application作用域中有效。 我们编写一个测试程序来看看pageContext的方法的实际使用,代码如下所示: 代码: <%@ page language=\ <% pageContext.setAttribute(\说明 返回一个JspWriter类的实例对象,也就是JSP内置对象--out对象 返回值是一个HttpSession接口的实例对象,即JSP内置对象--session对象 返回值是一个java.lang.Object对象,也就是JSP内置对象--page对象 返回值是javax.servlet.ServletResponse,就是JSP内置对象--response对象 返回值是javax.servlet.ServletRequest,也就是JSP内置对象--request对象 返回值是当前页的exception对象 返回当前的config对象,用于获取JSP/Servlet程序的初始参数 返回值是ServletContext对象,也就是JSP内置对象--application对象的副本 可以将参数或者Java对象绑定到application对象、session对象、request对象或者page对象 获取特定JSP对象内部绑定了哪些参数或者Java对象互绑定的参数或者Java对象的值 将在application对象、session对象、request对象、page对象内部查找是否有某个参数或者Java对象与这些对象绑定 可以知道特定的参数或者Java对象和哪一个JSP对象绑定在一起 直接获取和application对象、page对象、session对象、request对象相互绑定的参数或者Java对象的值 第2章 XX

pageContext.APPLICATION_SCOPE); pageContext.setAttribute(\ pageContext.setAttribute(\ pageContext.setAttribute(\ out.println(pageContext.getAttribute(\pageContext.APPLICATION_SCOPE)+\ out.println(pageContext.getAttribute(\pageContext.SESSION_SCOPE)+\ out.println(pageContext.getAttribute(\pageContext.REQUEST_SCOPE)+\ out.println(pageContext.getAttribute(\pageContext.PAGE_SCOPE)+\ out.println(pageContext.getAttributesScope(\ out.println(pageContext.findAttribute(\ pageContext.removeAttribute(\ pageContext.removeAttribute(\ out.println(pageContext.getAttribute(\pageContext.APPLICATION_SCOPE)+\ out.println(pageContext.getAttribute(\r>\ out.println(pageContext.getAttribute(\pageContext.REQUEST_SCOPE)+\ out.println(pageContext.getAttribute(\pageContext.PAGE_SCOPE)+\ Enumeration ee=null; ee=pageContext.getAttributeNamesInScope(pageContext. REQUEST_SCOPE); while(ee.hasMoreElements()) { String name=(String)ee.nextElement(); out.println(\ out.println(\ } %> 浏览器中的效果如图所示: 第2章 XX

图8-6

1.6 out对象

在 JSP 程序中,遇到要向客户端输出内容时,经常会用到 out 对象,这是用于向用户端输出 PrintWrite 类型的对象。这—对象在 servlet中经常使用,它提供两种方法向客户端输出内容: println()和 print(), 它们的区别在于 println()输出完内容后终止当前行的输出, 而 print()则是下面的输出将接着这行输出。

除了这两种最常用的方法,通过下表看看out对象还有哪些方法: 方法名 newLine() flush() close() clearBuffer() clear() getBufferSize() getRemaining() isAutoFlush() 说 明 newLine()将输出一个换行符号 输出缓冲区里的数据 关闭输出流 清除缓冲区里的数据,并且把数据写到客户端 清除缓冲区里的数据,但不把数据写到客户端 获得缓冲区的大小,缓冲区的大小可以用<%@page buffer=\%>设置 获得缓冲区没有使用的空间的大小 返回布尔值,如果是 Auto Flush 那么返回 true,反之返回 false。可以用<%@ page isAutoFlash=\/false\%>设置 println()和print() 向客户端输出信息 第2章 XX

我们编写一个页面 (test_out.jsp)来演示一下out 对象的 println()和 print()方法,看看两者之间有何区别,代码入下所示: 代码: out 测试 out.println 打印结果:
<% out.println(\out.println(\%>


out.print 打印结果:
<% out.print(\out.print (\%> 浏览器中的效果如图所示:

图8-7

也许有的同学会问,这不是一样吗,没什么区别呀,其实在浏览器中也许我们看到的是一样的,但实际上是有区别的,我们来看看源文件就明白了

第2章 XX

图8-8

可以在源文件中看出,println()表示打印的内容会自动换行而print()打印的内容不会自动换行。

1.7 exception对象

exception是jsp页面中可以专门集中处理异常的内置对象,通过page指令的设定,Web应用中所有的JSP页面所发生的异常斗可以由指定的JSP页面处理,这个指定的JSP页面中就可以使用exception内置对象处理转发过来的异常。

使用page指令时,设定errorPage属性指定专门处理异常的JSP页面,而专门处理异常的JSP页面则设定isErrorPage属性为true。专门处理异常的JSP页面中使用这个内置的exception对象。

exception对象的主要方法如下表所示: 方法 getMessage() printStackTrace() toString() 该方法返回错误信息 该方法以标准错误的形式输出一个错误和错误的堆栈 该方法以字符串的形式返回一个对异常的描述 说明

我们首先人为的编写一个有异常的JSP页面(test_exception.jsp),代码如下所示: 代码: <%@ page language=\ pageEncoding=\ <% int result=1/0; 第2章 XX

%> 然后在编写对异常的处理页面(error.jsp),代码如下所示: 代码: <%@ page language=\ pageEncoding=\ <% String path = request.getContextPath(); String basePath = request.getScheme() + \ request.getServerPort()+path+\ %> My JSP 'error.jsp' starting page Error Message:getMessage() Method
<% out.println(exception.getMessage()); %>

Error String:toString() Method
<% out.println(exception.toString()); %> 效果如图所示:

第2章 XX

图8-9

本章小结

? 本章全面介绍了JSP的9种内置对象,给出了每一个对象所具有的方法及相应的使用说明。熟练使

用这些内置对象是开发JSP应用程序的基本要求,尤其是对于request、response、application、session和out对象要熟练掌握。所谓掌握对象的使用也就是掌握对象所具有的方法的使用,每一种对象都有几种常用的方法,详见应用说明及对应的示例。

? application对象用于在多个程序中保存信息,用来在多个程序中共享信息,并在Web应用程序运行

期间持久地保持数据。

? session对象用于分别保存每一个用户信息的对象,以便于跟踪用户的操作状态。注意,不同的用户

对应的session对象是不同的。

? request对象用于接收所有从浏览器发送到服务器的请求内的所有信息。 ? page对象代表JSP对象本身,或者说代表编译后的servlet对象。

? config对象用于配置处理JSP程序的句柄,而且只在JSP页面范围内合法。

第2章 XX

? exception对象代表JSP应用中的错误对象,只有在JSP页面的page指令中指定isErrorPage=true后,

才可以在本页面中使用exception对象。 ? out对象用于向客户端输出数据。

? respose对象的作用是处理HTTP连接信息,如cookie、HTTP文件头信息等,它有很多功能和reque

st对象相匹配。

? pageContext对象用于管理属于JSP中特殊可见部分中的已经命名对象的访问。它是JSP内置对象中

的集成者。

关键字

request response session

HttpRequest对象 HttpResponse对象 HttpSession对象 servletContext对象 PrintWriter对象 异常对象

application out

exception

复习题

1. JSP内置对象包括哪些,请列出所有的JSP内置对象。

2. JSP内置对象session,request,application这3者的的作用域由小到大排列顺序依次是:

A. session→request→application B. request→session→application C. application→session→request D. request→application→session

3. 对于每一个用户都共享同一个对象的是__对象,而每个用户分别使用不同对象实例的是__对象。 4. 内置对象page和pageContext有什么不同?

5. 想要得到一些系统初始化的配置信息,需要使用__内置对象。

第2章 XX

第2章 XX

第2章 EL表达式语言

本章学习目标

? 理解EL表达式存在的意义 ? 掌握EL表达式的基本用法 ? 掌握EL运算符的使用 ? 掌握11种EL隐式对象的用法

第2章 XX

简介

EL(Expression Language)的目的:为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。它是在JSP2.0推出的时候,引入的一项新技术。EL为存取变量,表达式运算和读取内置对象等内容提供了新的操作方式,并且可以自定义函数。

EL及其在JSP中的重要地位:EL表达式大大简化了在JSP代码页的java源码的使用,EL和JSTL标签结合使用的话将能够让页面尽可能的简洁,同时不再使用JSP脚本元素,这样就能使页面不在含有java源码。尽管EL表达式具有如此多的优点,但它仅仅是为网页作者量身定制的一种数据访问语言,可以方便访问和处理应用程序数据,但它并不是一种程序设计语言,不能替代JAVA语言的强大功能。

2.1 EL及其在JSP中的重要地位

在Web应用开发中,我们使用Servlet解析用户的请求,调用业务逻辑或数据访问代码,将得出的结果放入Bean中,然后将Bean出处在请求、会话或Servlet上下文中。最后,将请求转发给JSP页面,将结果呈现出来。

这种方式的不便之处在于最后的步骤,即在JSP页面中呈现结果。我们一般使用jsp:useBean和jsp:getProperty,但这些元素比较冗长笨拙。而使用JSP EL表达式可以将表示层简化,它允许我们使用更简短、更易读的项,如下所示:${exception}来取代难以维护的Java脚本元素。

尤其重要的是,EL表达式可满足如下需求: ? 要提供复杂的表达式的值 ? 访问jsp内置对象的属性 ? 访问一个任意java对象的性质 ? 调用javabean或其他java对象的方法

2.2 EL的基本用法

JSP EL主要使用“${”和“}”来包括所要操作的变量或者表达式,在JSP EL中也定义了它自己的运算符号,它的运算符号和Java语言一样,提供了逻辑运算,算术运算和关系运算等功能,而且提供了更加方便的读取JSP内置对象和Javabean对象属性值的方式。

代码: <%request.setAttribute(\翘楚\ 运算符 EL表达式 运算结果 第2章 XX

加法 \\${2+10} ${2+10} 读取变量 \\${requestScope.username} ${requestScope.username} 输出结果如图所示:

图9-1

2.3 EL的运算符

EL表达式支持进行四则运算,逻辑运算和关系运算

EL 运算符

第2章 XX

类型 算术型 逻辑型 关系型 条件型 空

定义

+,-,*,/,div,%,mod and,&&,or,||,!,not

==,eq,!=,ne,>,gt,<=,le,>=,ge,<,lt a?b:c Empty

算术型中的“div”与“/”都表示为除法,“%”与“mod”都表示为取余。

逻辑型中的“and”与“&&”都表示为与操作,“or”与“||”都表示为或得操作,“!”与“not”都表示为非得操作。

关系型运算符对布尔型,字符串,整数和浮点数进行比较。关系中的“==”与“eq”一样都表示为等于的操作,同样的道理,“!=”与“ne”表示不等,“<=”与“le”表示小于等于,“>=”与“ge”表示大于等于,“>”与“gt”表示大于,“<”与“lt”表示小于。empty操作符是前缀操作,用于判断值是否为空。

条件型运算符a?b:c表示根据a的值将表达式的值赋值为b或者c。 通过具体的实例演示EL表达式的用法,代码如下所示: 代码: <%request.setAttribute(\翘楚\ EL表达式 运算结果 \\${2.2+8.3} ${2.2+8.3} \\${10/3} ${10/3} \\${10 mod 3} ${10 mod 3} \\${10 >= 3} ${10 >= 3} 第2章 XX

\\${e lt h} ${e lt h} \\${100 ne 100} ${100 ne 100} <%pageContext.setAttribute(\ \\${(empty username)?\空\非空\ ${(empty username)?\空\非空\ 浏览器显示的结果如图所示:

图9-2

2.4 EL访问对象属性和集合

EL访问一个对象的属性时,要用到“. ”或“[ ]”操作符。当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]”,例如:${user.My-Name}应当改为${user[“My-Name”]}。

2.4.1 访问对象中的属性

我们可以首先声明一个类,并将类对象放到pageContext中,然后我们通过EL表达式取得该对象的相关

第2章 XX

属性。代码如下所示

代码:班级类(Classes) public class Classes { } private String className;//班级名 private int classPersons;//班级人数 public int getClassPersons() { return classPersons; } public void setClassPersons(int classPersons) { this.classPersons = classPersons; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } 代码:JSP页面的代码: <%@ page language=\ pageEncoding=\<%@ page import=\ EL表达式 <% Classes cla = new Classes(); cla.setClassName(\翘楚\ cla.setClassPersons(30); pageContext.setAttribute(\ %> 运算结果 班级名:${cla.className} 第2章 XX

班级人数:${cla.classPersons} 浏览器的显示效果如下图所示:

图9-3

2.4.2 访问集合中的属性

除了访问一般对象中的属性之外,我们还可以访问集合中的属性,象Map,list,字符串数组,对象数组等都可以通过EL表达式来进行访问。

1. 访问字符串数组,我们可以先构建一个字符串数组,将该数组放到request中,通过EL表达式取得

该数组并通过.导航到数组的每一个元素上。代码如下所示

代码: jstl表达式 <% //字符串数组 String[] strArray = new String[]{\request.setAttribute(\ %>

输出数组元素,采用[]和下标.
strarray[2]等于:${strarray[1]}

第2章 XX

浏览器结果如图所示:

图9-4

2. 访问list中的对象的属性,将上面的班级类放到list中,再通过EL表达式将班级对象的属性值取出

来。代码如下所示: 代码: EL表达式 <% List classlist = new ArrayList(); for (int i=1; i<6; i++) { Classes classes = new Classes(); classes.setClassName(\ classlist.add(classes); } request.setAttribute(\ %>

输出数组,采用[]和下标.
${classlist[0].className}

浏览器结果如图所示:

第2章 XX

图9-5

2.5 EL隐式对象

隐式对象就是用来为JSP编程提供方便,用EL编写的代码可以直接在JSP中使用无需其他显式编码或声明,在EL中一共提供了11个隐式对象供开发人员使用。

2.5.1 作用范围相关的对象

与作用范围相关的EL隐式对象有pageScope,requestScope,sessionScope与applicationScope。它们分别可以读取使用JSP内置对象pageContext,request,session与application的setAttribute()方法所设定的对象的数值,如果没有设定使用EL隐式对象的作用范围,则按照pageScope,requestScope,sessionScope,applicationScope的先后顺序读取属性值。如下例所示:

代码: EL表达式 <% pageContext.setAttribute(\刘备\ request.setAttribute(\关羽\ session.setAttribute(\张飞\ application.setAttribute(\赵云\ %> \\${pageScope.username} ${pageScope.username} \\${requestScope.username} ${requestScope.username} \\${sessionScope.username} 第2章 XX

${sessionScope.username} \\${applicationScope.username} ${applicationScope.username} \\${username} ${username} 浏览器结果如下图所示:

图9-6

2.5.2 param或paramValues对象

隐式对象param和paramValues用于获取客户端访问JSP页面时传递的请求参数的值,例如:${param.username}等价于<%=request.getParameter(“username”)%>;paramValues等价于request.getParameterValues(),可以获取传递的所有的参数名称和对应的参数值。同时使用[ ]符号来指定读取哪个数组元素,例如我们编写一个表单访问jstltest.jsp页面,代码如下所示:

代码: <%request.setCharacterEncoding(\ EL表达式

第2章 XX

${param.gender} ${paramValues.love[0]} 浏览器效果如下图所示:

第2章 XX

图9-7

2.5.3 header或headerValues对象

隐式对象header和headerValues用于获取客户端访问JSP页面时传递的请求头字段的值。header隐含对象返回一个请求头字段的单个值,如果同一个请求头字段有多个值,则返回第一个值。haderValues隐式对象用于返回一个请求头字段的所有值,返回结果为该请求头字段的所有值组成的字符串数值。

例如:${header[“User-Agent”]},headerValues则用来取得所有的头信息,等价于调用reques.getHeaders(),代码如下所示:

代码: EL表达式 输出结果 \\${header[\ ${header[\ \\${header[\ ${header[\ 浏览器结果如图所示:

第2章 XX

图9-8

2.5.4 cookie隐式对象

cookie隐式对象是一个代表所有Cookie信息的Map对象,其中Map对象中的各个元素的关键字分别为各个Cookie的名称,值则分别为Cookie名称对应的Cookie对象,使用cookie隐式对象可以访问某个Cookie名称对应的Cookie对象,例如在Cookie中设定了username属性值,可以使用${cookie.username.value}来取得属性值。代码如下所示:

代码: <%response.addCookie(new Cookie(\ EL表达式 输出结果 \\${cookie[\ ${cookie[\ 浏览器结果如图:

第2章 XX

图9-9

2.5.5 initParam对象

隐式对象initParam是一个代表Web应用程序中的所有初始化参数的Map对象,每个初始化参数的值是ServletContext.getInitParameter()方法返回的字符串。Web应用程序的初始化参数可以在server.xml或web.xml文件中指定,例如${initParam.repeat},等价于servletContext.getInitParameter(“repeat”),代码如下所示:

代码: EL表达式 输出结果 \\${initParam.repeat} ${initParam.repeat} 配置web.xml文件,向其中添加context-param参数 代码: repeat 10 浏览器结果如图所示:

第2章 XX

图9-10

2.5.6 忽略JSP页面的EL表达式

如果在JSP页面中使用了与JSP EL标识相冲突的其他技术,可以通过使用page指令的isELIgnored属性来忽略EL标识。代码如下所示:

代码: <%@ page isELIgnored=\${pageContext} 效果如图所示:

图9-11

本章小结

? EL表达式语言是一种简单的访问语言,基本语法格式为“$(表达式)”,当JSP引擎在解析JSP页面

的过程中遇到“${表达式}”这样的字符时,JSP引擎就会调用EL引擎来解释执行花括号中的表达式。

在EL表达式中可以直接使用属性名来引用存储在各种域范围(page,session,request,application)中的属性。

第2章 XX

在EL表达式中可以使用${customerBean.address.country}的形式来访问JavaBean对象汇总的属性对象中的属性,以及可以使用${user[0]}的形式来访问有序集合中的元素。 在EL表达式中可以执行基本的关系运算,逻辑运算和算术运算。

在EL表达式中可以使用一系列的隐式对象,如pageContext,cookie等。通过这些隐式对象,EL表达式可以访问JSP页面中的各种信息。

关键字

EL

EL表达式 参数 请求头 cookie对象 初始化参数

param header cookie

initParam

复习题

1. 请写出11种EL隐式对象,并简单阐述每个隐式对象的作用

2. 如果域中没有名称为user的属性,那当我们使用EL表达式${user}去取它的时候,网页上是现实null

值了?还是显示空字符串? 3. 如果在request域中存储了一个名为“error.info”的属性,在EL表达式中该如何访问这个属性的值了?

是用“${error.info}”? 还是用“${requestScope.erro.info}”?甚至两者都不是? 4. 如果在某个域中定义的属性名称正好等于某个EL隐式对象的名称,在EL引用这个名称时,EL引擎

是把它当做隐式对象了?还是返回域属性的值,例如: <%@ page contentType=\<% session.setAttribute(\ %> 输出表达式\\${pageContext}的值:
${pageContext}

第2章 XX

第3章 JSP内置对象

本章学习目标

? 知识点1 ? 知识点2 ? 知识点3

第2章 XX

简介

在第3章中,已经详细介绍了JSP的基本语法,使读者对JSP技术有一个比较初步的了解,但是应用第3章讲述的JSP知识只能编写一部分简单的程序,如果需要实现一些比较复杂高级的功能,例如网上购物、在线聊天室等,仅靠第3章介绍的知识是明显不够的。在JSP技术内部,已经定义好了若干个JSP内部对象,应用这些内部对象,可以实现很多很重要的功能。在JSP内部已经被定义完善的对象有:out对象、request对象、response对象、exception对象、config对象、page对象、pagecontext对象、application对象、session对象等。

3.1 作用域

本章首先介绍application、session、request、page 4个JSP内置对象的作用域,然后分别讨论各个内置对象的使用方法。

几乎所有的Web开发语言都支持Session功能,Servlet也不例外。Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的,作用域分为4种,如表4-1所示。 表4-1 JSP内置对象作用域表 名称 application session request page 作用域 在所有应用程序中有效 在当前会话中有效 在当前请求中有效 在当前页面有效 首先要声明一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。 Web交互的最基本单位为HTTP请求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。作用域解释如下。 l application:服务器启动到停止这段时间。 l session:HTTP会话开始到结束这段时间。 l request:HTTP请求开始到结束这段时间。 l page:当前页面从打开到关闭这段时间。 3.1.1 application 作用域

application作用域就是服务器启动到关闭的整段时间,在这个作用域内设置的信息可以被所有应用程序使用。application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示:

第2章 XX

l Object getAttribute(String name):从application中获取信息。

l void setAttribute(String name, Object value):向application作用域中设置信息。

3.1.2 session作用域

session作用域比较容易理解,同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。session是通过HttpSession接口实现的,它提供的主要方法如下所示。 l Object HttpSession.getAttribute(String name):从session中获取信息。

l void HttpSession.setAttribute(String name, Object value):向session中保存信息。 l HttpSession HttpServletRequest.getSessio():获取当前请求所在的session的对象。

session的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,但这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置: void setMaxInactiveInterval(int interval)

如果想主动让会话结束,例如用户单击“注销”按钮的时候,可以使用 HttpSession 的 invalidate()方法,用于强制结束当前session: void invalidate()

3.1.3 request作用域

一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。

Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的。

l void setAttribute(String name, Object value):将对象value以name为名称保存到request作用域中。 l Object getAttribute(String name):从request作用域中取得指定名字的信息。

JSP中的doGet()、doPost()方法的第一个参数就是HttpServletRequest对象,使用这个对象的 setAttribute()方法即可传递信息。

第2章 XX

那么在设置好信息之后,要通过何种方式将信息传给其他的Servlet呢?这就要用到RequestDispatcher接口的forward()方法,通过它将请求转发给其他Servlet。

l RequestDispatcher ServletContext.getRequestDispatcher(String path):取得Dispatcher以便转发。path为转发的目的Servlet。

l void RequestDispatcher.forward(ServletRequest request, ServletResponse response):将request和response转发。

因此,只需要在当前Servlet中先通过setAttribute()方法设置相应的属性,然后使用forward()方法进行跳转,最后在跳转到的Servlet中通过使用getAttribute()方法即可实现信息传递。

PHP的程序员可能不太好理解这一段,因为PHP中没有转发的概念,一个请求只能由一个PHP文件来处理,所以PHP中根本没有request作用域的概念。而Servlet则不同,请求可以在应用程序中任意转发,所以用request作用域在不同Servlet之间传递信息。

需要注意两点:

l 转发不是重定向,转发是在Web应用内部进行的。PHP支持重定向但没有转发。

l 转发对浏览器是透明的,也就是说,无论在服务器上如何转发,浏览器地址栏中显示的仍然是

最初那个Servlet的地址。

3.1.4 page作用域

page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。对page对象的引用通常存储在pageContext对象中。

以上介绍的作用范围越来越小,request和page的生命周期都是短暂的,它们之间的区别:一个request可以包含多个page页(include,forward及filter)。

为了让大家更容易理解application、session、request、page 4个对象的作用范围,我们给出程序4-1和4-2来进行详细说明。 【程序4-1】page1.jsp

01 <%@ page language=\import=\02 pageEncoding=\

03

本文来源:https://www.bwwdw.com/article/p8j7.html

Top