版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Java Web 編程技術(shù),第6章 Web組件重用與JavaBeans,6.1 靜態(tài)包含 6.2 動態(tài)包含 6.3 JavaBean概述 6.4 通過JSP動作使用JavaBean 6.5 在Servlet中使用JavaBean 6.6 從腳本元素中訪問JavaBean 6.7 JavaBean的其他特性 6.8 MVC設(shè)計模式,6.1 靜態(tài)包含,6.1.1 使用include指令 6.1.2 從被包含的頁面中訪問變量 6.1.3 靜態(tài)包含的限制 6.1.4 使用包含設(shè)計頁面布局,6.1.1 使用include指令,靜態(tài)包含使用include指令,語法: 文件可以是任何基于文本的文件,如HTM
2、L、JSP、XML文件,甚至是簡單的.txt文件。 相對URL是指它不能含有協(xié)議、主機名或端口號。它可以是相對于當前JSP文件的路徑,即不以”/”開頭,或者是相對于Web應用程序文檔根目錄的路徑,即以”/”開頭。 例如: ,靜態(tài)包含是在JSP頁面轉(zhuǎn)換階段將另一個文件的內(nèi)容包含到當前JSP文件中產(chǎn)生一個servlet。 include指令的工作方式,每個頁面都可以訪問在另一個頁面中定義的變量。它們也共享所有的隱含對象。 程序hello.jsp 程序response.jsp,6.1.2 從被包含的頁面中訪問變量,(1)在轉(zhuǎn)換階段不進行任何處理,這意味著file屬性值不能是表達式,因此下面對incl
3、ude指令的使用是非法的: % (2)不能通過file屬性值向被包含的頁面?zhèn)鬟f參數(shù),因為請求參數(shù)是請求的一個屬性,它在轉(zhuǎn)換階段沒有任何意義。下面例子中的file屬性值是非法的: ,6.1.3 靜態(tài)包含的限制,(3)被包含的頁面可能不能單獨編譯。 如果一個頁面使用了另一個頁面聲明的變量,該頁面就不能單獨編譯。一般來說,最好避免這種相關(guān)性, 可以使用隱含變量pageContext共享對象,通過使用pageContext的setAttribute()和getAttribute()方法實現(xiàn)。,6.1.4 使用包含設(shè)計頁面布局, ,index.jsp header.htmlf footer.jspf,6
4、.2 動態(tài)包含,6.2.1使用jsp:include 標準動作 6.2.2向動態(tài)包含的組件傳遞參數(shù) 6.2.3與動態(tài)包含的組件共享對象 6.2.4使用jsp:forward標準動作,其語法如下所示: page屬性是必須的,其值必須是相對URL,并指向任何靜態(tài)或動態(tài)web組件,包括servlet。也可以是請求時表達式,例如: / flush屬性是指在將控制轉(zhuǎn)向被包含頁面之前是否刷新當前頁面的緩沖區(qū),默認false。,6.2.1使用jsp:include動作,工作方式 結(jié)構(gòu) 1 結(jié)構(gòu) 2 結(jié)構(gòu) 3 ,在動作中可以使用動作向被包含的頁面?zhèn)鬟f參數(shù)。下面的代碼向被包含的頁面(somePage.jsp)傳
5、遞兩個參數(shù): 在被包含的頁面中使用request隱含對象的getParameter()方法獲得傳遞來的參數(shù)。 ,6.2.2 使用傳遞參數(shù),在元素中可以嵌入任意多的元素。value的屬性值也可以像下面這樣使用請求時屬性表達式來指定: / / ,通過動作傳遞的名/值對存在于request對象中并只能由被包含的組件使用, 這些參數(shù)的作用域是被包含的頁面,在被包含的組件完成處理后,容器將從request對象中清除這些參數(shù)。,動態(tài)包含的頁面是單獨執(zhí)行的,因此它們不能共享在包含頁面中定義的變量和方法。然而,它們處理的請求對象是相同的,因此可以共享屬于請求作用域的對象 . hello.jsp,6.2.3 與
6、動態(tài)包含的組件共享對象,使用動作把請求轉(zhuǎn)發(fā)到其他組件,然后由轉(zhuǎn)發(fā)到的組件把響應發(fā)送給客戶 該動作的格式為: page屬性的值為轉(zhuǎn)發(fā)到的組件的相對URL,它可以使用請求時屬性表達式。 它與動作的不同之處在于,當轉(zhuǎn)發(fā)到的頁面處理完輸出后,并不將控制轉(zhuǎn)回主頁面。 使用動作,主頁面也不能包含任何輸出。 工作方式,6.2.5 使用動作,在功能上的語義與RequestDispatcher接口的forward()方法的語義相同,因此下面三個結(jié)構(gòu)是等價的: 【結(jié)構(gòu)1】 【結(jié)構(gòu)2】 【結(jié)構(gòu)3】 ,Java Applet是主要應用領(lǐng)域,它是可嵌入到HTML頁面中運行的Java程序。在HTML頁面中使用標簽把App
7、let嵌入到頁面中。 同樣,也可以將Applet嵌入到JSP頁面中,這時應該使用動作,它的格式如下:,6.3 在JSP頁面中使用Java Applet, + arbitrary_text , Applet Demo 現(xiàn)在的時間是: ClockDemo.java,在MVC設(shè)計模式中常用JavaBeans來封裝業(yè)務邏輯、數(shù)據(jù)庫操作等等,從而很好地實現(xiàn)業(yè)務邏輯和表示邏輯的分離,使系統(tǒng)具有更好的健壯性和靈活性 。 本節(jié)主要內(nèi)容: 6.4.1 什么是JavaBeans? 6.4.2 序列化JavaBeans,6.4 JavaBeans概述,JavaBean是Java平臺的組件技術(shù)。 JavaBean就是
8、使用Java語言定義的類,而這種類的設(shè)計需要遵循Sun制定的JavaBean規(guī)范文檔中描述的有關(guān)約定。與EJB完全不是一回事。 在Java模型中,通過JavaBean可以無限擴充Java程序的功能。 對于程序員來說,最好的一點就是JavaBean可以實現(xiàn)代碼的重復利用,另外對于程序的易維護性等也有很大的意義。 在JSP程序中常用JavaBean來封裝業(yè)務邏輯、數(shù)據(jù)庫操作等等,可以很好地實現(xiàn)業(yè)務邏輯和表示邏輯的分離,使得系統(tǒng)具有更好的健壯性和靈活性。,6.4.1 什么是JavaBeans?,遵循下面3個規(guī)范的Java類作為JavaBean 類必須是public的;類必須具有無參數(shù)的public構(gòu)
9、造方法, JavaBeans類的成員變量一般稱為屬性(property)。對每個屬性訪問權(quán)限一般定義為private或protected,而不是定義為public的。注意:屬性名必須以小寫字母開頭。 對每個屬性,一般定義兩個public方法,它們分別稱為訪問方法(getter)和修改方法(setter),允許容器訪問和修改bean的屬性。 public String getColor(); public void setColor(String);,一個例外是當屬性是boolean類型時,訪問器方法應該定義為isXxx()形式。 例如,假設(shè)JavaBean有一個boolean型屬性valid,
10、則訪問器方法應該定義為 public boolean isValid()。 除了訪問方法和修改方法外,類中還可以定義其他的方法實現(xiàn)某種業(yè)務邏輯。也可以只為某個屬性定義訪問器方法,這樣的屬性就是只讀屬性。 下面是一個簡單的例子 :CustomerBean,JavaBean命名慣例:UserBean、AccountBean 。 以區(qū)別一般的類,這樣可以給協(xié)作的開發(fā)人員清晰的含義。 JavaBean類存放在 /WEB-INF/classes目錄中 /WEB-INF/lib目錄中的JAR文件中。 在JSP中使用這些類,使用page指令的import屬性導入它們。 ,JavaBean的優(yōu)點 在JSP頁面
11、中使用JavaBeans的代碼簡潔。 JavaBeans也有助于增強代碼的可重用性。 它們是Java語言對象,充分利用該語言的面向?qū)ο蟮奶卣鳌?JavaBean的序列化是將一個JavaBean實例轉(zhuǎn)換成數(shù)據(jù)流并存儲在文件中的過程,這樣它的屬性和值就被永久保存起來并在以后根據(jù)需要檢索。 序列化的過程是通過Java標準的對象序列化機制實現(xiàn)的。 首先,JavaBean類必須實現(xiàn)java.io.Serializable接口使類能夠被序列化; 然后通過使用java.io.ObjectOutputStream類對bean實例序列化。,6.4.2 序列化JavaBeans,序列化的beans被作為資源使用應
12、該具有下面的要求: 存儲序列化bean的文件擴展名必須是.ser。例如, 如John.ser或Mary.ser。 存儲bean的文件必須存放在Web應用程序的類路徑中。因/WEB-INF/ classes目錄總是在web應用程序的類路徑中,可以將創(chuàng)建的所有的bean存放在/WEB-INF/classes目錄或其子目錄中,例如: /WEB-INF/classes/John.ser /WEB-INF/classes/customerData/Mary.ser,存儲bean的路徑和文件名的組合被作為bean的名稱,這與類和包的概念類似。 上面例子中的兩個序列化beans的名稱分別為John和cust
13、omerData.Mary。 這些對象一旦作為序列化的bean保存,它們就可以使用java.beans.Beans類的instantiate()方法將bean裝載到任何程序中。,假設(shè)有一個目錄 /WEB-INF/classes/customerData/, 下面例子將在該目錄中創(chuàng)建序列化的beans。 首先,按下列方式使CustomerBean類可序列化: public class CustomerBean implements java.io.Serializable . ,程序beanSaver.jsp從請求參數(shù)中接收用戶名和地址信息,創(chuàng)建一個CustomerBean的實例并將其序列化到給
14、定客戶名的文件中。 頁面customer.html 執(zhí)行 程序beanSaver.jsp 通過這種方式,可以創(chuàng)建任意多的具有不同屬性值集的序列化的beans,只要bean文件名不同即可,然后可以在應用程序的其他組件(JSP頁面和Servlet)中使用這些序列化的beans。,6.5 在JSP中使用JavaBean *,本節(jié)主要內(nèi)容: 6.5.1 使用 6.5.2 使用 6.5.3 使用,動作在JSP頁面中聲明一個變量并與其關(guān)聯(lián)一個JavaBean的實例。 關(guān)聯(lián)分為兩步: 首先容器在指定的作用域查找是否存在一個指定類的實例; 如果找不到則創(chuàng)建一個新的實例并將其關(guān)聯(lián)到聲明的變量。 動作通過五個屬性
15、來定制該動作的行為: id 、scope 、class 、type 、beanName,6.5.1 使用動作,動作的格式如下:, type=package.class / | other elements ,1. id屬性 id屬性用來唯一標識一個特定的bean實例 值需要被其他JSP動作與使用來標識bean的一個特定實例 id的值被作為Java語言的變量,因此我們可以在JSP頁面的表達式和小腳本中使用該變量名 注意,由于id屬性值唯一標識一個特定bean的實例,我們不能在一個轉(zhuǎn)換單元中的多個中使用相同的id屬性值。,2. scope屬性 scope屬性用來指定bean實例的作用域 JavaB
16、eans在JSP頁面中的存在和可訪問性是由四個JSP作用域決定的: page request session application 沒有指定則使用默認的page作用域,3. class屬性 class屬性用來指定bean實例的Java類。 如果動作在指定的作用域中不能找到一個現(xiàn)存的bean,它將使用class屬性指定的類public的無參數(shù)的構(gòu)造方法創(chuàng)建bean類的一個新的實例。 如果該類屬于某個包,則必須指定類的全名,如mypackage.MyClass,4. type屬性 type屬性指定由id屬性聲明的變量的類型 。 其類型必須與bean類的類型相同或者是其超類,或者是一個bean類實
17、現(xiàn)的接口。 如果類或接口屬于某個包,需要指定其全名,如com.model.CustomerBean 5. beanName屬性 beanName屬性用來指定一個序列化的bean名稱或創(chuàng)建bean實例的類名。,6. 屬性的使用 只有class屬性的情況 在請求階段,如果在session作用域內(nèi)已經(jīng)存在一個名為customer的對象,就把它賦給變量customer,否則將創(chuàng)建一個新的CustomerBean類的對象,然后也將其賦給該變量并將其添加到session中。 這個過程與下面的代碼等價:,com.model.CustomerBean customer = (com.model.Custome
18、rBean) session.getAttribute(customer ); if (customer = null) customer = new com.model.CustomerBean (); session.setAttribute(customer , customer); ,缺省的作用域 在這種情況下,將默認使用page作用域,因此該bean只能在它所定義的JSP頁面中使用,且只能被該頁面創(chuàng)建的請求使用。 這個過程與下面的代碼等價:,com.model.CustomerBean customer = (com.model.CustomerBean)pageContext.ge
19、tAttribute( customer ); if (customer = null) customer = new com.model.CustomerBean(); pageContext.setAttribute( customer, customer); , 只有type屬性的情況 可以使用type屬性代替class屬性,例如: 該動作在指定作用域中查找類型為com.model.CustomerBean的實例,如果找到用customer指向它,如果找不到產(chǎn)生異常。因此,使用type屬性必須保證bean實例存在。, class屬性和type屬性的組合 下面的聲明既使用了class屬性又
20、使用了type屬性: , beanName屬性和type屬性的使用 beanName屬性值可以指向一個序列化的bean,或者是要創(chuàng)建bean實例的類名。 如果指向一個序列化的bean,那么該bean將從存放bean的文件裝載。 如果beanName屬性指向一個類,則類被載入內(nèi)存并創(chuàng)建一個實例,該實例就作為bean。 beanName屬性必須和type屬性搭配使用,即必須使用type屬性指定bean的類型,例如下面是一個正確的用法: ,下面的動作中使用指定的類名創(chuàng)建bean實例: ,動作用來給bean的屬性賦新值,它格式為: | property = propertyName param=par
21、amName | property = * /,6.5.2 使用動作,1. name 屬性 name屬性用來標識一個bean實例,該屬性是必須的。該bean必須是使用前面的動作聲明的,并且name屬性值必須與動作中指定的id屬性值相同。 2. property 屬性 property用來指定要設(shè)置值的bean的屬性,JSP引擎將根據(jù)指定的bean的屬性調(diào)用setXXX()方法,因此該屬性也是必須的。,3.value 屬性 value用來為要設(shè)置屬性值的bean的屬性指定新值,該屬性可以接受請求時屬性表達式。 4. param 屬性 param屬性用來指定請求參數(shù)名,如果請求中包含指定的參數(shù),那
22、么使用該參數(shù)值來設(shè)置bean的屬性值。 value屬性和param屬性都是可選的并不能同時使用。如果這兩個屬性都沒有指定,它等價于param和property具有相同的值,JSP引擎將查找與property屬性同名的請求參數(shù)。,聲明對bean的使用: 使用value屬性 ,它們與下面的小腳本代碼等價: 下面的例子對value屬性使用了請求時表達式: /, 使用param屬性 : 下面的例子中沒有指定value屬性的值,而是使用param屬性指定請求參數(shù)名: 它通知引擎使用請求參數(shù)myEmail和myPhone的值分別為email和phone屬性賦值。這樣,上面的標簽就與下面的小腳本代碼等價:
23、, 使用默認參數(shù)機制 如果請求參數(shù)名與bean的屬性名匹配,我們就不必指定param屬性或value屬性,如下所示: 在這種情況下,將使用相應的請求參數(shù)的值設(shè)置bean的屬性。上述標簽與下面的等價: , 在一個動作中設(shè)置所有屬性 這里,我們?yōu)閜roperty的屬性值指定“*”,它將使用請求參數(shù)的每個值為屬性賦值,這樣,我們就不用一個一個設(shè)置 bean的每個屬性值。 等價于的小腳本: ,動作用來檢索和向輸出流中打印bean的屬性值,它的語法非常簡單: 下面的動作指示JSP引擎打印名為customer的bean的email和phone屬性值: %,6.5.3 使用動作,它們與下面的小腳本代碼等價:
24、 一個使用JavaBeans的示例: customerForm.html displayCustomer.jsp 執(zhí)行customerForm.html,JSP頁面在轉(zhuǎn)換階段被轉(zhuǎn)換成Servlet,這說明在JSP頁面中使用的bean實際上是在Servlet中使用的,因此我們也可以直接在Servlet中使用JavaBean。 并且可以在JSP頁面中和Servlet中共享bean實例。 BeanTestServlet.java,6.6 在Servlet中使用JavaBeans,在一個JSP頁面中使用三個beans,每個都屬于不同的作用域:request、session和application。 聲
25、明如下: ,JavaBeans也可以用在腳本元素中。 例如,有一個UserBean用來存儲用戶信息,我們需要設(shè)置用戶提交的login和password屬性,然后從數(shù)據(jù)庫中裝入用戶信息。 下面代碼段說明了如何實現(xiàn)這一點:,6.7 從腳本元素中訪問JavaBeans, ,在小腳本中,我們可以使用user變量引用bean實例,因為動作自動聲明了它。 另一個在小腳本和表達式中使用beans的原因是標準動作直接向輸出流中寫出屬性值,它不能用來書寫條件邏輯或?qū)⑺鳛橐粋€值傳遞給一個屬性。,如果UserBean有一個名為preferredHomePage的屬性存儲用戶最喜歡的頁面的URL,那么也不能使用向動
26、作傳遞請求時值,下面代碼是不合法的: /,在這種情況下,必須像下面這樣在小腳本和表達式中使用bean: / ,6.8 MVC設(shè)計模式,6.8.1 Model 1體系結(jié)構(gòu) 6.8.2 Model 2體系結(jié)構(gòu) 6.8.3 實現(xiàn)MVC設(shè)計模式的一般步驟,Sun 公司推出Servlet技術(shù)的主要目的是代替CGI編程。 可以把Servlet看成是含有HTML的Java代碼。 可以把JSP看成是含有Java代碼的HTML頁面。 Sun公司在推出JSP技術(shù)后提出了建立Web應用程序的兩種體系結(jié)構(gòu)方法。這兩種方法分別稱為 JSP Model 1體系結(jié)構(gòu) JSP Model 2體系結(jié)構(gòu),在Model 1體系結(jié)構(gòu)
27、中,每個請求的目標都是JSP頁面。該頁面完全負責完成請求所需要的所有的任務,其中包括驗證客戶、使用JavaBean訪問數(shù)據(jù)庫及管理用戶狀態(tài)等。,6.9.1 Model 1體系結(jié)構(gòu),遵循MVC(Model-View-Controller)的設(shè)計模式。 所有請求的目標都是Servlet,它充當控制器(controller)。Servlet分析請求并將產(chǎn)生響應所需要的數(shù)據(jù)收集到JavaBeans對象中,該對象作為應用程序的模型(model)。最后,Servlet控制器將請求轉(zhuǎn)發(fā)到JSP頁面。這些頁面使用存儲在JavaBean中的數(shù)據(jù)產(chǎn)生響應。,6.9.2 Model 2體系結(jié)構(gòu),6.8.3 實現(xiàn)MV
28、C設(shè)計模式的一般步驟,1. 定義JavaBeans表示數(shù)據(jù) JavaBeans對象一般只用來存放數(shù)據(jù),JSP頁面從JavaBeans對象中獲得數(shù)據(jù)并顯示給用戶。 2. 使用Servlet處理請求 Servlet實現(xiàn)控制器功能,它從請求中讀取請求信息(如表單數(shù)據(jù))、創(chuàng)建JavaBeans對象,最后將請求轉(zhuǎn)發(fā)到視圖組件。在MVC模式中,Servlet并不創(chuàng)建任何輸出,輸出完全由JSP頁面實現(xiàn),因而,在Servlet中并不調(diào)用response.setContentType()方法、response.getWriter()方法或out.println()等方法。,3.填寫JavaBeans對象數(shù)據(jù) 控
29、制器創(chuàng)建JavaBeans對象后需要填寫該對象的值??梢酝ㄟ^訪問數(shù)據(jù)庫得到有關(guān)數(shù)據(jù),然后填寫的JavaBeans對象中。 4.結(jié)果的存儲 創(chuàng)建了與請求相關(guān)的數(shù)據(jù)并將數(shù)據(jù)存儲到JavaBeans對象中 接下來應該將這些bean對象存儲在JSP頁面能夠訪問的位置。在Servlet中主要可以在3個位置存儲JSP頁面所需的數(shù)據(jù),它們是HttpServletRequest對象、HttpSession對象和ServletContext對象。 這些存儲位置對應動作scope屬性的3個非默認值:request、session和application。,假設(shè)有一個BookBean類,要創(chuàng)建該類對象并將其存儲到會話作用域中,可使用下列代碼: BookBean book = new BookBean(); / 填寫book對象的屬性 HttpSession session = request.getSession(); Session.setAtribute(book,book); 接下來,Servlet將請求轉(zhuǎn)發(fā)到JSP頁面,JSP頁面可以使用下面動作檢索該b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/Z 6113.405-2026無線電騷擾和抗擾度測量設(shè)備和測量方法規(guī)范第4-5部分:不確定度、統(tǒng)計學和限值建模替換試驗方法的使用條件
- 流程工業(yè)智能制造技術(shù)理論及應用 課件 第五章-流程工業(yè)過程實時優(yōu)化
- 感恩活動策劃方案流程(3篇)
- 江門地產(chǎn)活動策劃方案(3篇)
- 活動策劃方案賺錢文案(3篇)
- 跨年歡聚活動策劃方案(3篇)
- 配送企業(yè)人員管理制度范本(3篇)
- 高速道路救援管理制度范本(3篇)
- 2026年及未來5年市場數(shù)據(jù)中國投資保險行業(yè)市場深度分析及發(fā)展趨勢預測報告
- 養(yǎng)老院活動策劃制度
- 2025屆新疆烏魯木齊市高三下學期三模英語試題(解析版)
- DB3210T1036-2019 補充耕地快速培肥技術(shù)規(guī)程
- 混動能量管理與電池熱管理的協(xié)同優(yōu)化-洞察闡釋
- T-CPI 11029-2024 核桃殼濾料標準規(guī)范
- 統(tǒng)編版語文三年級下冊整本書閱讀《中國古代寓言》推進課公開課一等獎創(chuàng)新教學設(shè)計
- 《顧客感知價值對綠色酒店消費意愿的影響實證研究-以三亞S酒店為例(附問卷)15000字(論文)》
- 勞動仲裁申請書電子版模板
- 趙然尊:胸痛中心時鐘統(tǒng)一、時間節(jié)點定義與時間管理
- 家用燃氣灶結(jié)構(gòu)、工作原理、配件介紹、常見故障處理
- ZD(J)9-型電動轉(zhuǎn)轍機
- DB21T 3414-2021 遼寧省防汛物資儲備定額編制規(guī)程
評論
0/150
提交評論