对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例 |
response | HttpServletResponse 接口的实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 HttpJspPage类的实例 |
exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
一.有关输入输出的jsp隐含对象 :
(1)request:对象表示客户端请求的内容(request对象包含所有请求的信息,如:请求的信息来源、标头、cookies和请求相关的参数值等等)
(2)response:对象表示响应客户端的结果
(3)out:对象负责把数据结果显示到客户端的浏览器
1.request:
对自定义属性的操作:
void setAttribute( String name, Object value) | 定义name属性的值为value |
Object getAttribute( String name ) | 取得name属性的值 |
Enumeriation getAttributeNames( ) | 取得该范围的属性 |
void removeAttribute ( Sting name) | 移除name属性的值 |
获取请求参数值:
String getParameter( String name) | 取得name的参数值 |
String[ ] getParameterValues( String name) | 取得所有name的参数值(多选框 时,取值用它,存为数组) |
Enumeriation getParameterNames( ) | 取得该范围的所有参数名称 |
Map getParameterMap() | 取得一个要求参数的Map |
其他使用方法:
setCharacterEncoding (String) | 在读取请求信息前先设置其编码方式 |
getCharacterEncoding() | 获得其编码方式 |
getContentType() | 返回客户端请求的对象类型 |
getContextPath() | 取得Context路径(站台名,绝对路径) |
String getMethod() | 取得http的方法(get/post) |
String getProtocal() | 取得所使用的协议(http1.0 / http1.1) |
String getRequestedSessionId() | 取得用户端的sessionID |
String getRemoteAdr() | 取得用户的IP地址 |
Cookie[ ] getCookies() | 取得与请求相关的cookies |
InetAddress获取主机的参数:
<%
InetAddress inet = InetAddress.getLocalHost();
%>
访问用户IP:<%=inet.getHostAddress()%><br>
访问用户主机名:<%=inet.getHostName()%><br>
获取URL:
协议://服务器名:端口号 项目根路径(/project)/
request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/"
2.response:
setCharacterEncoding (String) | 在回复请求前先设置其编码方式 |
getCharacterEncoding() | 获得其编码方式 |
setContentType() | 设置返回客户信息的对象类型 |
void addCookie(Cookie cookie) | 新增cookie |
void addDateHead(String name,long date) | 新增long类型值到name标头 |
void Header(String name,String value) | 新增String类型的值到name标头 |
String sendRedirect (String url) | 重定向到新的UTL |
转发(forward)与重定向(redirect)的区别:
1.转发可以通过request的setAttributeh和getAttribute实现属性数据共享,重定向不支持
2. 重定向可以在url路径后面拼接参数,转发不可以
3. 转发是服务器端的操作,而重定向则是浏览器端的操作,最直观的效果就是 转发url路径不会发生变化,请求则会发生变化,重定向url路径变化
转发过程
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完
之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务
器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的
所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,
getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
重定向过程
客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了
sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到
response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访
问student_list.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里
两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得
不了。可见,在sendRedirect()里面是两个请求,两个响应。
总结
转发在服务器端完成的;重定向是在客户端完成的
转发的速度快;重定向速度慢
转发的是同一次请求;重定向是两次不同请求
转发不会执行转发后的代码;重定向会执行重定向之后的代码
转发地址栏没有变化;重定向地址栏有变化
转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
(注意:一般的超链接是get请求,也是重定向)
根据response对象中的setContentType()方法来动态设定响应给客户的文件类型(很多都要写Java代码,)
MIME类型 | 文件类型 | 后缀 |
Application/pdf | PDF文件 | |
Application/msword | Word文档 | .doc |
Application/x-msexcel | Excel表格文件 | .xls |
Image/Gif | GIF图片 | .gif |
Image/Jpg | JPG图片 | .jpg |
Text/Html | HTML超文本文件 | .html |
Text/Plain | Plain文本 | .tx |
1、通过response.setIntHeader(“Refresh”,180)让页面自己每隔3分钟 自动刷新。
2、通过response.setHeader(“refresh”,“10;URL=http://www.sina.com”) 让页面过10秒钟后自动重定向到新的页面
3.out:
out是javax.servlet.JspWriter类的一个实例。
|
二.与Context有关的隐含对象:
共有三种:
session:对象提供一些机制,让服务器能个别辨认用户
application:当程序运行时,application对象能提供服务器的context,说明那些 资源是可利用的,那些资源是可获取的。
pageContext:该对象提供存取所有在此网页中可被利用的隐含对象,并且可以管理 他们的属性。(了解)
三个对象实例都有的方法:
void setAttribute( String name, Object value) | 定义name属性的值为value |
Object getAttribute( String name ) | 取得name属性的值 |
1.Session:
session对象用来保存每个用户的会话信息,以便跟踪每个用户的操 作状态。从一个客户打开浏览器并连接到服务器开始,一直到这个客 户关闭浏览器为一个回话。
当客户第一次连接到服务器请求时会为这个客户分配一个session对 象,并为这个对象分配一个id。session信息保存在容器中, sessionID保存在客户机的cookie中
当服务器发出回复内容的同时将这个id发往客户段,并写入到客户端 的cookie中,这样下次再请求的时候,服务器就可以通过该id来识别 不同的用户。
通过session对象实现跨页面的信息共享。
Session对象实现javax.servlet.http.HttpSession接口,提供如下方法:
方法 | 说明 |
long getCreationTime() | 取得session产生的时间,单位是毫秒,由1970年1月1 日零时算起 |
String getID() | 取得session的ID |
long getLastAccessedTime() | 取得用户最后通过这个session送出请求的时间,单位是 毫秒,由1970年1月1日零时算起 |
long getMaxInactiveInterval() | 取得最大session不活动的时间,若超过这个时间,session将会失 效,单位为毫秒 |
void invalidate() | 取消session对象,并将对象存放的内容完全抛 弃 |
boolean isNew() | 判断是否为新session,产生但客户端还未使用过 |
void setMaxInactiveInterval( int interval) | 设定最大session不活动时间,若超过这个时 间,session将会失效,单位为毫秒 |
Session对象也可以存储或取得用户相关的数据。例如:用户的名称,用户所 订购的物品、用户的权限等等。
只有设置<%@page session=“true”%>前JSP页面才能使用session隐 含对象,默认为true;
例如:我们设定某些网页必须要求用户先登陆的动作,确定用户是合法用 户的时候才允许读取网页内容,否则把网页重新定向到登陆的网页上。
使一个会话结束的两种方法:
1、在web.xml文件中设置他的最大活动时间(tomcat/conf/web.xml)
<!--设置 session 的过期时间,单位是分钟;-- >
<session-config>
<session-timeout>30</session-timeout>
</session-config>
当你没对网站做任何的操作,时间超过30分钟没,session对象自动销毁
2、在JSP中通过session.invalidate()方法直接关闭一个会话
2.application:
Application对象是以服务器为主角,服务器的启动和关 闭决 定 了 application的生命周期。
服务器启动后会创建该服务器下的web应用程序,同时为此web应用程序新 建一个application对象,它将一直存在,直到服务器关闭。
当有用户请求web应用下的某个JSP页面时,JSP容器为该请求启动一个线程,并分配这个application对象;每个请求都共享这个application对象。
Application对象实现javax.servlet.ServletContext接口,它主要功用在于 取得或更改Servlet的设定。
一个JSP被编译成Servlet时,applicate对象是如何初始化的:
pageContext = JspFactory.getPageContext(this,request,response,”errorpage.jsp”,true,8192,true); application = pageContext.getServletContext();
参数说明:
this:该servlet对象本身
true:是否需要session对象
8192:最大缓冲大小,单位字节
true:是否自动清楚缓冲区
Javax.servlet.ServletContext接口容器相关信息的方法:
方法 | 说明 |
int getMajorVersion( ) | 取得JSP容器主要的servlet api版本,如:2 |
int getMinorVersion( ) | 取得JSP容器次要的servlet api版本,如:4 |
String getServerInfo( ) | 取得JSP容器的名称和版本 |
<%= application.getMajorVersion()%>
<%= application.getMinorVersion()%>
<%= application.getServerInfo%>
三.exception:
当JSP网页有错误产生异常的时候调用该对象进行处理,和session对象一样,只有当<%@page isErrorPage=“true”%>的 时候才能使用该对象。
<%@ page isErrorPage="true" %>
<html>
<head>
<title>Show Error Page</title>
</head>
<body>
<h1>Opps...</h1>
<p>Sorry, an error occurred.</p>
<p>Here is the exception stack trace: </p>
<pre>
<% exception.printStackTrace(response.getWriter()); %>