今天我們一起來了解一下關(guān)于JSP應(yīng)用的JSP的隱式對像和MVC設(shè)計(jì)模式。
首先我們先來說一下JSP的隱式對象:JSP隱式對象是Web容器加載的一組類的實(shí)例。它是可以直接在JSP頁面使用的對象。分為4個主要類別:1、 輸入和輸出對象:控制頁面的輸入和輸出(request、response、out)。
2、 作用域通信對象:檢索與JSP頁面的Servlet相關(guān)的信息(session、application、pageContext)。
3、 Servlet對象:提供有關(guān)頁面環(huán)境的信息(page、config)。
4、 錯誤對象:處理頁面中的錯誤(exception)。
我們先了解一下輸入和輸出對象:request對象:request隱式對象表示客戶端的請求,包含了所有的請求信息,常用的方法:voidsetContentType(String name):設(shè)置作為響應(yīng)生成的內(nèi)容的類型和字符編碼。
void sendRedirect(Stringname):發(fā)送一個響應(yīng)給瀏覽器,指示其應(yīng)請求另一個URL(會丟失數(shù)據(jù),跳轉(zhuǎn)后不再執(zhí)行sendRedirect方法下面的代碼。
out對象:在JSP頁面中應(yīng)使用out隱式對象來向客戶端發(fā)送文本形式的實(shí)體內(nèi)容。
out對象是通過調(diào)用pageContext對象的getOut方法返回的,其作用和用法與ServletResponse.getWriter方法返回的PrintWriter對象非常相似。
JSP頁面中的out隱式對象的類型為JspWriter,JspWriter相當(dāng)于一種帶緩存功能的PrintWriter,設(shè)置JSP頁面的page指令的buffer屬性可以調(diào)整它的緩存大小,甚至關(guān)閉它的緩存。
JSP頁面中的out隱式對象相當(dāng)于插入到ServletResponse.getWriter方法返回的PrintWriter對象前面的緩沖包裝類對象。
只有向out對象中寫入了內(nèi)容,且滿足如下任何一個條件時,out對象才去調(diào)用ServletResponse.getWriter方法,并通過該方法返回的PrintWriter對象將out對象的緩沖區(qū)中的內(nèi)容真正寫入到Servlet引擎提供的緩沖區(qū)中:設(shè)置page指令的buffer屬性關(guān)閉了out對象的緩存功能寫入到out對象中的內(nèi)容充滿了out對象的緩沖區(qū)整個JSP頁面結(jié)束作用域通信對象:pageContext對象是javax.servlet.jsp.PageContext類的實(shí)例對象,javax.servlet.jsp.PageContext類是javax.servlet.jsp.JspContext的子類。
pageContext對象是通過調(diào)用JspFactory.getPageContext方法返回的。
pageContext對象封裝了當(dāng)前JSP頁面的運(yùn)行信息,它提供了返回JSP頁面的其他隱式對象的方法。
在JSP頁面中只需將pageContext對象傳遞給某個Java類的實(shí)例對象,在該Java對象中就可以訪問和調(diào)用其他隱式對象的功能了。
pageContext對象使用戶可以訪問當(dāng)前頁面作用域中定義的所有隱式對象。
getException()方法返回exception隱式對象getPage()方法返回page隱式對象getRequest()方法返回request隱式對象getResponse()方法返回response隱式對象getServletConfig()方法返回config隱式對象getServletContext()方法返回application隱式對象getSession()方法返回session隱式對象getOut()方法返回out隱式對象PageContext類中定義了一個setAttribute方法來將對象存儲進(jìn)pageContext對象內(nèi)部的一個HashMap對象中,同時也定義了一個getAttribute方法來檢索存儲在該HashMap對象中的對象。
void setAttribute(String name, Object value)
Object getAttribute(String name)
(注意:PageContext類除了可以存儲和檢索自身中的屬性對象外,還定義了可以存儲和檢索其他域范圍內(nèi)的屬性對象的方法。)
在application、session、request、pageContext對象中都可以調(diào)用setAttribute方法和getAttribute方法來設(shè)置和檢索各自域范圍內(nèi)的屬性。
存儲在application對象中的屬性可以被同一個WEB應(yīng)用程序中的所有Servlet和JSP頁面訪問。
存儲在session對象中的屬性可以被屬于同一個會話的所有Servlet和JSP頁面訪問。
存儲在request對象中的屬性可以被屬于同一個請求的所有Servlet和JSP頁面訪問,例如使用PageContext.forward和PageContext.include方法連接起來的多個Servlet和JSP頁面。
存儲在pageContext對象中的屬性僅可以被當(dāng)前JSP頁面的當(dāng)前響應(yīng)過程中調(diào)用的各個組件訪問,例如,正在響應(yīng)當(dāng)前請求的JSP頁面和它調(diào)用的各個自定義標(biāo)簽類。
PageContext類中還提供了對各個域范圍的屬性進(jìn)行統(tǒng)一管理的方法,以簡化對各個域范圍內(nèi)的屬性的訪問。
public void setAttribute(java.lang.String name,java.lang.Object value,int scope)
public java.lang.Object getAttribute(String name,int scope)
其中參數(shù)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方法的調(diào)用: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傳遞給這些方法的資源路徑都只能是相對路徑,如 果路徑以“/”開頭,表示相對于當(dāng)前WEB應(yīng)用程序的根目錄,否則,表示相對于當(dāng)前JSP所映射到的訪問路徑。
session對象session對象表示用戶的會話狀況,用此項(xiàng)機(jī)制可以輕易識別每一個用戶,能保存和跟蹤用戶的會話狀態(tài)。session對象最常用的方法:void setAttribute(String name, Object value)
void getAttribute(String name)
application對象application對象作用于整個應(yīng)用程序,所有的客戶端窗口都可以共享該對象,從服務(wù)器開始就存在,直到服務(wù)器關(guān)閉為止。application對象最常用的方法:void setAttribute(String name, Object value):以名稱/值的方式,將一個對象的值存放到application中(存的值的類型為Object)。
void getAttribute(String name):根據(jù)名稱去獲取application中存放對象的值(獲取的值的類型為Object)。
設(shè)置context初始參數(shù)。在web.xml文件適當(dāng)?shù)奈恢迷黾觾?nèi)容:
<context-param> <param-name>website</param-name> <param-value>www.sohu.com</param-value> </context-param>
在JSP頁面中,使用applicatin對象的getInitParameter()方法可以取得 website參數(shù)對應(yīng)的參數(shù)值。在Servlet中用ServletContext對象的同名方法獲得參數(shù)值。
使用log()方法記錄日志。
可以使用application對象提供的log()方法,實(shí)現(xiàn)日志記錄功能,在Tomcat服務(wù)器中,記錄的日志都保存在Tomcat根目錄的logs目錄下。日志內(nèi)容分成不同文件進(jìn)行記錄。
Servlet對象:page對象page對象提供對網(wǎng)頁上定義的所有對象的訪問。page對象表示頁面本身,它是java.lang.Object類的一個實(shí)例。
config對象config對象存儲Servlet的一些初始信息。config對象是 javax.servlet.ServletConfig接口的一個實(shí)例,ServletConfig接口提供方法以檢索Servlet初始化參數(shù)。 config對象表示編譯JSP頁面的Servlet初始化數(shù)據(jù)的配置。
錯誤對象exception:exception對象處理JSP頁面中的錯誤:printStackTrace()方法用于顯示異常的堆棧跟蹤 在上面我們以經(jīng)介紹了JSP的隱式對象,下面我們來講一下MVC的設(shè)計(jì)模式:在開發(fā)一個軟件之前,必須先設(shè)計(jì)好其架構(gòu),一個基本的架構(gòu)思想是將軟件分成不 同的模塊,問題的關(guān)鍵就是如何劃分模塊。
MVC(模型-視圖-控制器)是20世紀(jì)80年代為Smalltalk-80編程語言發(fā)明的一種軟件設(shè)計(jì)模式,它是一種分離業(yè)務(wù)邏輯與顯示界面的設(shè)計(jì)方法。
MVC的模型(Model)部分負(fù)責(zé)管理程序的業(yè)務(wù)數(shù)據(jù),視圖(View)部分負(fù)責(zé)顯示界面,控制器(Controller)部分則負(fù)責(zé)與用戶進(jìn)行交互(接受請求和選擇響應(yīng)視圖)。
JSP的設(shè)計(jì)模式:JSP規(guī)范給出了使用JSP頁面構(gòu)建Web應(yīng)用程序的兩個方案—JSP模式1和模式2.兩個模式的區(qū)別在于處理的位置。
JSP模式1(JSP + JavaBean):在模式1的體系結(jié)構(gòu)中,JSP頁面負(fù)責(zé)處理請求并將響應(yīng)發(fā)送給客戶端。
Model1的典型的交換過程:首先用戶通過瀏覽器調(diào)用Web應(yīng)用中的JSP頁面,發(fā)送request請求,JSP頁面接收到瀏覽器的請求后,通過調(diào)用JavaBean對象的方法從數(shù)據(jù)庫中讀取數(shù)據(jù),然后JSP頁面再把數(shù)據(jù)返回瀏覽器,最終在瀏覽器中顯示相應(yīng)的信息。
優(yōu)點(diǎn):非常適合小型Web項(xiàng)目的快速開發(fā);對Java Web開發(fā)人員的技術(shù)要求不高。
弊端:Java和HTML柔和在一起,在Web項(xiàng)目開發(fā)的后期和維護(hù)階段會造成很大的困難。
JSP模式2(MVC):模式2體系結(jié)構(gòu)集成使用了Servlet和JSP頁面。在該模式中,JSP頁面用于表示層,并且Servlet負(fù)責(zé)處理各類任務(wù)。
Model2交互過程:首先用戶通過瀏覽器向Web應(yīng)用中的Servlet發(fā)送請求,Servlet接收到請求后實(shí)例化JavaBean對象, 調(diào)用JavaBean對象的方法,JavaBean對象返回從數(shù)據(jù)庫中讀取的數(shù)據(jù),Servlet選擇合適的JSP,并且把從數(shù)據(jù)庫中讀取的數(shù)據(jù)通過這個 JSP進(jìn)行顯示,最后JSP頁面把最終的結(jié)果返回給瀏覽器。
優(yōu)點(diǎn):業(yè)務(wù)邏輯和表示內(nèi)容得到了很好的分離,這種開發(fā)方式適合多人合作開發(fā)大型的項(xiàng)目。
弊端:Web項(xiàng)目開發(fā)的難度加大了,對開發(fā)人員的技術(shù)要求也提高了。
Servlet作為一個控制器,負(fù)責(zé)處理請求并創(chuàng)建JSP頁面所需的任何Bean.該控制器也負(fù)責(zé)確定將該請求傳遞到哪個JSP頁面。JSP頁面檢索Servlet創(chuàng)建的對象,并提取動態(tài)內(nèi)容插入在一個模板中。
注意:由于模型位于web服務(wù)器端,而最終的視圖位于用戶瀏覽器端,只有瀏覽器發(fā)出請求后,服務(wù)器才會做出響應(yīng),沒有請求就沒有響應(yīng),所以在 web應(yīng)用中難以實(shí)現(xiàn)模型的“狀態(tài)改變通知”事件,視圖不能隨著模型的改變而自動更新。由于在web應(yīng)用中無法完全實(shí)現(xiàn)真正意義上的mvc模型,模式2只 能算是mvc設(shè)計(jì)模式的一種變體,有人干脆將他稱之為“webMVC”。
更多信息請查看IT技術(shù)專欄