JSP9大内置对象
request : 客户端提交给服务器的所有数据,都被封装在该对象中。
response: 服务器响应给客户端的所有数据,都被封装在该对象中。
session: 会话
会话就是一段有开始,有结束的过程!
比如:
打电话,从双方接通开始,持续到任何一方挂断为止,算一次电话会话。
会议: 从开会开始,到散会为止,算一个会议会话
人的一生: 从呱呱坠地开始,到百年以后结束,算一次人生会话。
在jsp技术中,会话特指:一个用户从打开一个网站的任何一个页面开始,到关闭了该网站的所有页面为止,算一次jsp中的会话。
给会话范围设置的属性,只要在一次会话范围中,都能获取!
Session的方法:
setAttribute() 在会话范围中设置属性
getAttribute() 从会话范围中获取属性
removeAttribute() 从会话范围中删除指定的属性
session的其它方法:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<h2>c.jsp</h2>
<table>
<tr>
<td>新会话?</td>
<td><%=session.isNew() %></td>
</tr>
<tr>
<td>会话id</td>
<td><%=session.getId() %></td>
</tr>
<tr>
<td>会话创建时间</td>
<td><%=session.getCreationTime() %></td>
</tr>
<tr>
<td>上次会话访问</td>
<td><%=session.getLastAccessedTime() %></td>
</tr>
<tr>
<td>当前系统时间</td>
<td><%=System.currentTimeMillis() %></td>
</tr>
<tr>
<td>会话闲置时间</td>
<td>
<%=System.currentTimeMillis() - session.getLastAccessedTime() %>
</td>
</tr>
<tr>
<td>让会话失效</td>
<td>
<% //session.invalidate(); %>
</td>
</tr>
</table>
<a href="a.jsp">go to a.jsp</a>
application: 应用对象,应用范围
从部署web应用开始,到卸载web应用为止,算一次应用范围。
只有,重新部署web应用,或者直接重启tomcat服务器,才能销毁application范围!
application.setAttribute();
application.getAttribute();
application.removeAttribute();
先介绍一个web 应用描述符,就是WebRoot/WEB-INF/web.xml文件。 对一个web应用的任何配置,都应该在web.xml中进行配置!
比如,可以通过该文件配置web引用的欢迎界面!
注意,每次修改完web.xml,记得保存,而且保存以后,还要重新部署web应用。
application.getInitParameter(); 获取初始化参数。
步骤1,先在web.xml中,配置初始化参数。
步骤2:在任何一个jsp页面上使用application.getInitParameter(名字)即可!
当web应用被部署的时候,tomcat会自动读取web应用的web.xml配置文件,并且把所有初始化参数自动封装进application对象中。
pageContext: 页面范围
从进入一个jsp页面开始,到该jsp页面执行完毕,算一次页面范围。
对比4大范围:
在当前页面上,4大范围的属性,都能获取
为了甩掉页面范围的值,留下request session application的值,需要转发到一个新页面,只要跳转到另外一个页面了,那么页面范围绝对是一个新的!(无论是转发还是重定向)
为了甩掉request范围的值,需要重定向,或者超链接。
继续甩掉会话范围,不用写什么代码,只要把浏览器窗口关闭完就行!会话就结束,再次打开一个新的浏览器窗口,直接访问b.jsp
最后甩掉应用范围: 也不用写代码,只需要重新部署以下web应用即可。
分析,jsp中的4大范围,从小到大,依次是:
pageContext < request < session < application
除了pageContext以外,其它3个范围都可以在不同页面直接传递数据!
那么问题是,3个范围(request session application)都能在不同页面直接传递数据,到底应该如何选择??
选择的原则是,能用小的,就别用大的范围! Why ??? 因为小范围内的数据,占用内存的时间少。 要知道,request session application都是由web服务器创建的,占用的都是web服务器的内存,当a.jsp把参数传递给b.jsp以后,内存就应该释放!
pageContext的其它方法:
通过pageContext可以获取4个范围中的数据:
findAttribute(), 寻找的顺序是 从小到大,依次寻找,如果在小范围中已经找到数据了,就不会在继续寻找了。
对比,pageContext.getAttribute()只在页面范围找,如果找不见,就直接范围null!
而且只有pageContext才有findAttribute方法,其它3个范围的内置对象没有
pageContext可以获取其它8个内置对象:
为什么要有这个功能,存在的价值何在?? 因为,将来学习的一些技术中,需要使用jsp页面的9大内置对象,如果将9大内置对象直接传递给一个方法,那么这个方法势必要定义9个形式参数,来一个一个接收! 倒不如直接传入一个pageContext即可!
pageContext.include就是java代码版本的动态包含
pageContext.forward() 就是java代码版本的转发
out: 字符输出流,起点服务器,终点客户端浏览器,意思就是out对象底层封装了套接字,能进行网络数据传输。
out.clearBuffer(); 清空out缓冲区中的数据
exception
要使用该内置对象,必须在jsp页面上添加一个指令元素
<%@ page isErrorPage=”true” %>
该内置对象中,存放了上一个jsp页面抛出的异常!!
还可以指定把错误信息打印到某个文件中,便于程序员后期维护,调试错误!
config
用于获取jsp页面的初始化参数
步骤1,在web.xml中为一个jsp页面配置初始化参数
与以下配置不同, 以下配置出来的初始化参数,可以用在任何一个jsp页面上,
但必须使用application.getInitParameter()来获取。
<context-param>
<param-name>qq</param-name>
<param-value>nihao!!!</param-value>
</context-param>
page
代表当前jsp页面对象本身。 它起始就是this!! 而且没有什么用处!!
如果非要让page有个什么作用,那只能获取page指令元素的info属性的内容了!
经典面试题: jsp有哪些内置对象
pageContext, 表页面范围,通过该对象可以获取其它8个内置对象。
request, 请求范围, 从客户端发起请求开始,到服务器响应之时,算一次请求范围。所有客户端提交给服务器的数据,都全部封装在该对象中。
session,会话范围,从客户端浏览器访问一个web网站的任何一个页面开始,到关闭了该网站的所有页面位置,算一次会话范围。
Application,应用范围,从部署一个web应用开始,到卸载web应用位置,算一次应用范围。
Response, 响应对象,所有服务器响应给客户端的数据,全部都封装在该对象中。该对象还能完成重定向功能。
Out, 字符输出流,起点服务器,终点客户端,用于把服务器生成的html字符串发送给远程客户端浏览器!
exception , 异常对象,总是存放上一个jsp页面抛出的异常信息,要使用该对象,必须添加指令: <%@ page isErrorPage=”true” %>
config, Servlet配置对象,能给某一个jsp页面配置初始化参数。
Page, 代表单当前jsp页面本身,本质上就是this。唯一的作用是可以获取<%@page info=”哈哈哈” %>中的信息.
我们学习的时候,把4大范围叫做这样的名字:
页面范围, 请求范围, 会话范围, 应用范围,
也有人这样叫:
页面上下文, 请求上下文, 会话上下文, 应用上下文,
看到上下文这几个字,不要怕! 马上告诉自己,上下文,说人话,意思是:“map结构”.