JSP 九大物件、四大作用域、七大行為動作、三大指令

正氣八方發表於2020-12-26
  • jsp九大內建物件

 

物件

描述

request

HttpServletRequest類的例項

response

HttpServletResponse類的例項

out

JspWriter類的例項,用於把結果輸出至網頁上

session

HttpSession類的例項

application

ServletContext類的例項,與應用上下文有關

config

ServletConfig類的例項

pageContext

PageContext類的例項,JSP獨有,Servlet沒有,javax.servlet.jsp.JspContext 的子類
預設的單引數set、get方法,對作用域page的內容做存取,page域的作用域最小。
pageContext.setAttribute("x", "X");

但其支援雙引數的set、get方法,去存取request、session、application作用域。

雙引數使用時,1個頂9個,可以使用pageContext, 向request、session、application物件中存取資料
void  setAttribute(String name, Object value, int scope):在指定範圍中新增資料;
比如:
pageContext.setAttribute("x", "XX",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("x", "XXX",PageContext.SESSION_SCOPE);
pageContext.setAttribute("x", "XXXX", PageContext.APPLICATION_SCOPE);

javax.servlet.jsp.JspContext 的方法,PageContext類物件可用

abstract  java.lang.ObjectfindAttribute(java.lang.String name)
          Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.
abstract  java.lang.ObjectgetAttribute(java.lang.String name)
          Returns the object associated with the name in the page scope or null if not found.
abstract  java.lang.ObjectgetAttribute(java.lang.String name, int scope)
          Return the object associated with the name in the specified scope or null if not found.
 
abstract  voidsetAttribute(java.lang.String name, java.lang.Object value)
          Register the name and value specified with page scope semantics.
abstract  voidsetAttribute(java.lang.String name, java.lang.Object value, int scope)
          Register the name and value specified with appropriate scope semantics.
abstract  voidremoveAttribute(java.lang.String name)
          Remove the object reference associated with the given name from all scopes.
abstract  voidremoveAttribute(java.lang.String name, int scope)
          Remove the object reference associated with the specified name in the given scope.

page


對應page域

在JSP中,類似於Java類中的this關鍵字
從轉換後的Servlet類的程式碼中,可以看到這種關係:Object page = this;
在JSP頁面中,很少使用page物件。

exception

Exception類的物件,代表發生錯誤的JSP頁面中對應的異常物件,page指令的isErrorPage屬性為true時有效

1>JspWriter類的out 向客戶端瀏覽器輸出資料,用法 out.print(" dgaweyr");

  • PrintWriter與JspWriter的區別與聯絡

可以用pageContext.getOut() 得到JspWriter物件out,可以直接用out物件輸出;   
而PrintWriter在JSP頁面中必須用response.getWriter(); 方法得到。

兩者的區別:

第一個區別:PrintWriter的print方法中不會丟擲IOException,而JspWriter會。 

第二個區別:JspWriter是抽象類而PrintWriter不是,也就是說你可以通過new操作來直接新建一個PrintWriter的物件,而JspWriter不行,它必須是通過其子類來新建。

 

兩者的聯絡:(JspWriter的out.print在滿足一定的條件時,才會呼叫PrintWriter的out.print )

聯絡一:JspWriter和PrintWriter都是繼承於java.io.Writer ,
但PrintWriter是Servlet中利用response.getWriter()得到的 ; 而JspWriter的out是JSP內建物件,或者使用pageContext.getOut()得到。

聯絡二:JspWriter可以在JSP頁面中直接用out物件輸出.可以用pageContext.getOut();   得到JspWriter物件。

備註:利用pageContext.getOut();來得到JspWriter物件, 和JSP頁面中封裝的out物件是同一個物件。

PrintWrietr在JSP頁面中必須用response.getWriter();方法得到其物件;   二者作用域不同。

聯絡三:在Jsp頁面上用兩種方法同時輸出資料,PrintWriter中的資料會先輸出。
 

先後輸出舉例:
JspWriter out1 = pageContext.getOut();

out1.print("222");
//或者直接用 out.print("222");

PrintWriter pw = response.getWriter();

pw.print("111");

 

 會輸出: "111"   "222"
 這是因為JspWriter 的 out 物件,在預設情況下,插入到 PrintWriter  緩衝區的後面。

out物件滿足一定條件時,才會呼叫PrintWriter物件的print()方法,把out緩衝區中的內容輸出到瀏覽器端。

  •  附上: out物件呼叫PrintWriter物件的print( )方法輸出緩衝區中的內容的條件:

            ^設定page指令的buffer屬性為"none",關閉了out物件的快取功能,但預設是開啟的。

            ^寫入到out物件中的內容充滿了out物件的緩衝區

            ^整個JSP頁面結束

            ^JSP中呼叫了out.flush()或response.flushbuffer()


 如果按照下面輸出:

JspWriter jspOut1 = pageContext.getOut();

jspOut1.print("222");

jspOut1.flush(); //重新整理緩衝區

PrintWriter pw = response.getWriter();

pw.print("111");

那麼,會輸出 “222” “111”

  • 手冊對JspWriter解釋:

初始JspWriter物件與ServletResponse的PrintWriter物件關聯的方式取決於JSP頁面是否緩衝,即JSP頁面的page指令的buffer屬性值。
如果頁面沒有緩衝,(buffer屬性值為"none"),則寫入此JspWriter物件的輸出將直接寫入PrintWriter

JSP的超過緩衝區時,是重新整理還是引發I/O異常,由page的autoFlush屬性控制,預設為true,即超過緩衝會重新整理,而不是引發異常。
如果autoflush=“false”,那麼如果執行當前操作若導致緩衝區溢位,則該類上的所有I/O操作都將引發IOException

 

 

2>request 物件           代表客戶端瀏覽器傳送的HTTP請求物件.
String getParameter(String name):得到表單引數名name的值.
String[] getParameterValues(String name):(得到String[]核取方塊時常用).
setAttribute(String name,Object obj):設定屬性名為name,屬性值為obj.
getAttribute(String name);得到屬性值.

request.getContextPath() ; 得到當前Web應用,比如test的執行目錄  http://IP:8080/test

request.getRequestDispatcher("/success.jsp").forward(request,response);  把請求轉發到當前web專案資料夾下success.jsp頁面。
 
3>response物件            代表伺服器對客戶端瀏覽器的HTTP響應物件
addCookie(Cookie cookie):
sendRedirect("/welcome.jsp"):    重定向,使得客戶端瀏覽器重新傳送請求到當前伺服器http://IP:8080下的welcome.jsp頁面,但一般這樣不行,一般寫成response.sendRedirect(request.getContextPath() + "/welcome.jsp");


4>session物件              用於儲存使用者資訊,跟蹤使用者行為,當前開啟的瀏覽器內,多個頁面共享資料. 
session物件指的是客戶端與伺服器的一次會話,從客戶連到伺服器的一個WebApp開始,直到客戶端與伺服器斷開連線為止.
它是HttpSession類的例項.

setAttribute(String name,Object obj):設定屬性名為name,屬性值為obj.
getAttribute(String name):得到屬性值.
 
5>application物件       轉化為Servlet後,它是ServletContext類的例項。包含全域性的含義,實現多個Servlet間資料的共享。

java.lang.ObjectgetAttribute(java.lang.String name)
Returns the servlet container attribute with the given name,
or null if there is no attribute by that name.
 voidsetAttribute(java.lang.String name, java.lang.Object object)
          Binds an object to a given attribute name in this servlet context.

它開始於伺服器的啟動,直到伺服器的關閉,在此期間,此物件將一直存在;
這樣在使用者的前後連線或不同使用者之間的連線中,可以對此物件的同一屬性進行存取;
伺服器的啟動和關閉決定了application物件的生命.

6>page物件               代表jsp這個實體本身,只對當前頁面有效.相當於java中的this,對應作用域page

7>.exception:代表執行時的異常.
在會發生異常的頁面加入指令:<%@ page errorPage="處理錯誤的頁面.jsp"%>
在處理異常的頁面寫入:<%@ page isErrorPage="true"%>
 
8>.pageContext物件 pageContext物件提供了對JSP頁面內所有的物件及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當於頁面中所有功能的集大成者,它的本類名也叫pageContext ,
繼承自 javax.servlet.jsp.JspContext

9>.config  對應的ServletConfig類的例項,用於讀取一個工程中web.xml 的初使化引數

 

 

  • JSP的四大作用域

作用域範圍從小到大 :   page  <  request  <  session  <  application
page是本頁面 ,對應JSP的 page 內建物件 (很少用)
request是本請求,對應JSP的 request 內建物件
session是本次瀏覽器會話(瀏覽器關閉之前有效),對應JSP的session 內建物件
application是本伺服器 ,對應JSP的  application 內建物件。
 
這個順序也是EL表示式去查詢變數的順序。

 

  • jsp 七大行為動作  <jsp:      />

一:include 動態包含
動態包含是分別編譯,訪問到<jsp: include page    /> 動態包含的程式碼,就去執行這個目標頁面,得到輸出,之後把輸出作為原jsp頁面的內容,最終再次執行原jsp頁面。

而靜態包含是指令(@page),是把目標檔案程式碼複製過來,再進行一次統一的編譯):
用jsp:include動作實現<jsp: include page="included.jsp" flush="true" />
它總是會檢查所含檔案中的變化,適合用於包含動態頁面,並且可以帶引數。
page屬性: 是相對URL,即,認為在同一樹形層次高度的目錄下。
flush屬性: 用true ,表示頁面可重新整理;預設為false;

