林炳文Evankaka原創作品。轉載請注明出處http://blog.csdn.net/evankaka
摘要:本文首先主要解說了JSP中四種屬性范圍的概念、用法與實例。
然后在這個基礎之上又引入了九大內置對象,並對這幾大內置對象一個一個的進行分析的解讀。內容非常具體,例子都附有代碼和執行的結果截圖。
一、四種屬性范圍
1.1、在JSP中提供了四種屬性保存范圍
page:在一個頁面內保存屬性。跳轉之后無效
request:在一次服務請求范圍內。server跳轉后依舊有效
session:-在一次會話范圍內,不管何種跳轉都能夠使用,可是新開瀏覽器無法使用
application:在整個server上保存,全部用戶都能夠使用
1.2、4種屬性范圍都支持的操作
public void setAttribute(String name,Object value) public Object getAttribute(String name) public Object removeAttribute(String name)
以下。我們來對四種范圍來分別進行具體的介紹
1.3、page范圍
在JSP中設置一個頁的屬性范圍,必須通過pageContext完畢,PageContext屬性范圍是最重要的JSP屬性之中的一個。可是假設使用純粹的JSP代碼開發,此屬性顯示不出用處。其發揮作用在 Struts ,WebWork 中
例如以下:
<%@page import="java.util.*"%> <%@ 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> <% //設置page屬性范圍,此屬性僅僅在當前JSP頁面內起作用 pageContext.setAttribute("name", "linbingwen"); pageContext.setAttribute("time", new Date()); %> 姓名:${pageScope.name}<br> 時間:${pageScope.time}<br> </body> </html>${pageScope.name}這里用了EL表達式來取得值,輸出結果例如以下。
這里要注意發果在其它頁面使用:
例如以下:
<%@page import="java.util.*"%> <%@ 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> 姓名:${pageScope.name}<br> 時間:${pageScope.time}<br> </body> </html>輸出結果:
這說明page范圍的值僅僅能在本頁使用。
1.4、request屬性范圍
request將屬性保存在一次請求范圍之內:
前提:必須使用server端跳轉:<jsp:forward/> 應用點:MVC設計模式、Struts、 Webwork
應用實例
首先是設置request:
request.jsp
<%@page import="java.util.*"%> <%@ 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> <% //設置request屬性范圍 request.setAttribute("name", "linbingwen"); request.setAttribute("time", new Date()); %> <jsp:forward page="requestResult.jsp"/> </body> </html>
然后是顯示requestResult.jsp
<%@page import="java.util.*"%> <%@ 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> 獲取request姓名:${requestScope.name}<br> 獲取request時間:${requestScope.time}<br> </body> </html>
訪問結果:
這時比方requestResult1.jsp也想來訪問這兩個屬性
內容和requestResult.jsp一樣:
<%@page import="java.util.*"%> <%@ 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> 獲取request姓名:${requestScope.name}<br> 獲取request時間:${requestScope.time}<br> </body> </html>
結果例如以下。說明request僅僅針對server跳轉有效,在兩次跳轉之間保存。
1.5、session屬性范圍
session:僅僅要設置上去,則不管是什么跳轉,都能夠取得屬性。主要用於驗證用戶是否登陸。
EMAIL--->用戶須要先進行登陸,登陸成功后再編輯郵件。與session有關的不論什么打開的頁面都能夠取得session
比方session.jsp設置例如以下:
<%@page import="java.util.*"%> <%@ 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> <% //設置session屬性范圍 session.setAttribute("name", "linbingwen"); session.setAttribute("time", new Date()); %> <a href="sessionResult.jsp">獲取session內容</a> </body> </html>然后是取出sesson的值sessionResult.jsp
<%@page import="java.util.*"%> <%@ 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> 獲取session姓名:${sessionScope.name}<br> 獲取session時間:${sessionScope.time}<br> </body> </html>輸出結果:
假設另一個sessionResult1.jsp和sessionResult.jsp一例子如以下
<%@page import="java.util.*"%> <%@ 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> <% //設置request屬性范圍 session.setAttribute("name", "linbingwen"); session.setAttribute("time", new Date()); %> <a href="sessionResult.jsp">獲取session內容</a> </body> </html> 然后是取出sesson的值sessionResult.jsp <%@page import="java.util.*"%> <%@ 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> 獲取session姓名:${sessionScope.name}<br> 獲取session時間:${sessionScope.time}<br> </body> </html>
注意看上面的GIF動畫和這里的獲取到的時間是一樣的,這也說明了這兩個jsp頁面取得了同一個值
1.6、application屬性范圍
僅僅要設置一次。則全部的頁面窗體都能夠取得數據。這里的值將會保存在server上,所以每一個用戶都能夠看見。
如以下application.jsp:
<%@page import="java.util.*"%> <%@ 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> <% //設置request屬性范圍 application.setAttribute("name", "linbingwen"); application.setAttribute("time", new Date()); %> <a href="applicationResult.jsp">獲取application內容</a> </body> </html>
然后是applicationResult.jsp
<%@page import="java.util.*"%> <%@ 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> 獲取application姓名:${applicationScope.name}<br> 獲取application時間:${applicationScope.time}<br> </body> </html>
輸出結果:
假設這時在新建一個網頁或新建一個新的web項目。可是它們兩個要執行在同一個Tomcat中,那么它相同也能訪問到這個值。
注意:
pplication、session、request--==--》都與要跨多個頁,屬性保存是有內存開銷的。設置過多的application或每一個session保存過多的對象,性能就減少了。
原則:能用request就不要用session。能用session就不要用application
application應用:在線人員統計、在線人員名單列表,要釋放application資源,僅僅能又一次啟動server.
使用application緩存數據庫的連接,每次使用時。從緩沖中取出,用完就返回。
二、JSP九大內置對象具體解釋
內置對象(又叫隱含對象。有9個內置對象):不須要預先聲明就能夠在腳本代碼和表達式中任意使用
JSP內置對象映射表
request 請求對象 類型 javax.servlet.ServletRequest 作用域 Request
response 響應對象 類型 javax.servlet.SrvletResponse 作用域 Page
pageContext 頁面上下文對象 類型 javax.servlet.jsp.PageContext 作用域 Page
session 會話對象 類型 javax.servlet.http.HttpSession 作用域 Session
application 應用程序對象 類型 javax.servlet.ServletContext 作用域 Application
out 輸出對象 類型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置對象 類型 javax.servlet.ServletConfig 作用域 Page
page 頁面對象 類型 javax.lang.Object 作用域 Page
exception 例外對象 類型 javax.lang.Throwable 作用域 page
2.1、request對象
request 對象是 javax.servlet.httpServletRequest類型的對象。 該對象代表了client的請求信息。主要用於接受通過HTTP協議傳送到server的數據。(包括頭信息、系統信息、請求方式以及請求參數等)。request對象的作用域為一次請求。
實現常有的方法
1、獲取數據
getParameter;;接收請求參數的,
2、對全部數據進行再編碼
public byte[] getBytes(“encoding”)例如以下實例將byte數組編碼轉換
<%@ page contentType="text/html";charset=gbk"%> <html> <body> <% //接收內容 String name=request.getParameter("uname"); byte[] b=name.getBytes("ISO8859-1"); name=new String(b); String name= new String(request.getParameter("uname").getBytes("ISO8859-1")); %> <h1>輸入內容為:<%=name%></h1> </body> </html>
3、設置統一的請求編碼
public void setCharacterEncoding(String env) throws UnsunpportedEncodingException例如以下設置
<%@ page contentType="text/html";charset=gbk"%> <html> <body> <% //接收內容 request.setCharacterEncoding("GBK"); String name= request.getParameter("uname"); %> <h1>輸入內容為:<%=name%></h1> </body> </html>
4、獲取requst信息:
<%@ 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 bgcolor="#FFFFF0"> <form action="" method="post"> <input type="text" name="name"> <input type="submit" value="提交"> </form> 請求方式:<%=request.getMethod()%><br> 請求的資源:<%=request.getRequestURI()%><br> 請求用的協議:<%=request.getProtocol()%><br> 請求的文件名稱:<%=request.getServletPath()%><br> 請求的server的IP:<%=request.getServerName()%><br> 請求server的端口:<%=request.getServerPort()%><br> clientIP地址:<%=request.getRemoteAddr()%><br> client主機名:<%=request.getRemoteHost()%><br> 表單提交來的值:<%=request.getParameter("name")%><br> </body> </html>
我們第一次訪問是默認用GET方法,表單提交后使用POST方式。
2.2、response對象
response 代表的是對client的響應,主要是將JSP容器處理過的對象傳回到client。
response對象也具有作用域。它僅僅在JSP頁面內有效。response對象的主要使用1.設置HTTP頭信息、重定向、設置COOKie
(1).Webserver收到一個http請求,會針對每一個請求創建一個HttpServletRequest和HttpServletResponse對象,向client發送數據找HttpServletResponse,從client取數據找HttpServletRequest;
(2).HttpServletResponse對象能夠向client發送三種類型的數據:a.響應頭b.狀態碼c.數據
2.2.1、response對象所提供的方法。
(1)設定表頭的方法
void addCookie(Cookie cookie) 新增cookie void addDateHeader(String name, long date) 新增long類型的值到name標頭 void addHeader(String name, String value) 新增String類型的值到name標頭 void addIntHeader(String name, int value) 新增int類型的值到name標頭 void setDateHeader(String name, long date) 指定long類型的值到name標頭 void setHeader(String name, String value) 指定String類型的值到name標頭 void setIntHeader(String name, int value) 指定int類型的值到name標頭 containsHeader( String name )推斷指定名字的HTTP文件頭是否已經存在。然后返回真假布爾值(2)設定響應狀態碼的方法
void sendError(int sc) 傳送狀態碼(status code) void sendError(int sc, String msg) 傳送狀態碼和錯誤信息 void setStatus(int sc) 設定狀態碼(3)用來URL 重寫(rewriting)的方法
String encodeRedirectURL(String url) 對使用sendRedirect( )方法的URL予以編碼(4)設置重定向
sendRedirect():設置重定向頁面.2.2.2、使用范例
(1)使用response對象能夠設置HTTP的頭信息。
格式response.setHeader(“頭信息名稱”,”參數”),當中一個重要的頭信息:refresh(刷新)。比如。每秒刷新一次也沒。顯示刷新次數:
<%@page import="java.util.*"%> <%@ 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> <%!int i=0; %> <% //每秒刷新一次 response.setHeader("refresh","1"); %> <%=i++ %> </body> </html>輸出結果例如以下:
(2)重定向
<%@page import="java.util.*"%> <%@ 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> <% response.setHeader("refresh","3;URL=index.jsp") ; %> 三秒后跳轉!來輸出結果看看:!
!
<br> 假設沒有跳轉。請按<a href="index.jsp">這里</a>!!
! </body> </html>
輸入http://localhost:8080/JspLearning/responseObject1.jsp,三秒后自己主動跳轉到http://localhost:8080/JspLearning/index.jsp
當然還能夠使用response.sendRedirect("**.jsp");命令
例如以下:
<%@page import="java.util.*"%> <%@ 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> <% response.sendRedirect("index.jsp"); %> </body> </html>輸出結果,直接重定向返回到首頁了,
(3)設置cookie
<%@pagecontentType="text/html;charset=gb2312"%> <HTML> <HEAD> <TITLE>Cookie的使用</TITLE> </HEAD> <BODY> <% Cookie c1 = newCookie("name","aaa") ; Cookie c2 = newCookie("password","111") ; // 最大保存時間為60秒 c1.setMaxAge(60) ; c2.setMaxAge(60) ; // 通過response對象將Cookie設置到client response.addCookie(c1) ; response.addCookie(c2) ; %> </BODY> </HTML>
(4)讀取cookie
<%@page contentType="text/html;charset=gb2312"%> <HTML> <HEAD> <TITLE>Cookie的使用</TITLE> </HEAD> <BODY> <% // 通過request對象,取得client設置的全部Cookie // 實際上client的Cookie是通過HTTP頭信息發送到server端上的 Cookie c[] = request.getCookies() ; %> <% for(int i=0;i<c.length;i++){ Cookie temp = c[i] ; %> <h1><%=temp.getName()%> --> <%=temp.getValue()%></h1> <% } %> </BODY> </HTML>
2.3、session對象
session 對象是由server自己主動創建的與用戶請求相關的對象。server為每一個用戶都生成一個session對象,用於保存該用戶的信息,跟蹤用戶的操作狀態。session對象內部使用Map類來保存數據,因此保存數據的格式為 “Key/value”。 session對象的value能夠使復雜的對象類型。而不僅僅局限於字符串類型。
(1)session(會話)對象是類javax.servlet.Httpsession的一個對象。session是從client連接server開始。到與server斷開為止。
(2)session對象用於保存每一個與server建立連接的client的信息,session的ID保存於client的Cookie中,這個session ID標識唯一和用戶,與其它用戶的session ID不同。
(3)session對象的ID:
當一個client訪問server的一個JSP頁面時,JSP引擎產生一個session對象,同一時候分配一個String類型的ID號,並發給client。
client將其存儲於Cookie.a其標志了一個唯一的ID。採用getID()方法返回session對象在server端的編號。server端通過此ID,唯一地識別一個用戶,並提供特殊的服務。
(4)session對象的有效期:
存在以下幾個情況時,session對象和其存儲的數據會消失。情況有:
當用戶關閉當前正在使用的瀏覽器時。
關閉網頁server。
用戶未向server提出請求超預設時,Tomcatserver預設為30分鍾;
執行程序結束session.
出現以上四種情況時。session對象會消失。
以下是一個簡單的session登陸實例:
login.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> <form action="login.jsp" method="post"> username:<input type="text" name="uname"><br> 密 碼:<input type="password" name="upass"><br> <input type="submit" value="登錄"> <input type="reset" value="重置"> </form> <% String name = (String)request.getParameter("uname"); String password = (String)request.getParameter("upass"); if(!(name == null || "".equals(name) || password == null || "".equals(password))){ if("linlin".equals(name) && "123456".equals(password)){ //假設登錄成功,則設置session的屬性范圍 session.setAttribute("userid", name); response.setHeader("refresh","3;URL= welcome.jsp"); %> <h3>用戶登錄成功!三秒后跳轉到歡迎頁……</h3> <h3>假設沒有跳轉。請按<a href="welcome.jsp">這里</a></h3> <% }else{ %> <h3>錯誤的username或密碼。</h3> <% } } %> </body> </html>
welcome.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> <% //假設已經設置過了session屬性,則肯定不為空 if(session.getAttribute("userid") != null){ %> <h3>歡迎<%=session.getAttribute("userid")%>登陸~~~~~~~~~~<a href="logout.jsp">注銷</a></h3> <% }else{ %> <h3>請先進行本系統的<a href="login.jsp">登錄</a></h3> <% } %> </body> </html>
logout.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> <% response.setHeader("refresh", "2;URL=login.jsp"); session.invalidate(); //注銷表示當前的session失效 %> <h3>你已成功退出本系統,兩秒后返回到首頁。</h3> <h3>假設沒有跳轉,請按<a href="login.jsp">這里</a></h3> 首頁 </body> </html>
結果例如以下:輸入正確username與password后,等三秒,自己主動跳轉到歡迎界面welcome.jsp。歡迎界面里點注銷,重定向的注銷界面login.jsp,等2秒后自己主動跳轉到login.jsp
2.4、application對象
application 對象可將信息保存在server中,直到server關閉。否則application對象中保存的信息會在整個應用中都有效。
與session對象相比,application對象生命周期更長。相似於系統的“全局變量”。
運用實例:網頁訪問計數器。
<%@page import="java.util.*"%> <%@ 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> <body> <% if(application.getAttribute("counter") == null) { application.setAttribute("counter", "1"); } else { String strnum = null; strnum = application.getAttribute("counter").toString(); int icount = 0; icount = Integer.valueOf(strnum).intValue(); icount++; application.setAttribute("counter", Integer.toString(icount)); } %> 您是第<%=application.getAttribute("counter") %>位訪問者! </body> </html>
輸出結果:
執行結果就是訪問到該頁面之后顯示你是第幾位訪客,刷新之后數目會添加,更換瀏覽器或者更換client地址都會使其訪問值正常遞增。
application的存活范圍比request和session都要大。僅僅要server沒有關閉,application對象中的數據就會一直存在,在整個server的執行過程當中,application對象僅僅有一個。它會被全部的用戶共享。當中getRealPath這種方法能夠獲取資源在server上的物理路徑(絕對路徑),經常使用來獲取上傳文件時要存儲文件的路徑。
2.5、out 對象
out 對象用於在Web瀏覽器內輸出信息,而且管理應用server上的輸出緩沖區。
在使用 out 對象輸出數據時,能夠對數據緩沖區進行操作,及時清除緩沖區中的殘余數據,為其它的輸出讓出緩沖空間。待數據輸出完畢后,要及時關閉輸出流。
out對象的方法
clear()清除網頁上輸出的內容 clearBuffer()清除緩沖去的內容 close()關閉緩沖區,清除全部的內容 getBufferSize()取得緩沖區的大小 getRemaining()取得緩沖區剩余大小 isAutoFlush()獲取緩沖是否進行自己主動清除的信息 print()進行頁面輸出 println()進行頁面輸出並換行
使用out對象進行頁面的輸出
<%@ page language="java" contentType="text/html;charset=gb2312" %> <!DOCTYPE html> <html> <head> <title>使用out對象輸出內容</title> </head> <body> <% out.print("hello world"); out.println("hello world"); %> </body> </html>這里在頁面上輸出是沒有什么差別的,假設想換行要使用html元素<br />
使用out對象獲得緩沖區使用大小
<%@ page language="java" contentType="text/html;charset=gb2312" %> <!DOCTYPE html> <html> <head> <title>使用out對象求的緩沖區使用的大小</title> </head> <body> <% int all = out.getBufferSize(); int remain = out.getRemaining(); int use = all - remain; out.println("總的緩沖區大小為:"+all+"<br />"); out.println("正在使用的緩沖區的大小為:"+remain+"<br />"); out.println("剩余的緩沖區的大小為:"+use+"<br />"); %> </body> </html>
輸出結果
2.6、pageContext 對象
pageContext 對象的作用是取得不論什么范圍的參數,通過它能夠獲取 JSP頁面的out、request、reponse、session、application 等對象。
pageContext對象的創建和初始化都是由容器來完畢的。在JSP頁面中能夠直接使用 pageContext對象。
這個對象代表頁面上下文,該對象主要用於訪問JSP之間的共享數據。
pageContext是PageContext類的實例。使用pageContext能夠訪問page、request、session、application范圍的變量。getAttribute(String name):取得page范圍內的name屬性。 getAttribute(String name,int scope):取得指定范圍內的name屬性,當中scope能夠是例如以下4個值: PageContext.PAGE_SCOPE:相應於page范圍。 PageContext.REQUEST_SCOPE:相應於request范圍。
PageContext.SESSION_SCOPE:相應於session范圍。 PageContext.APPLICATION_SCOPE:相應於application范圍。
實例:
<%@page import="java.util.*"%> <%@ 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> <% //使用pageContext設置屬性。該屬性默認在page范圍內 pageContext.setAttribute("name","lin-pageContext"); request.setAttribute("name","lin-request"); session.setAttribute("name","lin-session"); application.setAttribute("name","lin-application"); %> page設定的值:<%=pageContext.getAttribute("name")%><br> request設定的值:<%=pageContext.getRequest().getAttribute("name")%><br> session設定的值:<%=pageContext.getSession().getAttribute("name")%><br> application設定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 范圍1內的值:<%=pageContext.getAttribute("name",1)%><br> 范圍2內的值:<%=pageContext.getAttribute("name",2)%><br> 范圍3內的值:<%=pageContext.getAttribute("name",3)%><br> 范圍4內的值:<%=pageContext.getAttribute("name",4)%><br> <!--從最小的范圍page開始。然后是reques、session以及application--> <%pageContext.removeAttribute("name",3);%> pageContext改動后的session設定的值:<%=session.getValue("name")%><br> <%pageContext.setAttribute("name","lin-modify",4);%> pageContext改動后的application設定的值:<%=pageContext.getServletContext().getAttribute("name")%><br> 值的查找:<%=pageContext.findAttribute("name")%><br> 屬性name的范圍:<%=pageContext.getAttributesScope("name")%><br> </body> </html>
輸出結果:
2.7、config 對象
config 對象的主要作用是取得server的配置信息。通過 pageConext對象的 getServletConfig() 方法能夠獲取一個config對象。當一個Servlet 初始化時。容器把某些信息通過 config對象傳遞給這個 Servlet。 開發人員能夠在web.xml 文件里為應用程序環境中的Servlet程序和JSP頁面提供初始化參數。
config 對象代表當前JSP 配置信息,但JSP 頁面通常無須配置。因此也就不存在配置信息。
該對象在JSP 頁面中非常少用,但在Servlet 則用處相對較大。由於Servlet 須要配置在web.xml 文件里,能夠指定配置參數。
<%@page import="java.util.*"%> <%@ 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> <!-- 直接輸出config的getServletName的值 --> <%=config.getServletName()%> <!-- 輸出該JSP中名為name的參數配置信息 --> name配置參數的值:<%=config.getInitParameter("name")%><br/> <!-- 輸出該JSP中名為age的參數配置信息 --> age配置參數的值:<%=config.getInitParameter("age")%> </body> </html>web.xml配置里加上:
<servlet> <!--指定servlet的名字--> <servlet-name>config</servlet-name> <!--指定哪一個JSP頁面配置成Servlet--> <jsp-file>/configObject.jsp</jsp-file> <!--配置名為name的參數,值為linbingwen--> <init-param> <param-name>name</param-name> <param-value>linbingwen</param-value> </init-param> <!--配置名為age的參數。值為30--> <init-param> <param-name>age</param-name> <param-value>100</param-value> </init-param> </servlet> <servlet-mapping> <!--指定將config Servlet配置到/config路徑--> <servlet-name>config</servlet-name> <url-pattern>/config</url-pattern> </servlet-mapping>輸出結果:
2.8、page 對象
page 對象代表JSP本身。僅僅有在JSP頁面內才是合法的。
page隱含對象本質上包括當前 Servlet接口引用的變量,相似於Java編程中的 this 指針。
1 什么是page對象 ?
(1) page對象代表JSP頁面本身
page對象是當前JSP頁面本身的一個實例,page對象在當前JSP頁面中能夠用thiskeyword來替代。
(2) 在JSP頁面哪些地方能夠使用page對象
在JSP頁面的Java程序片中能夠使用page對象
在JSP頁面的JSP表達式中能夠使用page對象
(3) page對象的基類是:java.lang.Object類。
注意:假設直接通過page對象來調用方法,就僅僅能調用Object類中的那些方法。
(4) javax,servlet.jsp.JspPage接口
JspPage接口繼承於javax.servlet.Servlet接口。
我們能夠使用JspPage接口對page對象進行強制類型轉換,再調用JspPage接口中的各種方法。
(5) javax,servlet.jsp.HttpJspPage接口
HttpJspPage接口繼承於:
javax.servlet.jsp.JspPage接口和javax.servlet.Servlet接口。
我們能夠使用HttpJspPage接口對page對象進行強制類型轉換,再調用HttpJspPage接口中的各種方法。
(6) 在JSP頁面中使用thiskeyword。可調用哪些方法?
在JSP頁面中,thiskeyword表示當前JSP頁面這個對象,能夠調用的常見方法,例如以下所看到的:
例如以下實例:
<%@page import="java.util.*"%> <%@ 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> 取page的值:<%=this.getServletInfo() %> </body> </html>輸出結果:
2.9、exception 對象
Exception對象是用來處理Jsp頁面文件在執行時全部發生的錯誤和異常;Jsp頁面文件必須在isErrorPage=true的情況下才干夠使用該對象。該對象一般配合Page指令一起使用。通過指定某個頁面為錯誤處理頁面,把全部的錯誤都集中到那個頁面進行處理,能夠使整個系統的性能得到加強;經常用法例如以下
getMessage():返回錯誤信息
toString:以字符串的形式返回一個對異常的描寫敘述
printStackTrace():以標准錯誤的形式輸出一個錯誤和錯誤的堆棧
(1) 可能出錯的頁面:
在有可能產生異常或錯誤的JSP頁面中。使用page指令設置errorPage屬性。屬性值為能夠進行異常處理的某個JSP頁面。
簡單來說,僅僅要在當前JSP頁面中產生了異常,就交給另外一個專門處理異常的JSP頁面。
(2) 專門處理錯誤的頁面:
在專門負責處理異常的JSP頁面中,使用page指令設置isErrorPage屬性為true,並使用exception對象來獲取出錯信息。
error.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" import="java.util.*" isErrorPage="true"%> <%@ page import="java.io.PrintStream" %> <!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> <%=exception %><br /> <%=exception.getMessage() %><br /> <%=exception.getLocalizedMessage() %><br /> <% exception.printStackTrace(new java.io.PrintWriter(out)); %> </body> </html>出錯的頁面
<%@page import="java.util.*"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="error.jsp"%> <!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> <% int[] arr = {1,2,4}; out.println(arr[3]); %> </body> </html>輸出的結果:
不加errorPage="error.jsp"
這句的話:代碼就會暴出來了