(一)什么是JSP内置对象
指在JSP页面中内置的不需要定义就可以在网页中直接使用的对象
内置对象预定义的原因:
JSP 程序员一般情况下使用这些内置对象的频率比较高。
内置对象的特点:
内置对象是自动载入的,因此它不需要直接实例化;
内置对象是通过 Web 容器来实现和管理的;
在所有的 JSP 页面中,直接调用内置对象都是合法的。
(二)九大内置对象
(1)输入/输出相关
request:负责得到客户端的请求信息
response :负责向客户端发出响应
out:负责管理对客户端的输出
(2)上下文相关
session :表示浏览器与服务器会话的上下文环境
application:表示应用程序的上下文环境
pageContext :表示的是此 JSP 的上下文
(3)Servlet相关
page :表示当前 JSP 页面本身,即this
config :表示此 JSP 的 ServletConfig
(4)Error相关
exception:表示页面上发生的异常
(5)补充一个
Cookies操作
(三)详细介绍
1、request对象
类型:javax.servlet.http.HttpServletRequest
request对象获取客户端基本信息的方法:
String getProtocol()
String getServerName()
String getServerPort()
String getRemoteAddr()
String getMethod()
String getRequestURL()
String getRequestURI()
String getQueryString()
String getServletPath()
request对象获取客户端参数的方法
String getParameter(String name):
String[] getParameterValues(String name)
Enumeration getParameterNames()
使用request对象获取客户端提交的信息
String name = request.getParameter("userName");
使用request对象存取数据
void setAttribute(String key, Object obj):
将参数obj指定的对象保存到request对象中,key为所保存的对象指定一个关键字。
Object getAttribute(String key):
获取请求域(如:forward转发)中的关键字为key的对象(属性值)。
注意:
1.request、session、application等对象均具有“容器”功能,即可以在其中“存入对象”,也可以“取出对象”;
2.解决request中的中文乱码问题request.setCharacterEncoding("UTF-8");
2、response对象
重定向发生在客户端、地址栏不变、数据共享(一次跳转)、两次跳转数据不共享
类型:javax.servlet.http.HttpServletResponse
response对象常用方法
重定向:response.sendRedirect(String url)
动态改变contentType属性值:response.setContentType(String s)
设置HTTP头: response.setHeader(String name,String value)
response的重定向方法
格式:response.sendRedirect(目标页面路径);
功能:跳转到另一个页面,可以是任意页面
如,response.sendRedirect("loginSuccess.jsp");
动态改变contentType的值
格式:response.setContentType(String s)
功能:重新设置contentType的属性值,使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
注意:请求转发与重定向跳转的比较
浏览器地址:forward 地址不变;redirect 地址改变
数据共享:forward 能够共享 ;redirect 不能共享
效率:forward效率较高;redirect效率相对较低
功能:forward 方法只能在同一个 Web 应用程序内的资源之间转发请求;redirect 能够重定向到任何资源
跳转语句后面代码的执行情况:执行到forward标记停止后面代码的执行,重定向是在所有代码执行完毕之后跳转
3、设置响应表头
格式:response.setHeader(String name,String value)
功能:设置指定名字的HTTP文件头值,以此来操作HTTP文件头。
示 例://每3秒钟刷新一次页面
response.setHeader("refresh","3");
//页面3秒后跳到another.jsp文件
response.setHeader("refresh","3;url=another.jsp");
4、Cookie技术
是Web服务器发送给客户端的一段文本信息,它保存在客户端的硬盘上,对于后续请求,客户端将文本信息发送回给同一服务器。简单地说,Cookie是暂存于客户端的信息(以name=value形式)
Cookie工作原理
- 是一小段文本数据(以name=value形式),由服务器端生成,发送给客户端浏览器;
- 如果客户端浏览器允许使用Cookie,则会将这段文本保存在客户端硬盘的某一个目录下的文本文件内;
- 当客户端请求时,浏览器会读取保存在硬盘上Cookie信息,传送到服务器,服务器就能获取相关信息;若服务器执行Cookie写入操作,也是通过客户端浏览器来增加、修改、删除Cookie;
- 除了sessionID外,Cookie还能保存其它信息。
1、Cookie编程
创建Cookie对象
格式:Cookie 对象名=new Cookie(“Cookie名称”,”值”);
2、设置Cookie对象的属性
Cookie 常用API:
void setMaxAge(int expiry) :设置Cookie最大保存时间(秒)
expiry>0,Cookie将会被保存在客户端的硬盘上;
expiry<0数(默认值-1),客户端浏览器关闭时,Cookie被删除;
expiry=0,Cookie被删除。
例如:c.setMaxAge(365*24*3600);//设置存活期为1年
3、发送Cookie到客户端
格式:response.addCookie(Cookie c)
将Cookie写到客户端
<%
//1. 实例化两个Cookie
Cookie cookie1 = new Cookie("account","sa");
Cookie cookie2 = new Cookie (“text”,URLEncoder.encode(“2020奥运会","utf-8"));
//2. 设置Cookie的生命期限,分别为2、10分钟
cookie1.setMaxAge(120);
cookie2.setMaxAge(600);
//3. 添加Cookie到客户端
response.addCookie(cookie1);
response.addCookie(cookie2);
%>
4、 从客户端读取Cookie
从客户端读取你感兴趣的cookie,需要两个步骤:
调用request.getCookies()得到一个Cookie对象的数组;
调用每个cookie的getName方法,从数组中寻找所需的Cookie,再调用getValue()方法得到值。
<%
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
String cN = cookies[i].getName();
String cV = cookies[i].getValue();
out.print("Cookie名称:"+cN+","+"Cookie值 "+cV+"<br>");
}
%>
修改后的readCookie2.jsp主要代码:
<%
Cookie[] cookies = request.getCookies();
for (int i = 0; i < cookies.length; i++) {
String cName = cookies[i].getName();
if (cName.equals("text")) {
String cValue = URLDecoder.decode(cookies[i].getValue(), "utf-8");
out.print("Cookie名称:" + cName + "," + "Cookie值 " + cValue + "<br>");
}
}
%>
Cookie常用场合
记录用户名和用户密码,允许用户下次自动登录;
定制站点,记录用户的偏好;
定向广告,记录用户感兴趣的主题,并显示与之相关的广告。
Cookie不足之处
Cookie并不是绝对安全的,信息容易泄露。
目前Cookie盗取的方法:
1) 利用跨站脚本技术 ,将信息发送给目标服务器;
2) 通过某些软件盗取硬盘下的Cookie。
3、out对象
类型:javax.servlet.jsp.JspWriter
作用: 用来向客户端输出各种数据类型的内容
对应用服务器上的输出缓冲区进行管理
out 输出主要有 2 个方法: void print() void println()
out 对象管理缓冲区常用方法
void close();
void clearBuffer();
void clear();
int getRemaining();
int getBufferSize();
void flush();
4、session对象
(1)会话 :在指定的时间段中来自同一客户端的一系列HTTP请求。
如果客户端能在规定时间内不断向服务器提出请求,这些请求就属于同一会话;会话从客户端连到服务器的一个Web应用程序开始,直到客户端与服务器端断开为止。
JSP中的内置对象session就是进行会话管理对象。
(2)sessionID
类型:javax.servlet.http.HttpSession
问:客户在访问多个页面时,多个页面用到 session,服务器如何知道该客户的多个页面使用的是同一个 session?
答:每个 session,服务器端都有一个 sessionID来标识; 获取sessionID 的方法:String session.getId();。
(3)使用session存取数据
通过session对象设置属性、获取属性,可设置、获取会话信息
void setAttribute(String name, Object obj) :设置属性
Object getAttribute(String name) :获取属性
Enumeration getAttributeNames() :获取属性名(多个)
void removeAttribute(String name) :删除指定属性
(4)session对象其他API
long getCreationTime():返回session被创建的时间(自1970.1.1 GMT算起),单位毫秒
long getLastAccessedTime() :返回session最后被客户发送的时间,计算方法同getCreateTime()
boolean isNew() :如果客户端不知道这个会话或没有选择加入这个会话,返回值为true
void invalidate() :强制会话失效,在用户注销时常使用
void setMaxInactiveInterval(int interval) :设置会话最长的空闲时间(单位为秒),超时将失效
int getMaxInactiveInterval() :获取会话最长空闲时间
(5)会话结束条件(session对象的生命周期)
会话过期:空闲时间超过指定期限(如:30分钟)
强制失效:服务器的session对象调用invalidate()方法(在用户注销时常使用)
客户关闭浏览器:不够准确,浏览器关闭时将丢失保存在内存的sessionID,无法继续与服务器联系,只有会话过期才真正结束。
在web.xml中配置session的最长空闲时间 :
<session-config>
<session-timeout>整数(负数永不过期,单位:分钟)</session-timeout>
</session-config>
5、application对象
类型:javax.servlet.ServletContext
基本功能:同一个应用程序的所有页面共享其中的数据
原理:对于一个 Web 容器而言,所有的用户都共同使用一个 application 对象,服务器启动后,就会自动创建 application 对象,这个对象会一直保存,直到服务器关闭为止。
比较application与session不同
application 对象常用API
对象 | 类型 | 作用范围 |
pageContext | javax.servlet.jsp.PageContext | 页面范围 |
request | javax.servlet.http.HttpServletRequest | 请求范围 |
session | javax.servlet.http.HttpSession | 会话范围 |
application | javax.servlet.ServletContext | 应用上下文范围 |
6、pageContext对象
类型:javax.servlet.jsp.PageContext
作用:它代表当前JSP页面的运行环境,可以获取JSP的另外八个隐式对象。获取其他隐式对象的方法如下表:
pageContext对象不仅提供了获取隐式对象的方法,还提供了存储数据的功能。具体如下:
pageContext对象存取属性的方法
pageContext对象的作用范围有四个值,具体如下:
pageContext.PAGE_SCOPE:表示页面范围
pageContext.REQUEST_SCOPE:表示请求范围
pageContext.SESSION_SCOPE:表示会话范围
pageContext.APPLICATION_SCOPE:表示Web应用程序范围
7、其他内置对象
page对象是一个与Servlet有关的内置对象,它表示JSP文件转译后的Servlet对象,代表JSP页面本身即this。因此它可以调用Servlet类所定义的方法。
config对象即页面配置对象,表示当前JSP页面转译后的Servlet的ServletConfig对象,存储着一些初始数据。
exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。
(四)JSP的四种作用域