動態包含舉例:

date.jsp檔案程式碼:

main.jsp檔案程式碼:

現在將以上兩個檔案放在伺服器的同一個目錄下,訪問main.jsp檔案。
The include action Example
Today's date: 12-Sep-2013 14:54:22

 

二:<jsp:  useBean    /> 動作:

jsp:useBean動作用來裝載一個將來在JSP頁面中使用的JavaBean。預設的scope屬性是作用域page(本頁面有效).

jsp:useBean動作最簡單的語法為:
<jsp:useBean id="name" class="package.class" />

在類載入後,我們既可以通過 jsp:setProperty 和 jsp:getProperty 動作來修改和檢索bean的屬性。

 在給出具體例項前,讓我們先來看下 jsp:setProperty 和 jsp:getProperty 動作元素:
 

三:<jsp:setProperty>動作

 jsp:setProperty用來設定已經例項化的Bean物件的屬性,有兩種用法。首先,你可以在jsp:useBean元素的外面(後面)使用jsp:setProperty,如下所示:

<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName" property="someProperty" .../>

 此時,不管jsp:useBean是找到了一個現有的Bean,還是新建立了一個Bean例項,jsp:setProperty都會執行。第二種用法是把jsp:setProperty放入jsp:useBean元素的內部,如下所示:

