在JSP中为了简化用户的开发,提供了一些内置对象,这些内置对象将由容器自动为用
户进行实例化,用户直接使用即可。而不像在Java中,必须通过new关键字进行实例化对象
后才可以使用。
内置对象 | 类型 | 描述 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
request | javax.servlet.jsp.HttpServletRequest | 得到用户的请求信息 |
response | javax.servlet.jsp.HttpServletResponse | 服务器向客户端的回应信息 |
session | javax.servlet.jsp.HttpSession | 用来保存每一个用户的信息 |
application | javax.servlet.jsp.ServletContext | 表示所有用户的共享信息 |
一.4种属性范围
在JSP中提供了4种属性的保存范围,属性保存范围,就是指一个内置对象,可以在多少个
页面中保存并且继续使用。
1.page:只在一个页面中保存属性,跳转之后无效。
2.request:只在一次请求中保存属性,服务器跳转之后无效。
3.session:在一次会话范围中保存,无论怎么跳转都能使用,但是新开的浏览器无法使用。
4.application:在整个服务器中保存,所有用户都能使用。
page的属性范围:
只能在本页面中<%=%>得到值如果添加了 :
<!-- 服务器跳转 -->
<jsp:forward page="xxx.jsp">
则在xxx.jsp页面找不到原来页面的属性内容。
request的属性范围:
即使是添加了:
<!-- 服务器跳转 -->
<jsp:forward page="xxx.jsp">
在xxx.jsp页面上还是能得到原来页面的属性内容。但是,如果是超链接:
<!-- 地址改变 客户端跳转 -->
<a href="yyy.jsp">
那么在yyy.jsp页面上得不到原来页面的属性内容。
session的属性范围:
这个很容易理解的,无论是服务器跳转(<jsp:forward>)还是客户端跳转(<a href="xxx">),
session都能保存和读取。
但是:如果再打开一个新的浏览器直接访问页面 ,却无法得到设置的属性内容。
application的属性范围:
这个无论怎样都能得到,包括新开的浏览器也能得到。
二.深入request对象
request内置对象是使用最多的一个对象,其主要作用是接受客户端发送而来的请求
信息。
使用request接受参数是最常见的,但是,在进行参数提交的时候也会存在一些中文的
乱码问题。
乱码解决 :
request_demo1.html :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>CaMnter</title>
</head>
<body>
<form action="request_demo1.jsp" method="post">
<input type="text" name="info"></input> <input type="submit"
value="提交"></input>
</form>
</body>
</html>
request_demo1.jsp:
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<h2><%=request.getParameter("info")%></h2>
三.深入response对象
response对象的主要作用是对客户端的请求进行回应,将Web服务器处理后的结果发送给
客户端。
设置头信息 :
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%!int count = 0;%>
<%
// 2秒刷新一次
response.setHeader("refresh", "2");
%>
<h2><%=count++%></h2>
定时刷新,2秒刷新一次。
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%!int count = 0;%>
<%
// 2秒后跳转到 request_deme1.html 页面
response.setHeader("refresh", "2,URL=request_deme1.html");
%>
<h2><%=count++%></h2>
2秒后跳转,这个跳转属于客户端跳转,显而易见,地址变了。
页面跳转 :
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%
//直接跳转到xxx.html页面
response.sendRedirect("xxx.html");
%>
response的跳转属于客户端跳转。
操作Cookie :
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%
Cookie cookie = new Cookie("CaMnter", "Save you from anything 07");
//保存7777秒
cookie.setMaxAge(7777);
response.addCookie(cookie);
%>
三.深入Session对象
session对象的最主要的功能就是完成用户登录(login)和注销(logout)等常见
功能,每一个session对象都表示不同的访问用户。
取得Session Id :
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%
String id = session.getId();
%>
<h2>
Session Id :
<%=id%></h2>
<h2>
Session Id 长度 :
<%=id.length()%></h2>
session.invalidate() 方法 :将在服务器上销毁此session 的全部信息。
session.isNew() 方法 : 判断一个用户是否是第一次访问页面。实质是通过Cookie的方
式进行判断的。
session.getCreationTime() 方法 : 取得session的创建事件。
session.getLastAccessedTime() 方法 : 取得session的最后一次操作事件。
四.深入Application对象
application对象是javax.servlet.jsp.ServletContext接口的实例化对象,从
单词上表示的是整个Servlet的上下文,ServletContext代表了整个容器的操作。
取得虚拟目录对应的绝对路径 :
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%
//取得当面虚拟目录的真实路径
String path = application.getRealPath("/");
%>
<h2>
path:
<%=path%></h2>
得到的path,也就是这个 :
<Context path="/CaMnter" docBase="x:\xxx" reloadable="true">
application = this.getServletContext()
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<%
//this.getServletContext
String path = this.getServletContext().getRealPath("/");
%>
<h2>
path:
<%=path%></h2>
注意:尽量使用this.getServletContext()来代替application,对于理解有帮助。
特别提示:Tomcat目录下lib中如果放了第三方的jar包,则这些jar包都是通过application
属性自动设置到服务器上去的。