今天我們一起來了解一下關於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方法來將對象存儲進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對象config對象存儲Servlet的一些初始信息。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”。