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>