我们打开翻译后的 java 文件。查看_jspService
方法。
request对象:
请求对象,可以获取请求信息
response对象:
响应对象。可以设置响应信息
pageContext对象:
当前页面上下文对象。可以在当前上下文保存属性信息
session对象:
会话对象。可以获取会话信息。
exception对象:
异常对象只有在 jsp 页面的 page 指令中设置 isErrorPage=“true” 的时候才会存在
application对象:
ServletContext 对象实例,可以获取整个工程的一些信息。
config对象:
ServletConfig 对象实例,可以获取 Servlet 的配置信息
out对象:
输出流。
page对象:
表示当前 Servlet 对象实例(无用,用它不如使用 this 对象)。
九大内置对象 , 都是我们可以在 【 代码脚本 】 中或 【 表达式脚本 】 中直接使用的对象。
四大域对象经常用来保存数据信息
。
pageContext
可以保存数据在同一个 jsp 页面中使用。
request
可以保存数据在同一个 request
对象中使用。经常用于在转发的时候传递数据
。
session
可以保存在一个会话
中使用。
application(ServletContext)
就是 ServletContext
对象。
四个作用域的测试代码:
新建两个 jsp 页面。分别取名叫:context1.jsp,context2.jsp
1. context1.jsp 的页面代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是 context1 页面<br/>
<%
//设置 page 域的数据
pageContext.setAttribute("key", "pageContext-value");
//设置 request 域的数据
request.setAttribute("key", "request-value");
//设置 session 域的数据
session.setAttribute("key", "session-value");
//设置 application 域的数据
application.setAttribute("key", "application-value");
%>
<%-- 测试当前页面作用域 --%>
<%=pageContext.getAttribute("key") %><br/>
<%=request.getAttribute("key") %><br/>
<%=session.getAttribute("key") %><br/>
<%=application.getAttribute("key") %><br/>
<%
// 测试 request 作用域
// request.getRequestDispatcher("/context2.jsp").forward(request, response);
“ 玩转 ” Java 系列
%>
</body>
</html>
2. context2.jsp 的页面代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这是 context2 页面 <br/>
<%=pageContext.getAttribute("key") %><br/>
<%=request.getAttribute("key") %><br/>
<%=session.getAttribute("key") %><br/>
<%=application.getAttribute("key") %><br/>
</body>
</html>
测试 pageContext
作用域步骤:
直接访问 context1.jsp 文件。
测试 request
作用域步骤:
1.在 context1.jsp 文件中添加转发到 context2.jsp(有数据)。
2.直接访问 context2.jsp 文件 (没有数据)。
测试 session
作用域步骤:
1.访问完 context1.jsp 文件。
2.关闭浏览器。但是要保持服务器一直开着。
3.打开浏览器,直接访问 context2.jsp 文件。
测试 application
作用域步骤:
1.访问完 context1.jsp 文件,然后关闭浏览器。
2.停止服务器。再启动服务器。
3.打开浏览器访问 context2.jsp 文件。
response中表示响应,我们经常用于设置返回给客户端的内容(输出)
。out也是给用户做输出使用的。
注意:out方法需要导入jsp的jar包,不然没有这些方法。
response方法需要导入servlet的jar包。
out 和 response 的 writer 的区别演示。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
// out 输出
out.write("这是 out 的第一次输出
");
// out flush 之后。会把输出的内容写入 writer 的缓冲区中
out.flush();
// 最后一次的输出,由于没有手动 flush,会在整个页面输出到客户端的时候,自动写入到 writer
缓冲区
out.write("这是 out 的第二次输出
");
// writer 的输出
response.getWriter().write("这是 writer 的第一次输出
");
response.getWriter().write("这是 writer 的第二次输出
");
%>
</body>
</html>
当jsp页面中的所有代码执行完成之后会做以下两个操作:
1、执行out.flush()操作,会把out缓冲区中的数据追加写入到response缓冲末尾。2、会执行response的刷新操作,把全部数据写给客户端。
由于jsp翻译之后,底层源代码都是使用out
来进行输出,所以一般情况下,我们在jsp页面中统一使用out
进行输出。避免打乱页面输出内容的顺序。
out.weote()
输出字符串没有问题。
out.pringt()
输出任何数据都没有问题(都转换成为字符串后调用的write)。
深入源码,浅出结论:在jsp页面,可以统一使用out.print()来进行输出。