程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> JSP的內置對象及方法

JSP的內置對象及方法

編輯:關於JSP

JSP的內置對象及方法
1.request對象
客戶端的請求信息被封裝在request對象中,通過它才能了解到客戶的需求,然後做出響應。它是HttpServletRequest類的實例。
1 object getAttribute(String name) 返回指定屬性的屬性值
2 Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
3 String getCharacterEncoding() 返回字符編碼方式
4 int getContentLength() 返回請求體的長度(以字節數)
5 String getContentType() 得到請求體的MIME類型
6 ServletInputStream getInputStream() 得到請求體中一行的二進制流
7 String getParameter(String name) 返回name指定參數的參數值
8 Enumeration getParameterNames() 返回可用參數名的枚舉
9 String[] getParameterValues(String name) 返回包含參數name的所有值的數組
10 String getProtocol() 返回請求用的協議類型及版本號
11 String getScheme() 返回請求用的計劃名,如:http.https及ftp等
12 String getServerName() 返回接受請求的服務器主機名
13 int getServerPort() 返回服務器接受此請求所用的端口號
14 BufferedReader getReader() 返回解碼過了的請求體
15 String getRemoteAddr() 返回發送此請求的客戶端IP地址
16 String getRemoteHost() 返回發送此請求的客戶端主機名
17 void setAttribute(String key,Object obj) 設置屬性的屬性值
18 String getRealPath(String path) 返回一虛擬路徑的真實路徑

2.response對象
response對象包含了響應客戶請求的有關信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。
1 String getCharacterEncoding() 返回響應用的是何種字符編碼
2 ServletOutputStream getOutputStream() 返回響應的一個二進制輸出流
3 PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象
4 void setContentLength(int len) 設置響應頭長度
5 void setContentType(String type) 設置響應的MIME類型
6 sendRedirect(java.lang.String location) 重新定向客戶端的請求

3.session對象
session對象指的是客戶端與服務器的一次會話,從客戶連到服務器的一個WebApplication開始,直到客戶端與服務器斷開連接為止。它是HttpSession類的實例.
1 long getCreationTime() 返回SESSION創建時間
2 public String getId() 返回SESSION創建時JSP引擎為它設的惟一ID號
3 long getLastAccessedTime() 返回此SESSION裡客戶端最近一次請求時間
4 int getMaxInactiveInterval() 返回兩次請求間隔多長時間此SESSION被取消(ms)
5 String[] getValueNames() 返回一個包含此SESSION中所有可用屬性的數組
6 void invalidate() 取消SESSION,使SESSION不可用
7 boolean isNew() 返回服務器創建的一個SESSION,客戶端是否已經加入
8 void removeValue(String name) 刪除SESSION中指定的屬性
9 void setMaxInactiveInterval() 設置兩次請求間隔多長時間此SESSION被取消(ms)

4.out對象
out對象是JspWriter類的實例,是向客戶端輸出內容常用的對象
1 void clear() 清除緩沖區的內容
2 void clearBuffer() 清除緩沖區的當前內容
3 void flush() 清空流
4 int getBufferSize() 返回緩沖區以字節數的大小,如不設緩沖區則為0
5 int getRemaining() 返回緩沖區還剩余多少可用
6 boolean isAutoFlush() 返回緩沖區滿時,是自動清空還是拋出異常
7 void close() 關閉輸出流

5.page對象
page對象就是指向當前JSP頁面本身,有點象類中的this指針,它是java.lang.Object類的實例
1 class getClass 返回此Object的類
2 int hashCode() 返回此Object的hash碼
3 boolean equals(Object obj) 判斷此Object是否與指定的Object對象相等
4 void copy(Object obj) 把此Object拷貝到指定的Object對象中
5 Object clone() 克隆此Object對象
6 String toString() 把此Object對象轉換成String類的對象
7 void notify() 喚醒一個等待的線程
8 void notifyAll() 喚醒所有等待的線程
9 void wait(int timeout) 使一個線程處於等待直到timeout結束或被喚醒
10 void wait() 使一個線程處於等待直到被喚醒
11 void enterMonitor() 對Object加鎖
12 void exitMonitor() 對Object開鎖

