今天我們一起來瞭解一下關於JSP應用的JSP的隱式對像和MVC設計模式。
首先我們先來說一下JSP的隱式對象:JSP隱式對象是Web容器載入的一組類的執行個體。它是可以直接在JSP頁面使用的對象。分為4個主要類別:1、 輸入和輸出對象:控制頁面的輸入和輸出(request、response、out)。
2、 範圍通訊對象:檢索與JSP頁面的Servlet相關的資訊(session、application、pageContext)。
3、 Servlet對象:提供有關頁面環境的資訊(page、config)。
4、 錯誤對象:處理頁面中的錯誤(exception)。
我們先瞭解一下輸入和輸出對象:request對象:request隱式對象表示用戶端的請求,包含了所有的請求資訊,常用的方法:voidsetContentType(String name):設定作為響應產生的內容的類型和字元編碼。
void sendRedirect(Stringname):發送一個響應給瀏覽器,指示其應請求另一個URL(會遺失資料,跳轉後不再執行sendRedirect方法下面的代碼。
out對象:在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頁面結束範圍通訊對象:pageContext對象是javax.servlet.jsp.PageContext類的執行個體對象,javax.servlet.jsp.PageContext類是javax.servlet.jsp.JspContext的子類。
pageContext對象是通過調用JspFactory.getPageContext方法返回的。
pageContext對象封裝了當前JSP頁面的運行資訊,它提供了返回JSP頁面的其他隱式對象的方法。
在JSP頁面中只需將pageContext對象傳遞給某個Java類的執行個體對象,在該Java對象中就可以訪問和調用其他隱式對象的功能了。
pageContext對象使使用者可以訪問當前頁面範圍中定義的所有隱式對象。
getException()方法返回exception隱式對象getPage()方法返回page隱式對象getRequest()方法返回request隱式對象getResponse()方法返回response隱式對象getServletConfig()方法返回config隱式對象getServletContext()方法返回application隱式對象getSession()方法返回session隱式對象getOut()方法返回out隱式對象PageContext類中定義了一個setAttribute方法來將Object Storage Service進pageContext對象內部的一個HashMap對象中,同時也定義了一個getAttribute方法來檢索儲存在該HashMap對象中的對象。
void setAttribute(String name, ob ject value) ob ject getAttribute(String name)
(注意:PageContext類除了可以儲存和檢索自身中的屬性對象外,還定義了可以儲存和檢索其他域範圍內的屬性對象的方法。)
在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類中還提供了對各個域範圍的屬性進行統一管理的方法,以簡化對各個域範圍內的屬性的訪問。
public void setAttribute(java.lang.String name,java.lang.ob ject value,int scope) public java.lang.ob ject getAttribute(String name,int scope)
其中參數scope的取值為:PageContext.APPLICATION_SCOPE PageContext.SESSION_SCOPE PageContext.REQUEST_SCOPE PageContext.PAGE_SCOPE publicvoid removeAttribute(String name)
publicvoid removeAttribute(String name,int scope)
getAttributeNamesInScope方法findAttribute方法PageContext類中定義了一個forward方 法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和 RequestDispatcher.include方法的調用:public void forward(java.lang.String relativeUrlPath)throwsjavax.servlet.ServletException,java.io.IOException public voidinclude(java.lang.String relativeUrlPath)
throwsjavax.servlet.ServletException,java.io.IOException public void include(java.lang.String relativeUrlPath,boolean flush)throws javax.servlet.ServletException,java.io.IOException傳遞給這些方法的資源路徑都只能是相對路徑,如 果路徑以“/”開頭,表示相對於當前WEB應用程式的根目錄,否則,表示相對於當前JSP所映射到的訪問路徑。
session對象session對象表示使用者的會話狀況,用此項機制可以輕易識別每一個使用者,能儲存和跟蹤使用者的工作階段狀態。session對象最常用的方法:void setAttribute(String name, ob ject value)
void getAttribute(String name)
application對象application對象作用於整個應用程式,所有的用戶端視窗都可以共用該對象,從伺服器開始就存在,直到伺服器關閉為止。application對象最常用的方法:void setAttribute(String name, ob ject value):以名稱/值的方式,將一個對象的值存放到application中(存的值的類型為ob ject)。
void getAttribute(String name):根據名稱去擷取application中存放對象的值(擷取的值的類型為ob ject)。
設定context初始參數。在web.xm l檔案適當的位置增加內容:
<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目錄下。日誌內容分成不同檔案進行記錄。
Servlet對象:page對象page對象提供對網頁上定義的所有對象的訪問。page對象表示頁面本身,它是java.lang.ob ject類的一個執行個體。
config對象configObject Storage ServiceServlet的一些初始資訊。config對象是 javax.servlet.ServletConfig介面的一個執行個體,ServletConfig介面提供方法以檢索Servlet初始化參數。 config對象表示編譯JSP頁面的Servlet初始化資料的配置。
錯誤對象exception:exception對象處理JSP頁面中的錯誤:printStackTrace()方法用於顯示異常的堆疊追蹤 在上面我們以經介紹了JSP的隱式對象,下面我們來講一下MVC的設計模式:在開發一個軟體之前,必須先設計好其架構,一個基本的架構思想是將軟體分成不 同的模組,問題的關鍵就是如何劃分模組。
MVC(模型-視圖-控制器)是20世紀80年代為Smalltalk-80程式設計語言發明的一種軟體設計模式,它是一種分離商務邏輯與顯示介面的設計方法。
MVC的模型(Model)部分負責管理程式的業務資料,視圖(View)部分負責顯示介面,控制器(Controller)部分則負責與使用者進行互動(接受請求和選擇響應視圖)。
JSP的設計模式:JSP規範給出了使用JSP頁面構建Web應用程式的兩個方案—JSP模式1和模式2.兩個模式的區別在於處理的位置。
JSP模式1(JSP + JavaBean):在模式1的體繫結構中,JSP頁面負責處理請求並將響應發送給用戶端。
Model1的典型的交換過程:首先使用者通過瀏覽器調用Web應用中的JSP頁面,發送request請求,JSP頁面接收到瀏覽器的請求後,通過調用JavaBean對象的方法從資料庫中讀取資料,然後JSP頁面再把資料返回瀏覽器,最終在瀏覽器中顯示相應的資訊。
優點:非常適合小型Web項目的快速開發;對Java Web開發人員的技術要求不高。
弊端:Java和HTML柔和在一起,在Web項目開發的後期和維護階段會造成很大的困難。
JSP模式2(MVC):模式2體繫結構整合使用了Servlet和JSP頁面。在該模式中,JSP頁面用於展示層,並且Servlet負責處理各類任務。
Model2互動過程:首先使用者通過瀏覽器向Web應用中的Servlet發送請求,Servlet接收到請求後執行個體化JavaBean對象, 調用JavaBean對象的方法,JavaBean對象返回從資料庫中讀取的資料,Servlet選擇合適的JSP,並且把從資料庫中讀取的資料通過這個 JSP進行顯示,最後JSP頁面把最終的結果返回給瀏覽器。
優點:商務邏輯和表示內容得到了很好的分離,這種開發方式適合多人合作開發大型的項目。
弊端:Web項目開發的難度加大了,對開發人員的技術要求也提高了。
Servlet作為一個控制器,負責處理請求並建立JSP頁面所需的任何Bean.該控制器也負責確定將該請求傳遞到哪個JSP頁面。JSP頁面檢索Servlet建立的對象,並提取動態內容插入在一個模板中。
注意:由於模型位於web伺服器端,而最終的視圖位於使用者瀏覽器端,只有瀏覽器發出請求後,伺服器才會做出響應,沒有請求就沒有響應,所以在 web應用中難以實現模型的“狀態改變通知”事件,視圖不能隨著模型的改變而自動更新。由於在web應用中無法完全實現真正意義上的mvc模型,模式2隻 能算是mvc設計模式的一種變體,有人乾脆將他稱之為“webMVC”。