<jsp:useBean id="myName" ... >
...
       <jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>

此時,jsp:setProperty只有在新建Bean例項時才會執行,如果是直接使用現有例項則不執行jsp:setProperty,推薦使用這一種!

 useBean動作支援如下屬性:

屬性

描述

id

值是一個字串,用於在今後的set和get中唯一指定

class

指定Bean的完整包名。

type

指定將引用該物件變數的型別。

beanName

通過 java.beans.Beans 的 instantiate() 方法指定Bean的名字。

scope

建立物件預設的有效區域,值是一個字串

page、request、session、appication



setProperty動作,支援以下屬性

屬性

描述

name

name屬性是必需的。它表示要設定屬性的是哪個Bean。

property

property屬性是必需的。它表示要設定哪個屬性。有一個特殊用法:如果property的值是"*",表示所有名字和Bean屬性名字匹配的請求引數都將被傳遞給相應的屬性set方法。

value

value 屬性是可選的。該屬性用來指定Bean屬性的值。字串資料會在目標類中通過標準的valueOf方法自動轉換成數字、boolean、Boolean、 byte、Byte、char、Character。例如,boolean和Boolean型別的屬性值(比如"true")通過 Boolean.valueOf轉換,int和Integer型別的屬性值(比如"42")通過Integer.valueOf轉換。   
value和param不能同時使用,但可以使用其中任意一個。

param

param 是可選的。它指定用哪個請求引數作為Bean屬性的值。如果當前請求沒有引數,則什麼事情也不做,系統不會把null傳遞給Bean屬性的set方法。因此,你可以讓Bean自己提供預設屬性值,只有當請求引數明確指定了新值時才修改預設屬性值。



四:<jsp:getProperty     />  動作
 jsp:getProperty動作提取指定Bean屬性的值,轉換成字串,然後輸出

屬性描述

屬性

描述

name

要檢索的Bean屬性名稱。Bean必須已定義。

property

表示要提取Bean屬性的值


JSP使用動作行為,讀寫Bean例項:

編譯以上例項並生成 TestBean.class 檔案,放入classes目錄,或者封裝進jar檔案後放入lib目錄,注意原始碼的包名是action
下面是一個很簡單的例子main.jsp,它的功能是裝載一個Bean,然後設定/讀取它的message屬性。

訪問以上JSP檔案,會看到下面的顯示
Using JavaBeans in JSP
Got message....
Hello JSP...

