JSP頁面就是帶有JSP元素的常規Web頁面,它由靜態內容和動態內容構成。
一、JSP的執行過程
JSP的執行過程主要可以分爲以下幾點:
1、客戶端發出請求。
2、Web容器將JSP轉譯成Servlet源代碼。
3、Web容器將產生的源代碼進行編譯。
4、Web容器加載編譯後的代碼並執行。
5、把執行結果響應至客戶端。
二、JSP異常處理
(1)創建一個用於異常處理的jsp的頁面
<%@ page isErrorPage=”true”%>
<%
exception
%>
(2)其他的jsp頁面出現了異常能夠跳轉到異常處理的頁面去
方法一:<%@ page errorPage=””%>
方法二:web.xml文件中去進行配置
<error-page>
<error-code>404</error-code> 出錯的代碼500、404
<location>/404error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type> 異常的類型
<location>/error.jsp</location>
</error-page>
三、JSP的隱式對象
1、JSP隱式對象是Web容器加載的一組類的實例。它是可以直接在JSP頁面使用的對象。分爲4個主要類別:
(1)輸入和輸出對象:控制頁面的輸入和輸出(request、response、out)。
(2)作用域通信對象:檢索與JSP頁面的Servlet相關的信息(session、application、pageContext)。
(3)Servlet對象:提供有關頁面環境的信息(page、config)。
(4)錯誤對象:處理頁面中的錯誤(exception)。
1) request對象
request隱式對象表示客戶端的請求,包含了所有的請求信息,常用的方法:
String getParameter(String name):根據頁面表單組件名稱獲取請求頁面提交的數據。
String getParameterValues(String name):獲取頁面請求中一個表單組件對應多個值時的用戶的請求數據(例如複選框)。
2) response對象
response隱式對象處理JSP生成的響應,然後將響應結果發送給客戶端,常用的方法:
void setContentType(String name):設置作爲響應生成的內容的類型和字符編碼。
void sendRedirect(String name):發送一個響應給瀏覽器,指示其應請求另一個URL(會丟失數據,跳轉後不再執行sendRedirect方法下面的代碼)。
3) out對象
out對象表示輸出流,此輸出流將作爲請求的響應發送到客戶端,常用方法有print()、println()、和write()。
在JSP頁面中應使用out隱式對象來向客戶端發送文本形式的實體內容。
out對象是通過調用pageContext對象的getOut方法返回的,其作用和用法與ServletResponse.getWriter方法返回的PrintWriter對象非常相似。
JSP頁面中的out隱式對象的類型爲JspWriter,JspWriter相當於一種帶緩存功能的PrintWriter,設置JSP頁面的page指令的buffer屬性可以調整它的緩存大小,甚至關閉它的緩存。
JSP頁面中的out隱式對象相當於插入到ServletResponse.getWriter方法返回的PrintWriter對象前面的緩衝包裝類對象。
只有向out對象中寫入了內容,且滿足如下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並通過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:
設置page指令的buffer屬性關閉了out對象的緩存功能
寫入到out對象中的內容充滿了out對象的緩衝區
整個JSP頁面結束
內置對象:
(1)輸入輸出對像 request、response、out
(2)作用域通信對象 pageContext、application、session
4) pageContext對象
pageContext對象使用戶可以訪問當前頁面作用域中定義的所有隱式對象。pageContext對象常用的方法:
getRequest()、getServletConfig()、getSession()等
void setAttribute(String name, Object value)
void getAttribute(String name)
獲得其他隱式對象
getException方法返回exception隱式對象
getPage方法返回page隱式對象
getRequest方法返回request隱式對象
getResponse方法返回response隱式對象
getServletConfig方法返回config隱式對象
getServletContext方法返回application隱式對象
getSession方法返回session隱式對象
getOut方法返回out隱式對象
引入和跳轉到其他資源
(1) PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和RequestDispatcher.include方法的調用:
public void forward(java.lang.String relativeUrlPath)
throws javax.servlet.ServletException,java.io.IOException
public void include(java.lang.String relativeUrlPath)
throws javax.servlet.ServletException,java.io.IOException
public void include(java.lang.String relativeUrlPath,boolean flush)
throws javax.servlet.ServletException,java.io.IOException
(2) 傳遞給這些方法的資源路徑都只能是相對路徑,如果路徑以“/”開頭,表示相對於當前WEB應用程序的根目錄,否則,表示相對於當前JSP所映射到的訪問路徑。
訪問各個域範圍中的屬性
在application、session、request、pageContext對象中都可以調用setAttribute方法和getAttribute方法來設置和檢索各自域範圍內的屬性。
存儲在application對象中的屬性可以被同一個WEB應用程序中的所有Servlet和JSP頁面訪問。
存儲在session對象中的屬性可以被屬於同一個會話的所有Servlet和JSP頁面訪問。
存儲在request對象中的屬性可以被屬於同一個請求的所有Servlet和JSP頁面訪問,例如使用PageContext.forward和PageContext.include方法連接起來的多個Servlet和JSP頁面。
存儲在pageContext對象中的屬性僅可以被當前JSP頁面的當前響應過程中調用的各個組件訪問,例如,正在響應當前請求的JSP頁面和它調用的各個自定義標籤類。
PageContext類中還提供了對各個域範圍的屬性進行統一管理的方法,以簡化對各個域範圍內的屬性的訪問。
setAttribute方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
getAttribute方法
public java.lang.Object getAttribute(java.lang.String name)
public java.lang.Object getAttribute(java.lang.String name,int scope)
removeAttribute方法
public void removeAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name,int scope)
getAttributeNamesInScope方法
findAttribute方法 (*)
5) session對象
session對象表示用戶的會話狀況,用此項機制可以輕易識別每一個用戶,能保存和跟蹤用戶的會話狀態。session對象最常用的方法:
void setAttribute(String name, Object value)
void getAttribute(String name)
6) application對象
application對象作用於整個應用程序,所有的客戶端窗口都可以共享該對象,從服務器開始就存在,直到服務器關閉爲止。application對象最常用的方法:
void setAttribute(String name, Object value):以名稱/值的方式,將一個對象的值存放到application中(存的值的類型爲Object)。
void getAttribute(String name):根據名稱去獲取application中存放對象的值(獲取的值的類型爲Object)。
設置context初始參數。在web.xml文件適當的位置增加內容:
<context-param>
<param-name>website</param-name>
<param-value>www.sohu.com</param-value>
</context-param>
在JSP頁面中,使用applicatin對象的getInitParameter()方法可以取得website參數對應的參數值。在Servlet中用ServletContext對象的同名方法獲得參數值。
使用log()方法記錄日誌。
可以使用application對象提供的log()方法,實現日誌記錄功能,在Tomcat服務器中,記錄的日誌都保存在Tomcat根目錄的logs目錄下。日誌內容分成不同文件進行記錄。例如,
<% application.log(“SunWuKong is here”);%>
7) page對象
page對象提供對網頁上定義的所有對象的訪問。page對象表示頁面本身,它是java.lang.Object類的一個實例。
8) config對象
config對象存儲Servlet的一些初始信息。config對象是javax.servlet.ServletConfig接口的一個實例,ServletConfig接口提供方法以檢索Servlet初始化參數。config對象表示編譯JSP頁面的Servlet初始化數據的配置。
9) exception對象處理JSP頁面中的錯誤
printStackTrace()方法用於顯示異常的堆棧跟蹤。
總結:同一個JSP頁面的每次訪問請求的響應過程共享同一個pageContext對象,但是每次響應過程結束時都將重新初始化pageContext對象的內部狀態,並釋放相關的引用,所以,pageContext對象中存儲的屬性對該頁面的以後請求的響應過程不可見,即同一個JSP頁面的每次訪問請求的響應過程不能共享存儲進pageContext對象中的屬性。