JSP学习笔记(二)
JSP内置对象
9个内置对象及其应用场合如下。
(1)request对象该对象封装了客户端提交的HTTP请求信息,适用于处理客户端提交的信息,在开发Web应用时经常应用request对象获取请求参数的值和获取Cooike数据等。
(2)response对象该对象适用于响应客户端请求信息,在开发Web应用时经常应用response对象重定向网页、设置HTTP响应报头和缓冲区配置等。
(3)session对象该对象适用于在同一个应用程序中每个客户端的各个页面中共享数据,session对象通常应用在保存用户/管理员信息和购物车信息等。
(4)application对象该对象适用于在同一个应用程序中各个用户间共享数据,application对象通常应用在计数器或是聊天室中。
(5)out对象该对象适用于向客户端输出各种类型的数据,通常用来在JSP页面中输出文本。
(6)page对象该对象适用于操作JSP页面自身,在开发Web应用时很少应用。
(7)config对象该对象适用于读取服务器的配置信息。
(8)exception对象该对象适用于操作JSP文件执行时发生的异常信息。
(9)pageContext对象该对象适用于获取JSP页面的request、response、session、application和out等对象。由于这些对象均为JSP的内置对象,所以在实例Web应用开发时很少使用pageContext对象,而是直接使用相应的内置对象。
request请求对象
request对象封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息、请求方式和请求参数等,通过该对象提供的相应方法可以获取客户端请求之中的信息。
获取请求参数
客户端向服务器端发送一个请求时,通常情况下会包含一些请求参数。如请求删除数据库中的一条信息时,需要在请求之中传递一个主键值,在传递的过程中其参数加载在reqeust对象中。
当通过超链接的形式发送请求时可以为该请求传递参数,可以通过在超链接的后面加上问号“? ”来实现,注意这个问号为英文半角。例如,发送一个请求到delete.jsp页面并传递一个名为“id”的参数,可以通过以下超链接实现:
1 | <a href="delete.jsp? id=1">删除</a> |
在通过问号“? ”指定请求参数时,参数值不需要使用单引号或双引号括起,包括字符型的参数。如果同时指定多个参数,各参数间使用与符号“&”分隔。
在delete.jsp页面中可以通过request对象的getParameter()方法获取传递的参数值,代码如下:
1 | <% String id=request.getParameter("id"); %> |
解决中文乱码问题
在通过request对象获取请求参数时,如果参数值为中文且未处理,则获取的参数值将是乱码。在JSP中解决获取请求参数中文乱码可以分为以下两种情况。
(1)获取访问请求参数时乱码
当访问请求参数为中文时通过request对象获取的中文参数值为乱码,这是因为该请求参数采用的ISO-8859-1编码不支持中文。所以只有将获取的数据通过String的构造方法使用UTF-8或GBK编码重新构造一个String对象方可正确显示中文。例如,在获取包括中文信息的参数user时可以使用下面的代码:
1 | String user=new String(request,getParameter("user").getBytes("iso-6695-1"),"UTF-8"); |
(2)获取表单提交的信息乱码
当获取表单提交的信息时,通过request对象获取的中文参数值为乱码,可以通过在page指令的下方加上调用request对象的setCharacterEncoding()方法将编码设置为UTF-8或GBK解决。例如,在获取包括中文信息的用户名文本框(name属性为username)的值时,可以在获取全部表单信息前加上下面的代码:
1 | <% request.setCharacterEncoding("UTF-8"); %> |
这样通过下面的代码获取表单的值时,就不会产生中文乱码:
1 | String user=request.getParameter("username"); |
获取客户端数据
通过request对象可以获取客户端的相关信息,如HTTP报头信息、客户信息提交方式,客户端主机IP地址及端口号等。在客户端获取用户请求相关信息的request对象的常用方法如表1所示。
应用request对象域
request对象可以视为一个域,可以应用setAttribute()方法在域范围内存放数据,其语法格式如下:
1 | request.setAttribute(String name,Object object); |
(1)name:变量名,为String类型,转发后的页面获取数据时通过这个变量名来获取数据。
(2)object:指定需要在request范围内传递的数据,为Object类型。
在将数据保存在request范围内的变量中后,可以通过request对象的getAttribute()方法获取该变量值,其语法格式如下:
1 | request.getAttribute(String name); |
name为变量名,在request范围内有效。
response响应对象
response对象用于响应客户请求并向客户端输出信息,它封装了JSP产生的响应,并发送到客户端以响应客户端的请求。请求的数据可以是多种数据类型,甚至是文件。response对象在JSP页面内有效。
操作HTTP头信息
通过response对象可以设置HTTP响应报头,其中常用的是设置响应的内容类型、禁用缓存、设置页面自动刷新和定时跳转网页。
(1)禁用缓存
在默认情况下,浏览器会缓存显示的网页内容。这样当用户再次访问相的的网页时,浏览器会判断网页是否有变化。如果没有变化,则直接显示缓存中的内容,这样可以提高网页的显示速度。对于一些安全性要求较高的网站,通常需要禁用缓存。通过设置HTTP头的方法实现禁用缓存可以通过以下代码实现:
1 | <% response.setHeader("Cache-Control","no-store"); |
(2)设置页面自动刷新
通过设置HTTP头可以实现页面的自动刷新,如让网页每隔10秒自动刷新一次可以使用下面的代码:
1 | <% response.setHeader("refresh","10"); %> |
(3)定时跳转网页
通过设置HTTP头可以实现定时跳转网页的功能,如让网页5秒钟后自动跳转到指定的页面,可以使用下面的代码:
1 | <% response.setHeader("refresh","5;URL=login.jsp"); %> |
设置MIME类型
在默认情况下,一个JSP页面采用的内容类型是text/html,即HTML或文本数据。此值并不是固定的,可以根据开发需要动态更改响应类型,更改方式是通过response对象提供的setContentType()方法设置,在设置之后即可让网页内容以不同的格式输出到浏览器中。
setContentType()方法的语法格式如下:
1 | response.setContentType(String type); |
type用于指定响应的内容类型,可选值为text/html、text/plain、application/x_msexcel和application/msword等。
实现页面重定向
使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面,重定向操作支持将地址重定向到不同的主机上,这一点与转发不同。在客户端浏览器上将会得到跳转的地址,并重新发送请求链接,用户可以从浏览器的地址栏中看到跳转后的地址。执行重定向操作后request中的属性全部失效,并且开始一个新的request对象。
sendRedirect()方法的语法格式如下:
1 | response.setRedirect(String path); |
path指定目标路径,可以是相对路径,也可以是不同主机的其他URL地址。
out输出对象
JSP通过out对象向客户端浏览器输出信息,并且管理应用服务器上的输出缓冲区。在使用该对象输出数据时,可以操作数据缓冲区。并及时清除缓冲区中的残余数据,为其他输出让出缓冲空间。数据输出后要及时关闭输出流。
向客户端输出数据
out对象的一个基本应用是向客户端浏览器输出信息,该对象可以输出多种数据类型的数据,在输出非字符串类型的数据时会自动转换为字符串输出。out对象提供了如下两种输出信息的方法。
(1)print()方法
print()方法向客户端浏览器输出信息,通过该方法输出的信息与使用JSP表达式输出的信息相同。
(2)println()方法
println()方法向客户端浏览器输出信息,并在输出内容后输出一个换行符。
管理缓冲区
out对象不仅可以向JSP页面中输出内容,而且还可以管理页面中的缓冲区,如清理缓冲区、刷新缓冲区及获取缓冲区大小等。使用对象提供的管理缓冲区的方法如表2所示。
session会话对象
由于HTTP协议是一种无状态协议,即当一个客户向服务器发出请求时服务器接收请求。并且返回响应后该连接结束了而服务器并不保存相关的信息。为了弥补这一不足,HTTP协议提供了session会话。
session作用于同一浏览器中,在各个页面中共享数据。无论当前浏览器是否在多个页面间执行了跳转操作,整个用户会话一直存在,直到关闭浏览器。
如果在一个会话中客户端长时间不向服务器发出请求,session对象就会自动消失,这个时间取决于服务器。例如,Tomcat服务器默认为30分钟,这个时间可以通过编写程序修改。
实际上,一次会话的过程也可以理解为一个打电话的过程。通话从拿起电话或手机拨号开始,一直到挂断电话结束。
创建与获取会话
通过session对象可以保存或读取客户相关的信息,如用户名或购物信息等,可以通过session对象的setAttribute()和getAttribute()方法实现。
(1)setAttzribute()方法
该方法将信息保存在session范围内,其语法格式如下:
1 | session.setAttribute(String name,Object object); |
name:指定作用域在session范围内的变量名。
obj:保存在session范围内的对象。
(2)getAttribute()方法
该方法获取保存在session范围内的信息,其语法格式如下:
1 | getAttribute(String name); |
name指定保存在session范围内的关键字。
getAttribute()方法的返回值是Object类型,如果需要将获取的信息赋值给String类型的变量,需要执行强制类型转或是调用其toString()方法。
移除对话中的数据
对于保存在session会话中的对象,如果需将其从session会话中移除,可以使用session对象的removeAttribute()方法,其语法格式如下:
1 | removeAttribute(String name); |
name指定作用域在session范围内的变量名,一定要保证该变量在session范围内有效;否则将抛出异常。
设置会话的有效时间
当用户访问网站时会产生一个新的会话,这个会话可以记录用户的状态,但是它并不是永久存在的。如果在一个会话中,客户端长时间不向服务器发出请求,这个会话将被自动消毁。这个时间取决于服务器,如Tomcat服务器默认为30分钟。不过session对象提供了一个设置session有效时间的方法setMaxInactiveInterval(),该方法的语法格式如下:
1 | session.setMaxInactiveInterval(int time); |
time指定有效时间,单位为秒。如要指定有效时间为一小时,可以指定为3600。
在操作session时,有时需要获取最后一次与会话相关联的请求时间和两个请求的最大时间间隔,可以通过session对象提供的getLastAccessedTime()和getMaxInactiveInterval()方法实现。其中getLastAccessedTime()方法可以返回客户端最后一次与会话相关联的请求时间;getMaxInactiveInterval()方法返回一个会话内两个请求最大时间间隔,以秒为单位。
虽然当客户端长时间不向服务器发送请求后,session对象会自动消失。但对于某些实时统计在线人数的网站(如聊天室),每次在session过期后才能统计出准确的人数。这是远远不够的,所以还需要手动的销毁session。通过session对象的invalidate()方法可以销毁session,其语法格式如下:
1 | session.invalidate(); |
session对象被销毁后,将不可使用。如果在销毁后调用其任何方法,则抛出“Session already invalidated”异常。
应用application对象
application对象用于保存所有应用程序中的公有数据,与session对象相比,其生命周期更长,类似系统的“全局变量”。
application对象的生命周期
application对象在服务器启动时自动创建,在服务器停止时销毁。当application对象没有被销毁时,所有用户都可以共享它。它适用于在同一个应用程序中的各个用户共享数据。
操作application对象中数据
通过application对象可以保存、读取或移除应用程序环境属性,如网站访问次数和聊天信息等。应用程序环境属性在application范围内有效,管理应用程序环境属性的方法如下。
(1)setAttribute()方法
setAttribute()方法用于保存在application范围内有效的应用程序环境属性,其语法格式如下:
1 | application.setAttribute(String name,Object obj); |
name:指定应用程序环境属性的名称。
obj:属性值,可以是任何Java数据类型。
(2)getAttributeNames()方法
getAttributeNames()方法用于获得所有application对象使用的属性名,其语法格式如下:
1 | application.getAttributeNames(); |
(3)getAttribute()方法
getAttribute()方法用于获取指定属性的属性值,其语法格式如下:
1 | application.getAttribute(String name); |
name指定属性名,该属性名在application范围内有效。
(4)removeAttribute()方法
removeAttribute()方法用于从application对象中移除指定名称的属性,其语法格式如下:
1 | removeAttribute(String name); |
name指定属性名,该属性名在application范围内有效;否则将抛出异常。
配置Web应用的初始化参数
application对象提供了访问应用程序初始化参数访问的方法,该参数在web.xml文件中设置。web.xml文件位于Web应用所在目录下的WEB-INF子目录中,在该文件中通过
1 | <context-param> |
application对象提供了如下两种访问应用程序初始化参数的方法。
(1)getInitParameter()方法
该方法用于返回一下已命名的参数值,其语法格式如下:
1 | application.getInitParameter(String name); |
name指定参数名。
(2)getAttributeNames()方法
该方法用于返回所有已定义的应用程序初始化参数名的枚举。
1 | application.getAttributeNames(); |
其他内置对象
应答与请求的page对象
page对象代表JSP本身,只在JSP页面内才是合法的。该对象本质上是包含当前Servlet接口引用的变量,可以看做是this关键字的别名。page对象的常用方法如表3所示。
页面上下文的pageContext对象
获取页面上下文的pageContext对象是一个比较特殊的对象,通过它可以获取JSP页面的request、response、session、application及exception等对象。该对象的创建和初始化均由容器来完成,在JSP页面中可以直接使用pageContext对象,其常用方法如表4所示。
pageContext对象在实际JSP开发过程中很少使用,因为request和response等对象均为内置对象,并且都可以直接调用其相关方法实现具体的功能,如果通过pageContext来调用这些对象,则比较麻烦。
获取web.xml配置信息的config对象
config对象主要用于取得服务器的配置信息,通过pageContext对象的getServletConfig()方法可以获取一个config对象。当初始化一个Servlet时,容器把某些信息通过config对象传递给这个Servlet。开发人员可以在web.xml文件中为应用程序环境中的servlet程序和JSP页面提供初始化参数。config对象的常用方法如表5所示。
获取异常信息的exception对象
exception对象用来处理JSP文件执行时发生的所有错误和异常,只有在page指令中设置为isErrorPage属性值为true的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。该对象几乎定义了所有异常情况,在Java程序中可以使用try…catch关键字来处理异常情况。如果在JSP页面中出现没有捕捉到的异常,则会生成exception对象。并将其传送到在page指令中设置的错误页面中,然后在错误页面中处理相应的exception对象。exception对象的常用方法如表6所示。