6.application對象
application對象實現了用戶間數據的共享,可存放全局變量。它開始於服務器的啟動,直到服務器的關閉,在此期間,此對象將一直存在;這樣在用戶的前後連接或不同用戶之間的連接中,可以對此對象的同一屬性進行操作;在任何地方對此對象屬性的操作,都將影響到其他用戶對此的訪問。服務器的啟動和關閉決定了application對象的生命。它是ServletContext類的實例。
1 Object getAttribute(String name) 返回給定名的屬性值
2 Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
3 void setAttribute(String name,Object obj) 設定屬性的屬性值
4 void removeAttribute(String name) 刪除一屬性及其屬性值
5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本號
6 String getRealPath(String path) 返回一虛擬路徑的真實路徑
7 ServletContext getContext(String uripath) 返回指定WebApplication的application對象
8 int getMajorVersion() 返回服務器支持的Servlet API的最大版本號
9 int getMinorVersion() 返回服務器支持的Servlet API的最大版本號
10 String getMimeType(String file) 返回指定文件的MIME類型
11 URL getResource(String path) 返回指定資源(文件及目錄)的URL路徑
12 InputStream getResourceAsStream(String path) 返回指定資源的輸入流
13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定資源的RequestDispatcher對象
14 Servlet getServlet(String name) 返回指定名的Servlet
15 Enumeration getServlets() 返回所有Servlet的枚舉
16 Enumeration getServletNames() 返回所有Servlet名的枚舉
17 void log(String msg) 把指定消息寫入Servlet的日志文件
18 void log(Exception exception,String msg) 把指定異常的棧軌跡及錯誤消息寫入Servlet的日志文件
19 void log(String msg,Throwable throwable) 把棧軌跡及給出的Throwable異常的說明信息 寫入Servlet的日志文件

7.exception對象
exception對象是一個例外對象,當一個頁面在運行過程中發生了例外,就產生這個對象。如果一個JSP頁面要應用此對象,就必須把isErrorPage設為true,否則無法編譯。他實際上是java.lang.Throwable的對象
1 String getMessage() 返回描述異常的消息
2 String toString() 返回關於異常的簡短描述消息
3 void printStackTrace() 顯示異常及其棧軌跡
4 Throwable FillInStackTrace() 重寫異常的執行棧軌跡

8.pageContext對象
pageContext對象提供了對JSP頁面內所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的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 getResponse() 返回當前頁的ServletResponse對象(response)
6 Exception getException() 返回當前頁的Exception對象(exception)
7 ServletConfig getServletConfig() 返回當前頁的ServletConfig對象(config)
8 ServletContext getServletContext() 返回當前頁的ServletContext對象(application)
9 void setAttribute(String name,Object attribute) 設置屬性及屬性值
10 void setAttribute(String name,Object obj,int scope) 在指定范圍內設置屬性及屬性值
11 public Object getAttribute(String name) 取屬性的值
12 Object getAttribute(String name,int scope) 在指定范圍內取屬性的值
13 public Object findAttribute(String name) 尋找一屬性,返回起屬性值或NULL
14 void removeAttribute(String name) 刪除某屬性
15 void removeAttribute(String name,int scope) 在指定范圍刪除某屬性
16 int getAttributeScope(String name) 返回某屬性的作用范圍
17 Enumeration getAttributeNamesInScope(int scope) 返回指定范圍內可用的屬性名枚舉
18 void release() 釋放pageContext所占用的資源
19 void forward(String relativeUrlPath) 使當前頁面重導到另一頁面
20 void include(String relativeUrlPath) 在當前位置包含另一文件

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

一 Servlet
1、Servlet、ServletConfig:前者對應一個Servlet類,後者對應的是在web.xml中的配置信息
(1)Servlet:
init(ServletConfig):只再類加載並實例化後會被調用一次。
service(ServletRequest,ServletResponse):會被調用多次
destroy():只有一次
getServletConfig()
getServletInfo()
(2)ServletCionfig
getServletName()
getInitParameter(String):---<servlet><init-param></init-param></servlet>
getInitParameterNames():
getServletContext
注意ServletContext中也有getInitParameter(String),它對應的是:<context-param>中嵌套的元素
這個<context-param>和<servlet>標簽是同級別的,初始化的是整個應用程序

2、兩個類:
GenericServlet/HttpServlet:
GenericServlet實現Servlet和ServletConfig,HttpServlet繼承自GenericServlet,而且它是和HTTP協議相關的。
(1)GenericServlet:具有一個無參的init方法,方便子類的覆蓋。
(2)HttpServlet:具有兩個service方法,並且有7個do方法。重寫的時候一般重寫do方法

3、Servlet配置
指的是web.xml中的信息,
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<init-param></init-param>
</servlet>
//上面的配置對應的可以說就是ServletConfig中的東西
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>

4、WEB應用程序文件夾的結構
--WEB-INF
|
|------------web.xml
|------------lib文件夾      JAR文件
|------------classes       類文件
|------------tags          TagFile標簽文件
--靜態資源與JSP文件

5、請求和響應:
(1)請求ServletRequest->HttpServletRequest
getParameter(String)、
getHeader()、
getParameterValues(String)、用於復選框
getParameterNames、
getRemoteAddr、得到遠程地址
getLocalAddr、得到本地地址
getLocale、得到本地化信息
getSession/getCookies
getRequestDispatcher

