Jsp的内置对象
- 什么是内置对象: 在jsp开发中,会频繁使用到一些对象, 例如HttpSession, ServletContext, ServletContext, HttpServletRequet。如果我们每次要使用这些对象都去创建这些对象就显示非常麻烦。所以Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象,而开发者只需要直接使用这些对象调用方法即可!这些创建好的对象就叫内置对象!
- 举例:
- servlet: HttpSession session = request.getSession(true); (需要开发者做)
- jsp:
- tomcat服务器: HttpSession session = request.getSession(true);(不需要开发者做)
- 开发者做的: session.getId();
JSP-9大内置对象(内置对象名 : 类型)
- request : HttpServletRequest
- response : HttpServletResponse
- config : ServletConfig
- application : ServletContext
- session : HttpSession
- exception : Throwable
- page : Object(this)
- out : JspWriter
- pageContext : PageContext
Out对象
- out对象类型,JspWriter类,相当于带缓存的PrintWriter
- PrintWriter.wrier(内容) : 直接向浏览器写出内容
- JspWriter.writer(内容) : 向jsp缓冲区写出内容(默认8kb)
- JSP页面缓冲机制 :
- JspWriter首先写到JspWriter缓冲区, 然后当缓冲区满足下面4个条件时, 缓冲区的内容会向外写入PrintWriter到的对象当中,最后PrintWriter的write方法直接输送到浏览器中
- 当满足以下条件之一,缓冲区内容写出:
1)缓冲区满了 :
2)刷新缓存区 : out.flush
3)关闭缓存区 :buffer = "0kb"
4)执行完毕jsp页面 :
- 方法:
-
out.flush()
: 刷新缓存 -
out.getRemaining
: 查看缓冲区剩余大小 -
out.getBufferSize
: 查看缓冲区大小
-
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" buffer="1kb"%><%
for(int i=1;i<=1024;i++){
out.write("a");
}
//查看缓存区大小
System.out.println("当前缓存区大小:"+out.getBufferSize());
//查看缓存区剩余大小
System.out.println("缓存区剩余大小:"+out.getRemaining());
//刷新缓存
//out.flush();
response.getWriter().write("123");
%>
</body>
</html>
pageContext对象
pageContext对象的类型是PageContext,叫jsp的上下文对象
- 可以从PageContext对象中获取其他8个内置对象
- 使用场景: 在自定义标签的时候,PageContext对象频繁使用到!
JspWriter out =pageContext.getOut();
HttpServletRequest rquest = pageContext.getRequest();
- 本身是一个域对象
- ServletContext : context域
- HttpServletRequet : request域
- HttpSession : session域
Servlet中的域对象: ServletContext, HttpServletRequet, HttpSession - PageContext : page域 (jsp特有的)
作用 : 保存数据和获取数据,用于共享数据
保存数据
1)默认情况下,保存到page域 : pageContext.setAttribute("name");
2)可以向四个域对象保存数据 : pageContext.setAttribute("name",域范围常量)-
获取数据
1)默认情况下,从page域获取 : pageContext.getAttribute("name")
2)可以从四个域中获取数据 : pageContext.getAttribute("name",域范围常量)- 域范围常量:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
3)自动在四个域中搜索数据: pageContext.findAttribute("name");
顺序 : page域 -> request域 -> session域- > context域(application域)
- 域范围常量:
Jsp中的四个域对象 :
- 简介:
pageContext : page域
request : request域
session : session域
application : context域
- 域对象作用:保存数据和获取数据, 用于数据共享
- 域对象方法:
-
setAttribute("name",Object)
: 保存数据 -
getAttribute("name")
: 获取数据 -
removeAttribute("name")
: 清除数据
- 域对象作用范围:
- page域 : 只能在当前jsp页面中使用 (当前页面)
- request域 : 只能在同一个请求中使用 (转发)
- session域 : 只能在同一个会话 (session对象) 中使用 (私有的)
- context域 : 只能在同一个web应用中使用(全局的)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"
isErrorPage="true"
session="true"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>pageContext对象</title>
</head>
<body>
从四个域中获取数据
page域 :<% = pageContext.getAttribute("message",PageContext.PAGE_SCOPE) %><br/>
request域 : <% = pageContext.getAttribute("message",PageContext.REQUEST_SCOPE) %><br/>
session域 : <% = pageContext.getAttribute("message",PageContext.SESSION_SCOPE) %><br/>
context域 : <% = pageContext.getAttribute("message",PageContext.APPLICATION_SCOPE) %><br/>
<%
//1)可以获取其他8个内置对象
//response.getWriter().write("是否相等?"+(out==pageContext.getOut()) +"<br/>");
//response.getWriter().write("是否相等?"+(session==pageContext.getSession()));
%>
<%--
2)pageContext作为域对象使用
2.1 可以往不同域对象中存取数据
--%>
<%
//保存数据。默认情况下,保存在page域中
pageContext.setAttribute("message","page's message");
pageContext.setAttribute("message","request's messsage",PageContext.REQUEST_SCOPE);//保存到request域中
pageContext.setAttribute("message","session's messsage",PageContext.SESSION_SCOPE);//保存到sessio域中
pageContext.setAttribute("message","application's messsage",PageContext.APPLICATION_SCOPE);//保存到context域中
//request.setAttribute("message","request's message"); 等价于上面的代码
%>
<%
//获取数据
//String message = (String)pageContext.getAttribute("message");
//out.write(message);
%>
<%--从request域中取出数据 --%>
<%--
原则:
1)在哪个域中保存数据,就必须从哪个域取出数据!!!
--%>
<%=pageContext.getAttribute("message",PageContext.PAGE_SCOPE) %><br/>
<%=pageContext.getAttribute("message",PageContext.REQUEST_SCOPE) %><br/>
<%=pageContext.getAttribute("message",PageContext.SESSION_SCOPE) %><br/>
<%=pageContext.getAttribute("message",PageContext.APPLICATION_SCOPE) %><br/>
<hr/>
<%--
findAttribute(): 在四个域自动搜索数据
顺序: page域 -> request域 -> session域 -> context域
--%>
<%=pageContext.findAttribute("message") %>
<% //request.getAttribute("message") %><br/>
<%
//转发
// request.getRequestDispatcher("/03.pageContext2.jsp").forward(request,response);
//重定向
response.sendRedirect(request.getContextPath()+"/03.pageContext2.jsp");
%>
</body>
</html>