注意該三個動作的執行過程:
首先,<jsp:useBean   />動作,使得伺服器載入classes目錄下的 action/TestBean,並進行例項化(如果已有就不會 new);
接著,<jsp:setProperty   />動作, 給記憶體中TestBean例項進行屬性的賦值;
最後,<jsp:getProperty   />動作,讀取記憶體中TestBean例項的某個屬性的值。

 

五:forward動作:
跳轉頁面:<jsp:forward page="login.jsp" />
 該動作常用於MVC架構。

在伺服器端使用forward形式跳轉Servlet時,客戶端位址列會顯示跳轉前的Servlet訪問地址。
也就是說forward跳轉對客戶端瀏覽器是透明的。

在Struts等MVC框架中,都是用Servlet來處理使用者請求,通過request.setAttribute( ),把結果放到request中,然後forward到JSP中顯示。

request.getRequestDispatcher("/success.jsp").forward(request,response);

  • getRequestDispatcher時的相對路徑和絕對路徑問題

以“檔名開頭”,相對路徑,forward時都在當前目錄下找。

以“../”開頭的,相對路徑,forward時都在當前目錄的上一級目錄找。

以“/”開頭,forward時以當前web專案路徑為根目錄找(而不是當前伺服器為根路徑,因為Tomcat上只想執行1個web專案),

以“/”開頭,瀏覽器發HTTP請求時,以http://IP:8080/為根路徑,所以要訪問資源需要加上Web專案的名字,

而以“/”開頭,response的重定向redirect時以http://IP:8080/為根目錄找。

 

通過RequestDispatcher物件的forward(HttpServletRequestrequest, HttpServletResponse response)方法來實現

RequestDispatcher可以通過HttpServletRequest物件request 的getRequestDispatcher()方法獲得。

 

注意:在forward之前儘量不要用out.print()語句向客戶端輸出結果,否則會丟擲IllegalStateException。

請求重定向forward與響應的重定向不同,被請求重定向的瀏覽器,其位址列沒有變化,使用者是無感知的。
響應重定向,是使用相應物件response.setStatus(302);  並且 response.setHeader("location","/ServletTest/servlet2");
使得瀏覽器收到響應後重發一次HTTP請求。表現在客戶端的URL會發生變化。

主要區別

請求轉發: 利用request完成

​ (1)瀏覽器位址列不發生改變,不會變為目標地址

​ (2)請求轉發是伺服器的行為,整個轉發的過程在伺服器中完成

​ (3)整個過程是一次請求,一次響應

​ (4)各個資源共享Request域中的資料

​ (5)可以轉發到WEB-INF目錄下