(2)響應ServletResponse->HttpServletResponse
sendRedirect
sendError
setHeader/addHeader/setIntHeader
getWriter/getOutputStream :這兩個方法絕對不可以同時被調用!!!!!
setContentType/setCharacterEncoding

6、請求的轉發和響應的重定向之間的區別要搞清楚
(1)轉發:
A、三種轉發的方法:
RequestDispatcher.forward/include
<jsp:include>
<jsp:forward> 等價於RequestDispatcher.forward();return;
也就是說使用RequestDispatcher.forward()後,下面的代碼仍然要執行,但是<jsp:forward>執行後,下面的代碼就不執行了。www.2cto.com
pageContext.forward/include
B、如何得到RequestDispatcher:
request.getRequestDispatcher
ServletContext.getRequestDispatcher

RequestDispatcher的請求轉發、Jsp頁面中指令元素include、以及ServletContext中的getResourceAsStream(String path)
(用來讀出文件夾中的路徑資源)都可以訪問WEB-INF文件夾,
比如為了防止用戶訪問一些受保護的頁面(比如控制器Servlet),把它們放到WEB-INF中去,請求轉發的時候可以去訪問。
有的時候需要讀取WEB-INF中的一些配置資源,需要ServletContext中的getResourceAsStream方法。
而且有的網站的各個頁面具有相同的頭圖片和尾圖片,這些東東就可以放到WEB-INF文件夾中用page元素的include指令來包含進來。

注意如果使用ServletContext的RequestDispatcher,要從A應用程序轉發請求到B,必須設定A的crossContext值為true!

(2)重定向
response.sendRedirect:比如在注冊結束後轉到下一個頁面的時候,一定要使用重定向改變浏覽器的URL地址!
請求的轉發不可能脫離Tomcat服務器的范圍,如果想要脫離本服務器的話,只能通過響應重定向的方式。重定向要生成一個臨時的響應,(響應
一旦生成請求就結束了)浏覽器接到這個臨時的響應後不顯示任何東西而是發送請求去找新的地址。


二、JSP
1、模板和元素:
對於JSP來說,它是不可執行的,必須翻譯成Servlet才能執行,必須要容器特殊處理的叫做元素,
直接打印到輸出流中去的是模板

元素分為以下幾種:
1腳本元素
2指令元素
3動作元素

1腳本元素:
(1)腳本片斷:翻譯後原封不動的放到service方法裡面
(2)腳本聲明:放在類裡面,但是是在service方法外面,
(3)腳本表達式:原封不動的放到out.print裡面去,腳本表達式不可以加分號。

內置對象絕對不可以在腳本聲明中去用!因為它們的作用是在service方法裡面的。

2指令元素:
Page指令:
include指令<%@include file=""%>,包含的這個文件一定是按照純文本的格式去讀取,讀取文件的時候就有編碼的問題,這時候就是pageEncoding
的設置問題了。
taglib指令

3頁面亂碼:pageEncoding/contentType
前者設置jsp頁面讀取的形式,後者設置一個響應的報頭,告訴浏覽器以什麼編碼格式去顯示
如果沒有設置pageEncoding而是只設置了contentType的話,那麼pageEncoding要受contentType影響,反之亦然。
也就是兩者只設一者的話都會按照一個編碼去顯示!

無論請求還是響應,遞交的時候默認都是按照iso-8859-1去解碼的。一定要保證讀寫和顯示時候的編碼都是一致的

4 動作元素:
<jsp:useBean>:主要作用:開放一個腳本變量並且向作用域裡面存一個屬性
<jsp:setProperty>
<jsp:getProperty>
<jsp:forward>
<jsp:include>
<jsp:param>
前六個比較重要!
<jsp:invoke>
<jsp:doBody>
<jsp:plugin>
<jsp:fallback>
<jsp:params>

三、過濾器和監聽器
1、Filter/FilterConfig
init(FilterConfig)
doFilter(ServletRequest,ServletResponse,FilterChain)
destroy()

<filter>
<filter-name>
<filter-class>
</filter>

<filter-mapping>
<filter-name>
<url-pattern>|<servlet-name>
</filter-mapping>

url-pattern相同的過濾器處於一個過濾器鏈上,執行的順序完全按照web.xml中的先後順序進行。

2、監聽器->ServletContext/HttpSession/ServletRequest
(1)生命周期
ServletContextListener:初始化(從BBS中讀取全部討論區並存儲在應用程序的作用域中或是將全部封殺的IP讀出來存儲)和銷毀
HttpSessionListener/HttpSessionActivationListener
ServletRequestListener
(2)屬性的增刪改
一般是AttributeListener去作的
<listener>
<listener-class>包名.類名</listener-class>
</listener>

