JSP 內(nèi)置對象詳解

內(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)置對象

  1. 五大常用的內(nèi)置對象:out、request、reponse、session、application
  2. 不常用的內(nèi)置對象:Page、pageContext、exception、config

get 與 post

  • 表單的一般形式 :
    < form name="regForm" action="動作" method="提交方式" >
  • 表單的兩種提交方式:get 與 post
    1. get:以明文的的方式通過URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到。提交的數(shù)據(jù)最多不超過2KB,安全性較低但速率比 post 方式高。適合提交的數(shù)據(jù)量不大,且安全性較低的數(shù)據(jù),比如搜索、查詢等功能。
    2. 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)容常用的對象
  • 常用方法如下
    1. void println() 向客戶端打印字符串
    2. void flush() 將緩沖區(qū)的內(nèi)容輸出到客戶端
    3. void clear() 清楚緩存區(qū)的內(nèi)容,如果在 flush 之后則調(diào)用會拋出異常
    4. void clearBuffer() 清楚緩沖區(qū)的內(nèi)容,如果在 flush 之后調(diào)用不會出現(xiàn)異常
    5. int getBufferSize() 返回緩沖區(qū)字節(jié)數(shù)大小,若不設設置緩沖區(qū)則為0
    6. int getRemaining() 返回緩沖區(qū)還剩余多少字節(jié)可用
    7. boolean isAutoFlush() 返回緩沖區(qū)滿時,是自動清空還是拋出異常

request 內(nèi)置對象

  • 客戶端的請求信息被封裝在 request 對象中,通過它才能了解到客戶的需求,然后做出相應。它是 HttpServletRequest類的實例。request 具有請求域,即在完成用戶請求前,該對象一直有效。

  • 常見的方法

    1. 請求方法名:request.getMethod
    2. 請求的資源:request.getRequestURL
    3. 請求使用的協(xié)議:request.getProtocol
    4. 請求使用的服務器 IP:request.getServerName
    5. 請求的服務器端口:request.getServerPort
    6. 客戶端的 IP 地址:request.getRemoteAddr
    7. 客戶端的主機名:request.getRemoteHost
    8. 獲取表單提交的值:request.getParameter
    9. 返回請求者的MIME類型:request.getContentType
    10. 獲取表單提交的多個值:request.getParameterValues
    11. web 組件之間共享信息,儲存:request.setAttribute
    12. 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]+" &nbsp");
            }
        %>
</body>
</html>

