JSP 九大物件、四大作用域、七大行為動作、三大指令
-
jsp九大內建物件
物件 | 描述 | ||||||||||||||
request | HttpServletRequest類的例項 | ||||||||||||||
response | HttpServletResponse類的例項 | ||||||||||||||
out | JspWriter類的例項,用於把結果輸出至網頁上 | ||||||||||||||
session | HttpSession類的例項 | ||||||||||||||
application | ServletContext類的例項,與應用上下文有關 | ||||||||||||||
config | ServletConfig類的例項 | ||||||||||||||
pageContext | PageContext類的例項,JSP獨有,Servlet沒有,javax.servlet.jsp.JspContext 的子類 雙引數使用時,1個頂9個,可以使用pageContext, 向request、session、application物件中存取資料
| ||||||||||||||
page
| 在JSP中,類似於Java類中的this關鍵字 | ||||||||||||||
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.Object | getAttribute(java.lang.String name) |
void | setAttribute(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轉換。 |
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會發生變化。
主要區別
(1)瀏覽器位址列不發生改變,不會變為目標地址
(2)請求轉發是伺服器的行為,整個轉發的過程在伺服器中完成
(3)整個過程是一次請求,一次響應
(4)各個資源共享Request域中的資料
(5)可以轉發到WEB-INF目錄下
(6)不可以訪問工程以外的資源(如:http://www.baidu.com)
(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
引入標籤庫的定義,可以是自定義標籤
相關文章
- JSP九大內建物件、四大作用域以及session的生命週期JS物件Session
- Java Web(五) JSP詳解(四大作用域九大內建物件等)JavaWebJS物件
- JSP(JSTL EL表示式 三個指令 六個動作標籤 九個JSP內建物件)JS物件
- jsp第七週作業JS
- Java 四大域物件總結Java物件
- jsp中include指令和include動作的區別JS
- 詞法作用域和動態作用域
- PHP 變數的四大作用域PHP變數
- 變數物件與作用域鏈變數物件
- 詳談JSP執行原理、生命週期、語法、指令、動作標籤、九大內建物件(JSP 全家桶)JS物件
- 2020 12 06 JSP九大內建物件和四個作用域JS物件
- JavaScript 深入之詞法作用域和動態作用域JavaScript
- 比較forward動作指令和include動作指令Forward
- JavaScript物件導向~ 作用域和閉包JavaScript物件
- JS內建物件,函式與作用域JS物件函式
- 深入理解javascript作用域系列第二篇——詞法作用域和動態作用域JavaScript
- 深入學習js之——詞法作用域和動態作用域JS
- 深入學習js之——詞法作用域和動態作用域#2JS
- JavaScript 作用域 與 作用域鏈JavaScript
- js 作用域和作用域鏈JS
- js的作用域、作用域鏈JS
- 請問一下jsp;useBean中request作用域問題JSBean
- js的作用域和作用域鏈JS
- javascript之作用域與作用域鏈JavaScript
- js的作用域與作用域鏈JS
- 作用域
- Python中以函式為作用域Python函式
- angularjs的ng-repeat指令下的scope作用域AngularJS
- JSP九大內建物件解析、JSP指令(page、include)、靜態聯編概述JS物件
- jsp forward 指令JSForward
- include指令和include動作
- 原型、原型鏈、作用域、作用域鏈、閉包原型
- 深入理解JavaScript作用域和作用域鏈JavaScript
- JS語法作用域與詞法作用域JS
- Linux作業系統應用領域有哪些?必知四大領域!Linux作業系統
- 分析Tapestry用例!域物件作為DTO在各層傳輸(狀態控制)物件
- Go 中的動態作用域變數Go變數
- javaScript 作用域JavaScript