​ (6)不可以訪問工程以外的資源(如:http://www.baidu.com

響應重定向: 利用response完成

​ (1)瀏覽器位址列發生改變,變為目標地址

​ (2)重定向是瀏覽器的行為,通過響應物件HttpServletResponse來執行

​ (3)整個過程是兩次請求,兩次響應

​ (4)不共享Request域中資料

​ (5)不能訪問WEB-INF目錄下的資源

​ (6)可以訪問工程外的資源(如:http://www.baidu.com
 

六:param動作 ,常用在<jsp:forward>動作內部,作為子動作。

<jsp:param name="引數名" value="引數值">

常常與<jsp:forward>一起使用,作為其子標籤存在。 

可以在請求轉發的forward的目標jsp頁面,通過 request.getParameter(“引數名”)方式取出發來的引數值。
可作為不同的JSP頁面的同一個request的資料共享。
 

七:plugin動作:<jsp:plugin>:用於指定在客戶端執行的外掛
 

  • JSP三大指令(@page  @include  @taglib )

指令(Directive)是一種JSP句法元素,指令是指示JSP轉換器如何把某個JSP頁面轉換成具體的Servlet 的一種命令。
一:page指令
定義頁面的依賴屬性,比如指令碼語言、error頁面、快取需求等等
1、例,指定頁面編碼.
<%@ page  language = "java"      contentType="text/html;charset=gbk" pageEncoding="gbk" %>
2、例,匯入包
<%@ page  import =  "java.util.* , java.text.* " %>

常用的page指令的屬性如下:

①  import 屬性:用來匯入程式中要用到的包或類,可以有多個值,無論是Java核心包中自帶的類還是使用者自行編寫的類,都要在import中引入,才能使用,支援*號,匯入某包下的全部類。

<%@page import="java.text.DateFormat"%>  

或者通過逗號間隔來匯入多個類:

<%@page import="包名.類1,包名.類2"%>

 

②session 屬性:取值預設true,表示當前頁面是否支援session,如果為false,則在JSP頁面中不能使用session物件以及scope=session的JavaBean或EJB。

<%@page session="flase" %>
 

③language 屬性:用於設定JSP頁面使用的語言,目前只支援Java語言

<%@page language="java"%>
 

④extends 屬性:用於設定JSP頁面轉換為Servlet後繼承的java類,一般不會設定。
 

⑤pageEccoding 屬性:用於設定本JSP頁面的字元編碼格式,也就是該JSP檔案的編碼。
ISO-8859-1、gb2312和GBK等。預設值為ISO-8859-1
一般用於使用者在JSP頁面的表單上輸入資料,傳遞給伺服器,伺服器從request請求中可以獲得使用者瀏覽器使用的編碼。
Tomcat內部是使用UTF-8編碼的,在用響應輸出時,還會在response中設定charSet的編碼。

<%@page pageEccoding="gb2312"%>

 

⑥contentType 屬性:用於設定JSP頁面的MEME型別和響應的字元編碼

<%@page contentType ="text/html;charset=UTF-8"%>
 

⑦buffer屬性:

內建輸出流JspWriter的物件out負責將伺服器的某些資訊或執行結果傳送到客戶端顯示,buffer屬性用來指定out緩衝區的大小。
其值可以有none、8KB或是給定的KB值,值為none表示沒有快取,直接輸出至客戶端的瀏覽器中;
如果將該屬性指定為數值,則輸出緩衝區的大小需要大於等於該值,預設為8KB(因不同的伺服器而不同,但大多數情況下都為8KB)。

<%@page buffer="128KB"%>
 

⑧autoFlush屬性:設定JSP頁面緩衝區滿時,自動重新整理快取(輸出到客戶端瀏覽器)。預設值為true.
如果為false,則JSP頁面緩衝區滿時,報出I/O異常

<%@page autoFlush="true"%>
 

⑨isErrorPage屬性:指示一個頁面是否為錯誤處理頁面。設定為true時,在這個JSP頁面中的九大物件之 exception將有效,屬性值將被設定為呼叫此頁面的JSP頁面的錯誤物件,以處理本JSP頁面所產生的錯誤。

<%@page isErrorPage="true"%>
 

⑩errorPage屬性:指示一個JSP檔案的相對路徑,以便在頁面出錯時,轉到這個JSP檔案來進行處理。
與此相適應,需要將這個JSP檔案的isErrorPage屬性設為true。
 當errorPage屬性被設定後,JSP網頁中的異常仍然會產生,只不過此時捕捉到的異常將不由當前JSP進行處理,而是由errorPage屬性所指定的網頁去進行處理。如果該屬性值設定的是以“/”開頭的路徑,則錯誤處理頁面在當前應用程式的根目錄下;否則,在當前頁面所在的目錄下。

<%@page errorPage="error/loginErrorPage.jsp"%>
 

11、info屬性:設定JSP頁面轉為Servlet 後的相關資訊,如當前頁面的作者、編寫時間等。
此值可設定為任意字串,由   javax.servlet.GenericServlet 的 getServletInfo()方法來獲取所設定的值。

區別於ServletConfig 物件的內容,對Tomcat 來說 一般都儲存於Web應用的  web.xml中。

這裡相當於是   <%out.println(getServletInfo());%>,相當於執行了在Servlet的doGet方法中使用 this.getServletInfo();

12、isThreadSafe屬性:

設定JSP頁面是否可以多執行緒訪問。預設值為true,表示當前JSP頁面被轉換為Servlet後,會以多執行緒的方式來處理來自多個使用者的請求;如果設為false,則轉換後的Servlet會實現SingleThreadMode介面,並且將以單執行緒的方式來處理使用者請求。


13、isELIgnored屬性: 忽略EL表示式,預設不忽略。

其值可設定為true或false,表示是否在此JSP網頁中執行或忽略表示式語言“${}”等。
設為true時,JSP容器將忽略表示式語言。其值可設定為true或false,表示是否在此JSP網頁中執行或忽略表示式語言“${}”等。


二:include 指令
包含其他檔案
靜態包含(統一編譯):<%@ include file="included.jsp"%>
 
Jsp中的靜態包含與動態包含
動態include(<jsp: include page="included.jsp"/>) ,這是JSP的動作行為。
靜態include(<%@ include file="included.jsp"%>),這是JSP的指令,其XML形式是<jsp: directive.include page="included.jsp"/>

容易混淆的有include指令和include動作行為,include指令是在JSP檔案編譯為Servlet階段執行,而動作行為是在客戶端請求時執行。


三:taglib
 引入標籤庫的定義,可以是自定義標籤

相關文章