如
1.J2EE分3層:
伺服器端商務邏輯(有商務邏輯層和持久化資料層,Businness Tier 和EIS Tier)、伺服器端展示層(Web Tier)及用戶端展示層(Client Tier)
可以將J2EE設計模式歸納到6個類別
(1)展示層體繫結構模式(伺服器端展示層)
a.前端控制器模式
b.MVC模式
c.裝飾器模式
(2)展示層進階體繫結構模式
a.複合視圖模式(在伺服器端展示層)
b.視圖助手模式
c.服務工作者模式
(3)展示層伸縮性模式(伺服器端展示層)
a.非同步頁面模式
b.緩衝過濾器模式
c.資源集區模式
(4)業務層模式(伺服器端商務邏輯層)
a.複合實體模式
b.域對象模式(業務資料層)
(5)資料傳遞模式(用於商務邏輯層和展示層之間)
a.DTO模式
b.DTO傳遞散列模式
c.資料庫行集合DTO模式
(6)資料庫模式(伺服器持久化資料層)
a.DAO模式
b.DAO原廠模式
2.前端控制器模式
常用的應用為,一個servlet作為一個前端控制器,它負責根據頁面的請求,然後轉寄到頁面控制器。頁面控制器也是一個servlet,這個servlet電泳關於這個請求所應該執行的商務邏輯,並根據商務邏輯的結果返回到具體的現實頁面。簡化的使用是前端控制器servlet利用“命令模式”將頁面控制器轉化成一個個更細粒度的類。
AcitonServlet是前端控制器,部分代碼
RequestUtils.selecetModule(request,getServletContext());
getRequestProcessor(getModuleConfig(request)).process(request,response);
RequestProcessor的process方法處理公用任務,部分代碼
if(!processPreprocess(request,response)){
return;
}
processXXX方法都在處理公用的動作
RequestProcessor的processActionPerform方法實現命令模式,該方式將具體請求的動作分配到Action。
部分代碼
return(action.execute(mapping,form,request,response));
前端控制器選擇頁面控制器解析使用者的請求,實現具體商務邏輯,並根據結果轉寄到頁面試圖
3.裝飾器模式
(1)設計模式的的裝飾器模式
裝飾器模式為用戶端提供一個透明擴充某執行個體功能的方法,該方法的傳回型別就是這個執行個體,在用戶端不斷調用這個方法的同時,該執行個體的內部表象已經隨著功能改變完全不同。
(2)J2EE設計模式中的裝飾器模式
Servlet支援裝飾器模式,裝飾一個request請求,利用裝飾器類截獲所有發送給目標對象的請求,並執行需要的工作,完成之後再把請求轉寄到下一個裝飾器,知道沒有了裝飾器,最後將請求發送到Servlet
Servlet利過濾器來攔截請求和響應,在請求到達Servlet前,為這個請求做一個些額外處理。處理器可以被看成一個鏈,每個過濾器之間都能互相傳遞,以下是過濾器Filter介面的doFilter有三個參數,ServletRRequest,ServletResponse,FilterChain,利用FilterChain的doFilter()啟用下一個相關的過濾器
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException{
//用secletEncoding方法設定字元編碼
if(ingnore || request.getCharacterEncoding() == null){
String encoding = selectEncoding(request);
if(encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request,response);
}
4.複合視圖模式
設計模式中的“合成模式”
合成模式:提供一個樹狀的對象結構,樹枝類與樹葉類都實現同一個介面,以便用戶端在調用任何對象時都只要需要調用該樹狀結構的根介面就可以了。
J2EE設計模式中的“複合視圖模式”
將視圖的布局從中抽離出來,形成由一系列萬用群組件的模板。可以利用XML來描述視圖的組成
5.視圖助手模式
jsp頁面的標籤庫和struts的標籤庫,一個標籤應該繼承javax.servlet.jsp.tagext.TagSupport,並給出doStarTag和doEndTag兩個方法的實現。
doStarTag實現商務邏輯
doEndTag控制輸出
6.服務工作者模式
將頁面流轉、前端控制器模式,視圖助手模式合在一起使用,表示“請求-轉寄-視圖”的一整套流程。該模式也是MVC模式的實現標準,struts也基於這個模式實現
7.非同步頁面模式
當遠端資料發生變化時,將其緩衝下來,稱為“發行者-訂閱者-模型”。在J2EE的功能是,利用一個訂閱者角色,在一個的時間間隔或資料發生變化時,接受來自發行者角色的資料,訂閱者角色同時會利用模式曾來更新資料庫。這樣的工作累世於軟體設計模式中的“觀察者模式”。常見的應用為,當發行伺服器需要顯示最新資訊的HTML頁面時,會利用一個訂閱者角色來負責。例如ActionServlet
8.緩衝過濾器模式
這個模式用來椽村動態產生的頁面,儘可能減少重複產生的頁面。在J2EE的功能是,利用一個緩衝過濾器截獲請求,判斷該請求所返回的頁面是否有緩衝。緩衝過濾器應該放在“裝飾過濾器”和工作Servlet之前。緩衝過濾器是裝飾過濾器的一個變體。對HTTPServletResponse對象進行裝飾來儲存請求處理的結果。
9.資源集區模式
用戶端在需要JDBC串連時,應該從一個池中去取得。如果池中有可用的JDBC串連,則返回這一對象資源。如果沒有任何可用資源,但池中還有容量,就使用工廠產生一個新的執行個體。如果池中沒有任何可用資源且池的容量已經沾滿,那就必須等待,知道其他用戶端還回至少一個對象。
10.複合實體模式
該模式可以降低工作環境中的複雜性和通訊開銷。一個複合實體將來自各種不同來源的資料集中到一個單獨的對象中。應用為EJB環境的集中對象。
11.域對象模式
將一張資料庫中的表結構對象化,例如hibernate中的錶轉化成對象,使用在持久層架構理論中
12.DTO模式
struts的ActionForm就是一個DTO模式的實現,從整頁模式得到資料傳遞給模型層,模型層通過商務邏輯的調用後將返還資料給ActionForm用作視圖層的資料顯示
ActionForm僅僅被用在從視圖層傳遞到模型層。
13.DTO散列模式
struts的DynaActionForm就是一個DTO散列模式,讓程式員設定某個資料的主鍵,而後在Acton中可以通過該主鍵得到頁面資料
14.資料庫行集合DTO模式
將JDBC的ResultSet發送到用戶端顯示,使用ResultSet介面的一個獨立類作為DTO發送到用戶端顯示。
15.DAO模式
Data Access Objects模式被認為是持久層的一種基本模式
DAO模式有反問資料和處理商務邏輯的功能,現在不再流行
16.DAO原廠模式
使用者只對被建立的產品感興趣,而這些被建立的產品在建立之前所做的許多額外的工作被封裝到工廠介面的子類中,而不適用具體產品類的建構函式,達到隱式的使用
改模式只有和資料庫連接的功能,沒有實現訪問資料的功能
17.J2EE設計模式與設計模式的區別
(1)軟體設計模式是設計,J2EE設計模式關注的就是構架
(2)軟體設計模式為瞭解決各種軟體世界中常見問題提煉的一種最佳時間,是許多經驗豐富的軟體設計者不斷成功和失敗的總結。
J2EE模式為瞭解決企業級應用的構架問題。
(3)軟體設計模式的主要目的是解耦,可以在J2EE模型的任何層中出現軟體設計模式。
J2EE設計模式對於J2EE模型中的分層進行解耦。軟體設計模式關注的是微觀的方法學,J2EE設計模式則是宏觀的方法學。
18.
(1)前端控制器模式、MVC模式、服務工作者模式被整合成了展示層架構,如struts架構,webwork架構
(2)複合視圖模式有Tiles架構實現
(3)視圖助手模式的主要實現是標籤庫,JSTL標籤庫
(4)DAO原廠模式隨著中介層架構Spring的依賴注入,已經不一定需要實現。
下面摘自網友的文章:
一、MVC架構
Struts是一個不錯的MVC架構,我一直以來都用它,通過簡單的配置即可將view,controler,和Model結合起來。View主要以JSP來實現,因為它是面向標籤的,所以對於網頁設計人員提供了很好的介面。FormBean是介於JSP和Action之間的中間資料載體,它肩負著資料從JSP到ACTION的傳遞過程。Action是流程的中轉站,不同的業務在不同的Action中以不同的Model調用來實現。Model就是實現具體業務的操作過程,不過這種過程是一種在較高水平上的實現。
總之,MVC架構實現了三層結構中的兩層,即表現層和業務層,另外還有一層被稱之為持久化層。
二、三層架構
正如以上所說的,三層架構即“表現層”,“業務層”,“持久化層”。表現層實現的代表作品是Struts架構,業務層實現的代表作品是Spring,持久層實現的代表作品是Hibernate。不過在我的開發中Spring被省掉了,因為我認為業務過於簡單,還不至於用Spring來實現。下面我將具體的來說說我的三層實現。
1、三種Bean
在我的實現中,總共有三種Bean,它們都是為儲存對象狀態而存在的。持久層中,這種Bean就是POJO對象。它是面向資料庫的,或者說多少得照顧到資料庫的實現,因為我習慣於用PowerDesigner來設計資料庫,做出來的結構也是比較中規中矩的,而如果直接用Hibernate來實資料庫的話,就不那麼乾淨了。所以POJO對象的設計就不能完全物件導向。業務層中的Bean我把它稱之為Entity,這是一個完全面向程式邏輯的Bean。它可能是好幾個POJO的集合。對於商務邏輯來,這種被稱之為Entity的Bean做到了“拿來就用”,很便於業務的進行。在顯示層中的Bean就是FormBean了,主要用於傳入資料所用。
POJO僅生存於持久化層,到了業務層就將資料交給Entity了。而Entity不僅生存於業務層,它還被傳到了JSP中,用於顯示。
2、Pojo與Dao
我認為這是資料與操作的關係,Dao只在呼操作,而Pojo僅用於儲存資料。下面是我Dao介面的實個現。
public interface Dao {
/
public void resetPO(Pojo pojo) {
this.userPo = (UserPo)pojo;
}
public String save() {
String oid = null;
try{
//Session session = HibernateUtil.currentSession() 已經被提至建構函式中初始化了
Transaction tx = session.beginTransaction();
if (userPo.getId() == null) {
oid = (String)session.save(userPo);//如果這是一個新的pojo則進行insert操作。
session.flush();
tx.commit();
}else{
session.update(userPo,userPo.getId());//如果該pojo已被初始化過則進行update操作
session.flush();
tx.commit();
}
}catch(HibernateException ex){
System.out.println("///n UserDao.save()出現異常!");
log.error("UserDao.save()出現異常!",ex);
}
return oid;
}
public Pojo load() {
UserPo tmp = new UserPo();
try{
//Session session = HibernateUtil.currentSession() 已經被提至建構函式中初始化了
tmp = (UserPo) session.get(UserPo.class, userPo.getId()); //用確切存在的ID值獲得對象
}catch(HibernateException hbe){
hbe.printStackTrace();
}
if (tmp != null) {
userPo = tmp;
return userPo;
}
else
return null;
}
public List find(short by) {
//Session session = HibernateUtil.currentSession() 已經被提至建構函式中初始化了
Query query = null;
String where=null;
switch(by){
case 0 :
where = "";
break;
case 1 :
where = " where us.name='"+userPo.getName()+"'";
break;
case 2 :
where = " where us.account='"+userPo.getAccount()+"'";
break;
case 3 :
where = " where us.password='"+userPo.getPassword()+"'";
break;
case 4 :
where = " where us.account='"+userPo.getAccount()+"' and us.password='"+userPo.getPassword()+"'";
}
query = session.createQuery("from UserPo us"+where);
return query.list();
}
public void close(){
HibernateUtil.closeSession();
}
}
其中HibernateUtil是一個Hibernate方法類,它提供安全執行緒的Session。和關閉這個Session的方法(雖然關閉Session過於簡單)。每個Dao是由DaoFactory來產生的。DaoFactory也有一個公用的介面。如下:
public interface DaoFactory {
Dao getDocumentDAO();
Dao getDocHeadDAO();
Dao getDocAccessoryDAO();
Dao getUserDao(User u);
}
下面是一個基於Hibernate的Dao的實現。
public class HbDaoFactory implements DaoFactory {
public HbDaoFactory() {
}
public Dao getDocumentDAO() {
return new com.cecs.dao.DocumentDAO();
}
public Dao getDocHeadDAO() {
throw new java.lang.UnsupportedOperationException("Method getDocHeadDAO() not yet implemented.");
}
public Dao getDocAccessoryDAO() {
throw new java.lang.UnsupportedOperationException("Method getDocAccessoryDAO() not yet implemented.");
}
public Dao getUserDao(User u) {
return new UserDao(u);
}
}
這樣一但不用Hibernate來實現持久層,也可以很方便改為其它的Dao而不用修改業務層。