JSP中的九个内置对象
No. | 内置对象 | 类型 | 描述 |
---|---|---|---|
1 | pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
2 | request | javax.servlet.http.HttpServletRequest | 得到用户的请求信息 |
3 | response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
4 | session | javax.servlet.http.HttpSession | 用来保存每一个用户的信息 |
5 | application | javax.servlet.ServletContext | 表示所有用户的共享信息 |
6 | config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
7 | out | javax.servlet.jsp.JspWriter | 页面输出 |
8 | page | java.lang.Object | 表示从该页面中表示出来的一个Servlet实例 |
9 | exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
四种属性范围:
pageContext:只在一个页面中保存属性,跳转之后无效。
request:只在一次请求中保存,服务器跳转后依然有效。
session:在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用。
application:在整个服务器上保存,所有用户都可以使用
属性操作方法
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public void setAttribute(String name,Object o) | 普通 | 设置属性的名称及内容 |
2 | public Object getAttribute(String name) | 普通 | 根据属性名称取得属性 |
3 | public void removeAttribute(String name) | 普通 | 删除指定的属性 |
page属性范围(pageContext范围)
page属性范围(使用pageContext表示,但是一般来讲都习惯于将这种范围称为page范围)表示将一个属性设置在本页上,跳转之后无法取得
request属性范围
如果要在服务器跳转之后属性可以继续保存下来,则可以使用request属性范围操作,request属性范围表示的是在服务器跳转之后,所有设置的内容依然会被保留下来
关于request属性范围的理解
request表示的是客户端的请求,正常情况下,一次请求服务器只会给予一次回应,那么这个时候如果是服务器端跳转,请求的地址栏没有改变,所以也就相当于回应了一次,而如果地址栏改变了,就相当于是发出了第二次请求,则第一次请求的内容肯定就已经消失了,所以无法取得。
session属性范围
如果现在希望一个属性设置之后,可以在任何一个与设置页面相关的页面中取得的话,则就可以使用session属性范围,使用session设置属性之后,不管是客户端跳转还是服务器端跳转,只要属性设置了就都可以取得
application属性范围
如果现在希望设置一个属性,可以让所有的用户(每一个session)都能看得见的话,则可以将属性范围设置成application,这样属性就保存在了服务器之上。
深入研究page属性范围
之前研究过的page属性范围中使用的是pageContext进行属性设置的,但是从javax.servlet.jsp.PageContext类中可以发现,有以下的一种设置属性的方法
public void setAttribute(String name,Object value,int scope)
在PageContext类中存在四个表示属性范围的常量,可以直接通过这些常量指定scope的内容:
public static final int PAGE_SCOPE
public static final int REQUEST_SCOPE
public static final int SESSION_SCOPE
public static final int APPLICATION_SCOPE
request内置对象
request内置对象是使用最多的一个对象了,其主要作用是用来接收客户端发送而来的请求信息,例如:请求的参数、发送的头信息等都属于客户端发来的信息,request是javax.servlet.http.HttpServletRequest接口的实例化对象,表示此对象主要是应用在HTTP协议上
对应接口:public interface HttpServletRequest extends ServletRequest
request内置对象的常用操作
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public String getParameter(String name) | 普通 | 接收客户端发来的请求参数内容 |
2 | public String[] getParameterValues(String name) | 普通 | 取得客户端发来的一组请求参数内容 |
3 | public Enumeration getParameterNames() | 普通 | 取得全部请求参数的名称 |
4 | public String getRemoteAddr() | 普通 | 得到客户端的IP地址 |
5 | void setCharacterEncoding(String env) throws UnsupportedEncodingException | 普通 | 设置统一的请求编码 |
6 | public boolean isUserInRole(String role) | 普通 | 进行用户身份的验证 |
7 | public Httpsession getSession() | 普通 | 取得当前的session对象 |
8 | public StringBuffer getRequestURL() | 普通 | 返回正在请求的路径 |
9 | public Enumeration getHeaderNames() | 普通 | 取得全部请求的头信息的名称 |
10 | public String getHeader(String name) | 普通 | 根据名称取得头信息的内容 |
11 | public String getMethod() | 普通 | 取得用户的提交方式 |
12 | public String getServletPath() | 普通 | 取得访问的路径 |
13 | public String getContextPath() | 普通 | 取得上下文资源路径 |
request.setCharacterEncoding("GBK") ;
接收请求参数
equest内置对象中的getParameter()方法可以接收一个表单的文本框中输入的内容,如果有一组参数(同名参数)传递的话,则就必须使用getParameterValues()方法进行接收。
接收全部请求参数的名称
在request内置对象中还有一个灵活的方法就是getParameterNames(),本方法可以返回所有请求参数的名称,但是此方法返回值的类型是Enumeration,所以需要使用hasMoreElements()方法判断是否有内容以及使用nextElement()方法取出内容。
显示全部的头信息
JAVA的WEB开发使用的是HTTP协议,主要的操作就是基于请求和回应,但是在请求和回应的同时也会包含一些其他的信息(例如:客户端的IP、Cookie、语言等),那么这些信息就称为头信息。
要想取得头信息的名称可以直接通过request内置对象的getHeaderNames(),而要想取出每一个头信息的内容,则需要使用getHeader()方法。
request对象的主要功能是用于接收用户发来的请求信息
接收参数的方法:getParameter()、getParameterValues()、getParameterNames()
取得客户端IP地址可以使用getRemoteAddr()
取得上下文名称可以使用getContextPath()
头信息是指附加在请求上一起发送到服务器上的内容。
response对象
response对象的主要作用是用于对客户端的请求进行回应,将WEB服务器处理后的结果发回给客户端。response对象属于javax.servlet.http.HttpServletResponse接口的实例,HttpServletResponse接口的定义如下:
public interface HttpServletResponse extends ServletResponse
response对象的常用方法
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public void addCookie(Cookie cookie) | 普通 | 向客户端增加Cookie |
2 | public void setHeader(String name,String value) | 普通 | 设置回应的头信息 |
3 | public void sendRedirect(String location) throws IOException | 普通 | 页面跳转 |
设置刷新头信息
之前曾经讲解过,客户端在进行请求的时候会发送许多额外的信息,那么这些就是头信息,服务器端也可以根据需要向客户端设置头信息,在所有的头信息的设置中,定时刷新页面的头信息使用的是最多的,直接使用setHeader()方法,将头信息名称设置为refresh,同时指定刷新的时间。
刷新的HTML 指令
<META HTTP-EQUIV="refresh" CONTENT="3;URL=hello.htm">
在JSP中除了可以通过头信息的方式完成跳转,也可以使用response对象的sendRedirect()方法直接完成页面的跳转。
两种跳转的区别是什么?
<jsp:forward>属于服务器端跳转,跳转之后地址栏的信息并不会有任何的改变,而response.sendRedirect()属于客户端跳转,跳转之后地址栏是会改变的,变为跳转之后的页面地址。
在使用request范围属性的时候,只有是服务器端跳转才能够将request属性保存到跳转页,而如果是客户端跳转,则无法进行属性的传递。
如果使用的是服务器端跳转的话,则执行到跳转语句之后会立刻进行跳转,如果使用的是客户端跳转,则是在整个页面执行完之后才执行跳转。
操作Cookie
Cookie是浏览器所提供的一种技术,这种技术让服务器端的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在使用中本身的计算机,不须通过网络的传输,因而提高网页处理的效率,而且也能够减少服务器端的负载。但是由于Cookie是服务器端保存在客户端的信息,所以其安全性也是很差的。
在JSP中专门提供了javax.servlet.http.Cookie的操作类。
Cookie定义的常用方法
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public Cookie(String name,String value) | 构造 | 实例化Cookie对象,同时设置名字和内容 |
2 | public String getName() | 普通 | 取得Cookie的名字 |
3 | public String getValue() | 普通 | 取得Cookie的内容 |
4 | public void setMaxAge(int expiry) | 普通 | 设置Cookie的保存时间,以秒为单位 |
设置Cookie
所有的Cookie是由服务器端设置到客户端上去的,所以要向客户端增加Cookie的话,必须使用response对象的以下方法:
public void addCookie(Cookie cookie)
response表示的是服务器端对客户端的回应
可以通过setHeader()方法设置一个响应的头信息
通过response可以向客户端设置cookie,通过request可以取得客户端设置的全部Cookie
response对象属于的sendRedirect()方法属于客户端跳转,而<jsp:forward>属于服务器端跳转
session对象
在开发中session对象最主要的用处就是完成用户的登陆(login)、注销(logout)等常见功能的,每一个session对象都表示不同的访问用户,session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能应用在HTTP协议中。
HttpSession接口的主要方法
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public String getId() | 普通 | 取得SESSION ID |
2 | public long getCreationTime() | 普通 | 取得SESSION的创建时间 |
3 | public long getLastAccessedTime() | 普通 | 取得SESSION的最后一次操作时间 |
4 | public boolean isNew() | 普通 | 判断是否是新的SESSION(新用户) |
5 | public void invalidate() | 普通 | 让SESSION失效 |
6 | public Enumeration getAttributeNames() | 普通 | 得到全部属性的名称 |
取得Session Id
当一个用户连接到服务器之后,服务器会自动为此session自动分配一个不会重复的Session Id,服务器依靠这些不同的Session Id来区分每一个不同的用户,在WEB中可以使用HttpSession接口中的getjavaId()方法取得这些编号。
通过序列化的方式保存session
在Tomcat中可以通过配置server.xml文件,将每一个用户的session在服务器关闭时序列化到存储介质(存储介质可以是文件或数据库)上保存,这样即使服务器重新启动了,也可以通过反序列化的方式,从指定的存储介质上反序列化session。
属性作用:
className:session的管理器操作类,Tomcat通过此接口完成序列化管理;
debug:Session管理器的跟踪级别;
saveOnRestart:配置服务器重新启动前对session的处理,可以配置true或false两中选项,如果为true则会在容器关闭前将有效的session保存,重新启动后重新载入;
maxActiveSession:可以活动的session的最大数,如果设置为-1,则表示不受限制,超过最大限制会将session对象转移到Session Store中;
minIdleSwap:一个session不活动的最短时间,单位为秒,如果设置为-1,则表示不受限制,超过该时间会将session对象转移到Session Store中;
maxidleSwap:一个session不活动的最长时间,单位为秒,如果设置为-1,则表示不受限制,超过该时间会将session对象转移到Session Store中,该session不在内存中保存;
maxidleBackup:session的最长时间,单位为秒,如果设置为-1,则表示不受限制,超过该时间会将session对象备份到Session Store之中,但该Session对象依然存在于内存之中。
<Store>元素:定义实现持久化session的操作类及指定的文件存放位置,本程序将序列化的sessijavaon保存在了“d:\temp”文件夹之中,每一个保存的session都是通过文件保存的,文件的命名规范是“sessionid.session”。
登陆及注销
在各个的系统中几乎都会包括用户登陆验证及注销的功能,那么此功能就完全可以使用session实现,具体的思路是:当用户登陆成功之后,设置一个session范围的属性,之后在其他需要验证的页面中判断是否存在此session范围的属性,如果存在,则表示已经是正常登陆过的合法用户,如果不存在,则给出提示,并跳转回登陆页提示用户重新登陆,用户登陆之后可以进行注销的操作。
取得用户的操作时间
在session对象中,可以通过getCreationTime()方法取得一个session的创建时间,也可以使用getLastAccessedTime()方法取得一个session的最后一次操作时间,那么通过这两种操作,就可java以计算出一个session的操作时间。
session对象最主要的功能就是用于登陆验证操作
当用户第一次连接到服务器上时会自动分配一个新的session id
application对象
application对象是javax.servlet.ServletContext接口的实例化对象,从单词上翻译表示的是整个Servlet的上下文,ServletContext代表了整个容器的操作
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | String getRealPath(String path) | 普通 | 得到虚拟目录对应的绝对路径 |
2 | public Enumeration getAttributeNames() | 普通 | 得到所有属性的名称 |
3 | public String getContextPath() | 普通 | 取得当前的虚拟路径名称 |
String path = application.getRealPath("/") ;
对于application对象而言,在WEB中也可以使用getServletContext()方法进行替代。
String path = this.getServletContext().getRealPath("/") ; java
application表示的是整个上下文的资源环境;java
在实际中可以通过this.getServletContext()方法来代替application的使用;
通过getRealPath()方法可以取得一个虚拟目录对应的真实路径。
WEB安全性及config对象
从最初的Tomcat服务器配置开始,就一直强调在WEB目录之中必须存在一个WEB-INF的文件夹,但是,一些细心的读者可以发现,现在即使列出了WEB目录中的全部内容,WEB-INF也不会显示出来,那么既然此目录无法被外部所看见,则肯定其安全性就很高,所以,保存在此目录中的程序肯定安全性是最高的。
config对象是javax.servlet.ServletConfig接口的实例化对象,主要的功能是取得一些初始化的配置信息。
常用方法:
public String getInitParameter(String name)
public Enumeration getInitParameterNames()
将页面资源保存在WEB-INF文件夹之中是最安全的,但是必须通过映射路径才可以访问。
通过config对象可以取得初始化的配置参数。java
out对象
out对象是javax.servlet.jsp.JspWriter类的实例化对象,主要的功能就是完成页面的输出操作,使用println()或print()方法输出,但是从实际的开发来看,直接使用out对象的几率较少,都会使用表达式完成输出的操作。
out对象定义了如下的几个操作:java
public int getBufferSize()
public int getRemaining()
int buffer = out.getBufferSize() ; // 得到全部缓冲区大小
int available = out.getRemaining() ; // 得到未使用的缓冲区大小
int use = buffer - available ; // 得到使用的缓冲区大小
pageContext对象
pageContext对象是javax.servlet.jsp.PageContext类的实例,主要表示的是一个JSP页面的上下文,在此类中除了之前讲解过的属性操作之外,还定义了以下的一些方法:
public abstract void forward(String relativeUrlPath) throws ServletException,IOException
public void include(String relativeUrlPath) throws ServletException,IOException
public ServletConfig getServletConfig()
public ServletContext getServletContext()
public ServletRequest getRequest()java
public ServletResponse getResponse()
public HttpSession getSession()
pageContext.forward("page02.jsp?info=hello") ;
String info = pageContext.getRequest().getParameter("info") ;
pageContext中可以取得request、session等主要内置对象;
通过 pageContext对象可以完成页面的跳转功能。java