javaBean

JavaBean是什麼

javaBean是描述java的軟件組件模型,實質是一個java類,必須設置成員變量的set()和get()方法的類,必須public,必須有一個默認無參數的構造方法(<jsp:useBean>要實例化它,它當然需要滿足這些要求)。


javaBean是*.java,但不是servlet,而是被servlet(比如JSP,當然*,java的servlet也可以)調用的。

servlet類必然繼承了HttpServlet。

瀏覽器通過URL可以直接訪問servlet對象(Web容器生成的實例),但不能直接訪問javabean。

servlet類(*.java)必須先在Web.xml中配置了<Servlet-map>映射,才能被瀏覽器通過URL直接訪問(第一次被訪問時,Web容器生成Servlet實例)。


(題外話:組件也是類)

MVC框架中,jsp屬於view,javaBean屬於MC(將javaBean的數據和(非set\get)方法拆分,分佈構造Model和Control。對吧??不對,javabean是M,servlet是C?)

javaBean一般被分爲兩類:可視化Bean和不可視化Bean,我更喜歡成爲數據bean和業務bean。前者可以表示爲GUI組件(Model?),後者在後臺完成業務邏輯處理功能(這是書上說的,對吧?)。


JavaBean作用域範圍

準確的說,<jsp:useBean>實例化得到的JavaBean對象作用範圍,由<jsp:useBean>的scope屬性決定,包括page、request、session、application。


<jsp:useBean>的scope屬性決page、request、session時,servlet是單實例多線程,<jsp:useBean>將JavaBean,實例化,綁定到servlet中,應該是將JavaBean對象作爲該servlet的局部變量,這樣多線程不共享,線程安全。至於JavaBean對象的作用範圍,說明JavaBean對象可以跳出該servlet(page)【比如作爲返回值,或者加入全局容器】,那麼說明JavaBean對象的名稱應該是綁定session ID或者直接保存到request、session這類具有session ID標示的容器(姑且稱作容器)中,這樣纔不會混淆,另外限定使用範圍。(對嗎?)


至於作用域爲application,那麼只要<jsp:useBean>將JavaBean實例化爲單例模式即可。(對嗎?)



JavaBean的動作標記

<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>

<jsp:useBean> ,實例化javaBean,id是實例名,class是類名,scope是實例有效範圍。

1、例如實例有效範圍page

則每次刷新頁面,old Bean銷燬,new Bean生成。這裏的Bean是指<jsp:useBean>生成的實例。

2、例如實例有效範圍request

則每次刷新頁面,old Bean銷燬,new Bean生成。---因爲request對象重新生成

而<jsp:forward>和<jsp:include>轉向、導入其他JSP頁面時,第一個頁面會把request對象傳遞到下一個Jsp頁面,而屬於這個request對象的JavaBean類也將伴隨送出,被第二個JSP頁面接收。如果其他JSP頁面也有一個<jsp:useBean>,且id、class、scope等和old相同,則新頁面不會再實例化javaBean,而是接收傳過來的old Bean。

3、例如實例有效範圍session

刷新頁面、跳轉具有相同<jsp:useBean>的新頁面,都不會新頁面不會再實例化javaBean,而是接收傳過來的old Bean。

若打開一個瀏覽器窗口,在新窗口中請求新頁面,則可能再實例化javaBean,這取決於該瀏覽器窗口訪問,使用的session ID和old瀏覽器窗口是不是相同(相同,則屬於一個會話,不會再實例化javaBean,而是接收傳過來的old Bean;不同,則不屬於一個會話)。

4、例如實例有效範圍application

服務器該應用只有一個Bean,所有頁面,所有用戶都是訪問同一個(第一次生成的)Bean。

application是針對於整個服務器應用程序而言的。應用程序沒有關閉,則Bean是全局的。只有重啓Web服務器(這裏是tomcat),纔會重新生成一個Bean,不過又是全局的,哈哈。


<jsp:setProperty>,可以通過表達式、字符串直接獲得,可以通過http表單參數獲得(本質還是訪問request對象,對吧?),以及通過request對象獲得。

<jsp:getProperty>,很少用(??),通過<%%>中調用Bean.fun()即可獲得需要的實例屬性。Bean是<jsp:useBean>中id,即實例對象名。



request如何獲取客戶端的請求信息

request是<jsp:setProperty>的核心。

Get Post類型請求,都是在(JSP轉成的)servlet(繼承HttpServlet)中調用相應的doGet和doPost方法將客戶端請求信息寫入了request對象,再調用request對象處理。














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章