四、四個作用域和九個內置對象
1、頁面作用域對應的是pageContext,而不是page
2、內置對象:
pageContext/request/session/application
out->是JspWriter的實例,它有緩存,而PrintWriter沒有緩存,在頁面結束的時候一定會通過響應生成PrintWriter去寫出緩存的內容!
如果緩存滿了的話,要看:如果<%@page autoFlush="true"%>,則會自動刷新,如果是false,會拋出異常的!response.getWriter()
返回的是PrintWriter,不是JspWriter。
exception->isErrorPage=true的時候才有用
session:兩種跟蹤機制:一種是通過客戶端的cookie存儲,另外一種是將sessionId存在服務器端,
config->ServletConfig
page->Object->this
response:

五、EL表達式語言:
${}
1、常量、函數、變量的表達式
2、變量是存儲在某一作用域中的同名的屬性值
3、函數是在tld文件中聲明的引用一個類的公共且靜態的方法
4、11個內置對象
(1)作用域:pageScope/requestScope/sessionScope/applicationScope
(2)和頁面通信:pageContext
(3)請求參數的:param/paramValues
(4)報頭:header/headerValues
(5)Cookies/initParam ---<context-param>
5、點操作符和[]操作符和empty
對javaBean,是調用getter方法,
對map,是調用get(Object)方法,
對作用域,是調用getAttribute(String)
對pageContext,也是調用getter方法,可以得到所有的內置對象
對param,是去取得參數
對header,是去拿報頭
對initParam,是去拿初始化參數
[]操作符主要是針對數組


六 自定義標簽
1、Tag接口(傳統接口系列)

JspTag
(1)Tag : doStartTag(返回值是SKIP_BODY/EVAL_BODY_INCLUDE)/doEndTag(返回SKIP_PAGE或是EVAL_PAGE)
(2)IterationTag->TagSupport
doAfterBody:EVAL_BODY_AGAIN/SKIP_BODY
(3)BodyTag->BodyTagSupport
doInitBody
doAfterBody:EVAL_BODY_BUFFERED->BodyContent:pageContext裡面有一個pushBody,用來將體包起來,這時候再用getOut方法得到
的不再是JspWriter了,而是bodyContent了。BodyContent的生成是調用了pushBody方法,這裡面又涉及一個getEnclosingWriter(),它
是BodyContent的一個方法,可以得到它裡面包的輸出流JspWriter,但是要注意要是進行了一次以上的pushBody但是沒有進行popBody的話,那麼
拿出來的就是裡面包的BodyContent了,但是由於BodyContent是JspWriter的子類,所以也是符合方法聲明的


2、SimpleTag接口(簡單接口系列)
setJspContext()
setParent()
setJspBody(JspFragment) 注意JspFragment是標簽體,裡面絕對不可以有腳本元素的!注冊的時候content元素中要麼設置為empty,
要麼設置為scriptless,也就是簡單標簽的標簽體是不可以有腳本元素的!
doTag()

JspFragment.invoke(null):直接弄到輸出流中去
JspFragment.invoke(StringWriter out):將輸出流弄到StringWriter中去,然後調用out.toString可以將體變成字符串的形式

3、Tag File標簽文件
.tag
可以放在/WEB-INF/tags裡面或者/META-INF/tags裡面也可以
至於標簽文件的tld可以放在WEB-INF中也可以放在META-INF中去,都是沒有問題的
標簽文件描述的是標簽處理類,jsp描述的是Servlet,二者都是不可運行的,注意標簽文件中有<%@tag%>,裡面可以設置不少標簽的屬性
還有<%@attribute %>,<%@taglib%>和<%@include%>也可以用,屬性可以是JspFragment

比如:<my:first>
   <jsp:attribute>
   </jsp:attribute>
   <jsp:body>
   </jsp:body>
</my:first>

<jsp:invoke name=var>運算結果就放在了var裡面
<jsp:doBody> 處理體

七、JSTL
一共5個庫,我們說了core、sql、i18n、fn標記庫(就是表達式語言的函數庫)
我們沒有講xml的標簽庫

八、國際化與漢字的編碼
ResourceBundle
兩種形式:
1、ListResourceBundle
2、寫一個Properties文件,裡面有一個nativetoacsii命令進行,參照前面的筆記轉碼
基名和擴展名:起名字都是要有標准的
Locale:本地化對象
getBundle方法可以通過傳入基名和本地化對象來處理
<fmt:bundle>
<fmt:setBundle>
<fmt:message>
漢字編碼:GB2312/GB13000(GBK)/GB18030
Unicode UCS/UTF-8 


摘自 gdn_wolf的專欄 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved