內(nèi)置對象簡介
- JSP 內(nèi)置對象是 Web 容器創(chuàng)建的一組對象,不需使用 new 關(guān)鍵字就可以直接使用的內(nèi)置對象。
代碼 1
<%
int[] value = {10,20,30};
for(int i : value){ //Java 中for循環(huán)的增強形式
out.println(value[i]); //out 為 JSP 中的內(nèi)置對象
}
%>
九大內(nèi)置對象
- 五大常用的內(nèi)置對象:out、request、reponse、session、application
- 不常用的內(nèi)置對象:Page、pageContext、exception、config
get 與 post
- 表單的一般形式 :
< form name="regForm" action="動作" method="提交方式" > - 表單的兩種提交方式:get 與 post
- get:以明文的的方式通過URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到。提交的數(shù)據(jù)最多不超過2KB,安全性較低但速率比 post 方式高。適合提交的數(shù)據(jù)量不大,且安全性較低的數(shù)據(jù),比如搜索、查詢等功能。
- post:將用戶提交的數(shù)據(jù)、信息封裝在 HTML HEADER 內(nèi)。適合提交數(shù)據(jù)量大,安全性高的用戶信息,比如注冊、修改、上傳等功能。
緩沖區(qū)
- 緩沖區(qū):Buffer,所謂緩沖區(qū)就是內(nèi)存的一塊區(qū)域用來保存臨時的數(shù)據(jù)。舉個例子,剛煮好的一大鍋米飯,一粒一粒吃會吃得很慢,而我們就會選擇把米飯乘到碗里,一碗一碗吃豈不痛快。淡然,也可以把勺子當做容器,將米飯在不同的容器中傳遞,最后通過勺子吃掉,在這里勺子就可以看做緩沖區(qū),多個字節(jié)在不同的緩沖區(qū)傳遞
out 內(nèi)置對象
- out 對象是JspWriter類實例,是向客戶端輸出內(nèi)容常用的對象
- 常用方法如下
- void println() 向客戶端打印字符串
- void flush() 將緩沖區(qū)的內(nèi)容輸出到客戶端
- void clear() 清楚緩存區(qū)的內(nèi)容,如果在 flush 之后則調(diào)用會拋出異常
- void clearBuffer() 清楚緩沖區(qū)的內(nèi)容,如果在 flush 之后調(diào)用不會出現(xiàn)異常
- int getBufferSize() 返回緩沖區(qū)字節(jié)數(shù)大小,若不設設置緩沖區(qū)則為0
- int getRemaining() 返回緩沖區(qū)還剩余多少字節(jié)可用
- boolean isAutoFlush() 返回緩沖區(qū)滿時,是自動清空還是拋出異常
request 內(nèi)置對象
客戶端的請求信息被封裝在 request 對象中,通過它才能了解到客戶的需求,然后做出相應。它是 HttpServletRequest類的實例。request 具有請求域,即在完成用戶請求前,該對象一直有效。
-
常見的方法
- 請求方法名:request.getMethod
- 請求的資源:request.getRequestURL
- 請求使用的協(xié)議:request.getProtocol
- 請求使用的服務器 IP:request.getServerName
- 請求的服務器端口:request.getServerPort
- 客戶端的 IP 地址:request.getRemoteAddr
- 客戶端的主機名:request.getRemoteHost
- 獲取表單提交的值:request.getParameter
- 返回請求者的MIME類型:request.getContentType
- 獲取表單提交的多個值:request.getParameterValues
- web 組件之間共享信息,儲存:request.setAttribute
- web 組件之間共享信息,獲?。簉equest.getAttribute
下面以一個錄入注冊例子簡單理解 request
先是 用戶注冊 register.jsp,這里只要是創(chuàng)建了一個表單,有用戶名、密碼、愛好幾個注冊內(nèi)容塊。
代碼2
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>錄入注冊信息</title>
</head>
<body>
<h1>用戶注冊</h1>
<hr>
<form action="do_register.jsp" methed="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name = "userName"></td>
</tr>
<tr>
<td>密碼</td>
<td><input type="password" name = "passWord"></td>
</tr>
<tr>
<td>愛好:</td>
<td>
<input type="checkbox" name="favorite" value="Java">Java
<input type="checkbox" name="favorite" value="Android">Android
<input type="checkbox" name="favorite" value="JavaWeb">JavaWeb
<input type="checkbox" name="favorite" value="PHP">PHP
<input type="checkbox" name="favorite" value="IOS">IOS
</td>
</tr>
<td colspan="2"> <input type = "submit" value = "提交"> </td>
</table>
</form>
</body>
</html>
- 再是處理注冊信息 do_register.jsp,這里主要是通過request 來處理注冊的信息
代碼 3
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>處理注冊信息</title>
</head>
<body>
<%
String userName = request.getParameter("userName");
String passWord = request.getParameter("passWord");
//利用out內(nèi)置對象輸出
out.println(userName);
out.println("<br>");
out.println(passWord);
%><br>
<%
String favorite[] = request.getParameterValues("favorite");
out.print("<br>");
for(int i=0; i<favorite.length; i++){
out.println(favorite[i]+"  ");
}
%>
</body>
</html>
reponse 內(nèi)置對象
- reponse 對象包含了響應客戶端請求的有關(guān)信息,但在 jsp 中很少直接使用到它。他是 HttpServletResponse 類的實例。reponse 對象具有頁面作用域,即方位一個頁面時,該頁面內(nèi)的 reponse 對象只能對這次訪問有效,其他頁面的 reponse 對象對當前頁面無效。
- 常用方法如下
- String getCharacterEncoding() 返回響應用的何種字符編碼
- void setContentType(String type) 設置響應的MIME類型
- PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象(注意與內(nèi)置對象out的區(qū)別:一般情況下,PrintWriter 的輸出都會在內(nèi)置對象out之前顯示,即使PrintWriter 代碼靠后,但是可以在out 之后調(diào)用flush 方法可以解決)
- sendRedirect(java.lang.String location) 重新定向客戶端的請求
代碼 4
<%@page import="java.io.PrintWriter"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
//設置響應的MIME類型
response.setContentType("text/html;charset=utf-8");
out.println("<h1>reponse內(nèi)置對象</h1>");
out.println("<br>");
//out.flush();//將緩沖區(qū)內(nèi)容輸出到客戶端,避免先顯示 PrintWriter 輸出
PrintWriter outer = response.getWriter();
outer.println("這是reponse對象生成的輸出流");
//請求重定向到register 代碼2, 此時將flush()注釋掉不然會拋出異常
response.sendRedirect("register.jsp");
%>
- 請求重定向:客戶端行為,response.sedRedirect(),從本質(zhì)上講等同于兩次請求,前一次的請求對象不會保存,地址欄的的URL會發(fā)生改變??梢赃@么理解,你先乘車去了A公司,但是A公司的人說這個事不歸他們管,讓你去去B公司;然后你就從A公司退了出來,自己乘車去了B公司。
- 請求轉(zhuǎn)發(fā):服務器行為,request.getRequestDispatcher().forworder(req,resp);適宜次請求,轉(zhuǎn)發(fā)后請求對象會保存,地址欄的URL地址不會改變。一樣也可以這樣理解,你去A公司辦事,A公司看了以后發(fā)現(xiàn)這件事該歸B公司管,但是并沒有把你退回來,而是A公司自己去聯(lián)系了B公司,讓B公司辦好后,送了過來
session 內(nèi)置對象
- session 對象是 HttpSession 類的實例
- session 表示客戶端與服務器的一次會話,在服務的內(nèi)存在保存著不同用戶的 session 對象。
- Web 中的 session 指的是用戶在游覽某個網(wǎng)站時,從進入網(wǎng)站到關(guān)閉游覽器所經(jīng)過的這段時間,也就是用戶游覽這個網(wǎng)站的所花費的時間,session 實際上就是一個特定的時間概念
- session 對象是在第一個JSP頁面被裝載時自動創(chuàng)建的,完成會話期的管理
- 當一個客戶訪問一個服務器時,可能會在服務器的幾個頁面之間來回切換,此時服務器就應該有某種方法來知道這是同一個用戶
- 常用方法
- long getCreationTime() 返回 session 的創(chuàng)建時間
- String getId() 返回 session 創(chuàng)建時JSP引擎為它創(chuàng)建的唯一ID號
- Object setAttribute(String name,Object value) 使用指定名稱將對象綁定到此會話
- Object getAttribute(String name) 返回與此會話中的指定名稱綁定在一起時的對象,若無則返回null
- String[] getValueNames() 返回一個包含此session中所有可用屬性的數(shù)組
- int getMaxInactiveInterval() 返回兩次請求間隔時間多長時間此session被取消
- 請結(jié)合以下代碼理解
代碼 5
<%@page import="java.text.SimpleDateFormat,java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>session內(nèi)置對象</title>
</head>
<h1>session內(nèi)置對象</h1>
<hr>
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
session.setAttribute("userName", "admin");
session.setAttribute("otherName", "otherUser");
//設置當前session最大生命期限 單位是秒
session.setMaxInactiveInterval(5);//10秒鐘
%>
session 創(chuàng)建時間:<%= sdf.format(new Date(session.getCreationTime())) %><br>
獲取session的ID:<%=session.getId() %><br>
從 session 中獲取用戶名:<%= session.getAttribute("userName") %><br>
獲取所有可用屬性的值:<%
String str[] = session.getValueNames();
for(int i=0;i<str.length;i++)
{
out.println(str[i]+"  ");
}
%><br>
<a href="reponse.jsp" target="_blank">跳轉(zhuǎn)到response.jsp</a>
<body>
</body>
</html>
session 的生命周期
- 創(chuàng)建:當客戶端第一次訪問某個JSP或者 Servlet 時候,服務器會為當前會話創(chuàng)建一個 session ID,每次客戶端向服務器發(fā)送請求時,都會將此 ID 攜帶過去與服務器進行校檢。
- 活動:某次會話當中通過超鏈接打開得新頁面屬于同一次會話;只要當前全部會話頁面沒有全部關(guān)閉,重新打開的新的游覽器窗口訪問同一個項目資源屬于同一個會話;除非將本次會話的所有頁面全部關(guān)閉,再次訪問就會創(chuàng)建新的session ID。注意事項,原有會話還會存在,只是這個舊的session ID 任然存在于服務器,只不過再也沒有客戶端攜帶者它來向服務器訪問了。
- 銷毀:Session 的三種銷毀方式,調(diào)用 session.invalidate() 方法;session 過期(超時);服務器重新啟動。
application 內(nèi)置對象
- application 對象實現(xiàn)了用戶間的數(shù)據(jù)共享,可存放全局變量
- application 開始于服務器的啟動,終止于服務器的關(guān)閉
- 在用戶的前后連接和不同用戶之間的連接中,可以對 application 同一屬性進行操作
- 在任何地方對 application 對象進行操作,都將影響到其他用戶對此的訪問
- 服務器的啟動和關(guān)閉決定了 application 的聲明周期
- application 對象是 ServletContext 類的實例
- 常用方法
- void setAttribute(String name,Object value) 使用指定的名稱將對象綁定到會話
- Object getAttribute(String name) 返回與會話名稱綁在一起的對象,如果沒有對象綁定在此名稱下,則返回 null
- Enumeration getAttributeNames() 返回所有可用屬性名的枚舉類型
- String getServerInfo() 返回 JSP(SERVLET) 引擎名及版本號
- 請結(jié)合以下代碼分析
代碼 6
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.util.*"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>application.jsp</title>
</head>
<%
application.setAttribute("name", "小明");
application.setAttribute("age", "10");
%>
名字是:<%=application.getAttribute("name") %><br>
獲取application所有屬性:<%
Enumeration attribute = application.getAttributeNames();
while(attribute.hasMoreElements())
out.println(attribute.nextElement());
%><br>
當前引擎名及版本號:<%=application.getServerInfo() %>
<body>
</body>
</html>
Page 內(nèi)置對象
- Page 對象就是指向當前JSP頁面本身,有點像類中的 this,它是 java.long.Object 類的實例
- 常用方法
- class getClass() 返回此 Object 的類
- int hashCode() 返回此 Objcet 的 hash 碼
- boolean equals(Object obj) 判斷此 Object 是否與指定的 Object 對象相等
- void copy(Object obj) 把此 Object 拷貝到指定的 Object 對象中
- Object clone() 克隆此 Object 對象
- String toString() 把此 Object 對象轉(zhuǎn)換成 String 類的對象
- void notify() 喚醒一個等待的線程
- void notifyAll() 喚醒所有等待的線程
- void wait(int timeout) 使一個線程處于等待直到 timeout 結(jié)束或被喚醒
- void wait() 是一個線程處于等待直到被喚醒
- 通過觀察以上的方法基本上都是 Object 類中方法的實現(xiàn),以下就選擇常用的 toString 方法實驗
代碼 7
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Page.jsp</title>
</head>
當前page頁面對象字符串描述:<%=page.toString() %><br>
<body>
</body>
</html>
打印的為:
當前page頁面對象字符串描述:org.apache.jsp.InnerObject.Page_jsp@526f75ab
PageContext 內(nèi)置對象
- pageContext 對象提供了對JSP頁面內(nèi)所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的 SESSION .也可以取本頁面所在的 application 的某一屬性值
- 它相當于頁面中所有功能的集大成者,它的本類名也叫 pageContext
- 常用方法
- JspWriter getOut() 返回當前客戶端響應被使用的 JspWriter 流(out)
- HttpSession getSession() 返回當前客戶端響應被使用的 HttpSession 對象(session)
- Object getPage() 返回當前頁面的 Object 對象(page)
- ServletRequest getRequest() 返回當前頁的 ServletRequest 對象(request)
- ServletResponse() 返回當前頁面的 ServletResponse 對象(response)
- void setAttribute(String name,Object attribute) 設置屬性及屬性值
- Object getAttribute(String name,int scope) 在指定范圍內(nèi)獲取屬性的值
- int getAttributeScope(String name) 返回某屬性的作用范圍
- void forward(String relativeUrlPath) 返回當前頁面重導另一個頁面
- void include(String relativeUrlPath) 在當前位置包含另一文件
Config 內(nèi)置對象
- Config 對象是在一個Servlet 初始化時,JSP 引擎向它傳遞信息用的,此信息包括 Servlet 初始化時所需要用到的參數(shù)(通常屬性名和屬性值構(gòu)成)以及服務器有關(guān)信息(通過傳遞一個ServletContext 對象)
- 常用方法
- ServletContext getServletContext() 返回有關(guān)服務器相關(guān)信息的ServletContext 對象
- String getInitParameter(String name) 返回初始化參數(shù)的值
- Enumeration getInitParameterNames() 返回 Servlet 初始化所需所有參數(shù)的枚舉
Exception 內(nèi)置對象
- Exception 對象是一個異常對象,當一個頁面運行中發(fā)生了異常,就產(chǎn)生了這個對象。如果一個 Jsp 頁面要引用此對象,就必須 isErrorPage 設為 true ,否則無法編譯。它實際上市 java.lang,Throwable 的對象
- 常用方法
- String getMessage() 返回描述異常消息
- String toString() 返回有關(guān)異常的簡短描述消息
- void printStackTrace() 顯示異常及其棧軌跡
- Throwable FillInStackTrace() 重寫異常的執(zhí)行棧軌跡