reponse 內(nèi)置對象

  • reponse 對象包含了響應客戶端請求的有關(guān)信息,但在 jsp 中很少直接使用到它。他是 HttpServletResponse 類的實例。reponse 對象具有頁面作用域,即方位一個頁面時,該頁面內(nèi)的 reponse 對象只能對這次訪問有效,其他頁面的 reponse 對象對當前頁面無效。
  • 常用方法如下
    1. String getCharacterEncoding() 返回響應用的何種字符編碼
    2. void setContentType(String type) 設置響應的MIME類型
    3. PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象(注意與內(nèi)置對象out的區(qū)別:一般情況下,PrintWriter 的輸出都會在內(nèi)置對象out之前顯示,即使PrintWriter 代碼靠后,但是可以在out 之后調(diào)用flush 方法可以解決)
    4. 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)建的,完成會話期的管理
  • 當一個客戶訪問一個服務器時,可能會在服務器的幾個頁面之間來回切換,此時服務器就應該有某種方法來知道這是同一個用戶
  • 常用方法
    1. long getCreationTime() 返回 session 的創(chuàng)建時間
    2. String getId() 返回 session 創(chuàng)建時JSP引擎為它創(chuàng)建的唯一ID號
    3. Object setAttribute(String name,Object value) 使用指定名稱將對象綁定到此會話
    4. Object getAttribute(String name) 返回與此會話中的指定名稱綁定在一起時的對象,若無則返回null
    5. String[] getValueNames() 返回一個包含此session中所有可用屬性的數(shù)組
    6. 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]+" &nbsp");
                        }
                    %><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 類的實例
  • 常用方法
    1. void setAttribute(String name,Object value) 使用指定的名稱將對象綁定到會話
    2. Object getAttribute(String name) 返回與會話名稱綁在一起的對象,如果沒有對象綁定在此名稱下,則返回 null
    3. Enumeration getAttributeNames() 返回所有可用屬性名的枚舉類型
    4. 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 類的實例
  • 常用方法
    1. class getClass() 返回此 Object 的類
    2. int hashCode() 返回此 Objcet 的 hash 碼
    3. boolean equals(Object obj) 判斷此 Object 是否與指定的 Object 對象相等
    4. void copy(Object obj) 把此 Object 拷貝到指定的 Object 對象中
    5. Object clone() 克隆此 Object 對象
    6. String toString() 把此 Object 對象轉(zhuǎn)換成 String 類的對象
    7. void notify() 喚醒一個等待的線程
    8. void notifyAll() 喚醒所有等待的線程
    9. void wait(int timeout) 使一個線程處于等待直到 timeout 結(jié)束或被喚醒
    10. 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
  • 常用方法
    1. JspWriter getOut() 返回當前客戶端響應被使用的 JspWriter 流(out)
    2. HttpSession getSession() 返回當前客戶端響應被使用的 HttpSession 對象(session)
    3. Object getPage() 返回當前頁面的 Object 對象(page)
    4. ServletRequest getRequest() 返回當前頁的 ServletRequest 對象(request)
    5. ServletResponse() 返回當前頁面的 ServletResponse 對象(response)
    6. void setAttribute(String name,Object attribute) 設置屬性及屬性值
    7. Object getAttribute(String name,int scope) 在指定范圍內(nèi)獲取屬性的值
    8. int getAttributeScope(String name) 返回某屬性的作用范圍
    9. void forward(String relativeUrlPath) 返回當前頁面重導另一個頁面
    10. void include(String relativeUrlPath) 在當前位置包含另一文件

Config 內(nèi)置對象

  • Config 對象是在一個Servlet 初始化時,JSP 引擎向它傳遞信息用的,此信息包括 Servlet 初始化時所需要用到的參數(shù)(通常屬性名和屬性值構(gòu)成)以及服務器有關(guān)信息(通過傳遞一個ServletContext 對象)
  • 常用方法
    1. ServletContext getServletContext() 返回有關(guān)服務器相關(guān)信息的ServletContext 對象
    2. String getInitParameter(String name) 返回初始化參數(shù)的值
    3. Enumeration getInitParameterNames() 返回 Servlet 初始化所需所有參數(shù)的枚舉

Exception 內(nèi)置對象

  • Exception 對象是一個異常對象,當一個頁面運行中發(fā)生了異常,就產(chǎn)生了這個對象。如果一個 Jsp 頁面要引用此對象,就必須 isErrorPage 設為 true ,否則無法編譯。它實際上市 java.lang,Throwable 的對象
  • 常用方法
    1. String getMessage() 返回描述異常消息
    2. String toString() 返回有關(guān)異常的簡短描述消息
    3. void printStackTrace() 顯示異常及其棧軌跡
    4. Throwable FillInStackTrace() 重寫異常的執(zhí)行棧軌跡
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • JSP內(nèi)置對象是為了簡化JSP頁面開發(fā)而建立的一些內(nèi)部對象。這些對象不需要聲明,可以在程序中直接使用。它們是JSP...
    世外大帝閱讀 1,252評論 0 5
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,753評論 18 399
  • JSP(Java Server Pages),其根本是一個簡化的 Servlet 設計,實現(xiàn)了在 Java 當中使...
    靜候那一米陽光閱讀 1,037評論 0 1
  • frame簡析 1. frame = function (anchorPoint, position, boun...
    我花開后百花殺閱讀 2,034評論 0 0
  • Day6:第六章 應用邏輯順序 閱讀:《金字塔原理》 時間:140min‘ 問題:暫無 這部分作者描述編輻比較多,...
    步青云教育閱讀 243評論 0 0

友情鏈接更多精彩內(nèi)容