JSP 架構介紹 - Model1 , Model2 , and Model2x [精華]

JSP 架構介紹 - Model1 , Model2 , and Model2x [精華]
Chapter 1 Model 1 , 透過 JSP 來接值

1.1 什麼是 Model 1 的 JSP 架構

如圖有三種情況是大家最常使用到的
(1) A.jsp, 例如 Hello xxx 的程式, 將程式碼全部寫在 jsp 檔案之中
(2) B.jsp, 把部分的商業邏輯抽出來, 放在 JavaBean 中, 盡量針對 JavaBean 元件化.
(3) C.jsp, 其實和 B 是一樣的, 只是 JDBC 已經是個標準元件.
好處是...簡單, 開發快速, 如果是小型系統, 可以採用,


Model 1 介紹 [Re:jini]
其實, 許多 Opensource 的專案都是 Model 1
例如留言版, 討論區 這種小型的專案
但是, A 的情況比較少用到, 因為有經驗的工程師都會將一些商業邏輯抽出來
讓它變成 B 的情況,
C 是傳統的 3-tier architecture, 不論是 CGI, ASP, PHP 都是如此的,
接著我會把 B 結合 C , 讓 Javabean 形成 DAO ( Data Access Object), 這也就是 n-tier 的開始.


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
1-2 AP 與 DB 該採取什麼策略?

當我們進入了 n-tier 的架構的時候, 就可以參考 Sun Blueprints 的設計模式 ( Design pattern ) ,
下圖來自http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html .


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
在 Tomcat 之中, 我們不會用到 EJB 的模組, 不過大概的觀念的會是一樣的,
只要你有一個 Business Delegate 清楚地分開, WEB 端與 商業邏輯端,
介紹到其他 JSP 架構時, 也將不會針對商業邏輯層面再多做說明,
將會擺到 下一篇文章 Design Pattern 介紹的時候說到.

而 Sun Blueprints 所提出的 MVC 架構是屬於 Model 2, 我不再累述. 基本上
我們也可以用 JSP 直接去 new BusinessDelegate() ,
傳送 request 的 DATA 到 Delegate 的 method 中
接著取得 ValueObject 或 Collection.

在 1-3 我會拿例子來說明.



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
1-3 簡單的 Design Pattern For Model 1
如果要設計一個大系統
就要對於 Design Pattern 有所認識
我先拿比較簡單的幾個 Pattern ( from blueprints )
拿做一個架構的說明

基本上, 在 JSP 中只要利用 代理人 介面和後端溝通
這樣子的做法是方便 SD 定義統一存取介面
也讓 WEB 端與 商業邏輯做清楚的分野
在 JSP 中 呼叫 BusinessDelegate 這個 class,
Delegate 是 "不處理商業邏輯" 的

<% BusinessDelegate bd = new BusinessDelegate(); %>
<% bd.xxx(); %>


接著 BusinessDelegate 去呼叫 Assembler 得到 結果
可能是 Collection, 或 TO , 或者是 update/delete/insert 的回報值

而 Assembler, 則是透過 DAO 與 Database 溝通
其中撈出來的資料可以產生 ResultSet / RowSet and etc...
而 Assembler 就是把這些資料
轉成 Transfer Object 也稱做 Value Object
可能是 Domain Object 也可能是 Custom Object

例子我延到 1.4


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
在 Business Delegate 之後, 使用 Data Transfer Object
已經成為 Java 族群的共識了
因為可以輕易地結合 JSTL / JSF 等等的網頁運作

至於, Persistence Layer 則有
Hibernate ( http://hibernate.bluemars.net/ )
Jakarta OJB ( http://db.apache.org/ojb )
ibatis database layer ( http://www.ibatis.com/common/common.html )
當然 JDO , EJB 也算在其中 ( 不過都需要另外的 Server , 我是以 Tomcat 為例子 , 不在這次討論範圍 )
不過呢, 我這次也只會說, JDBC 透過 Datasource Connection Pooling 來處理 DAO 的 Pattern !!

而 Assembler 之前應該要有一個專門處理 Business Logic 的 Pattern
這個部分, 如果在 EJB 應該是用 SessionFacade 來處理
我暫且濃縮在 Assembler 內, 處理 select 的資料讀取轉換成 TO 或 Collection,
或者處理一些 Exception 轉換成為代碼,
甚至處理 Insert/Update/Delete 等 DB Action 的動作
其實, 應該算是一個 Business Object ,
未來, 如果有需要更動到商業邏輯, 則修改此處即可 !
不需要對 DAO, 及 Delegate 作修改.
讓物件導向發揮到極致..........


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
1-4 OR-Mapping 技巧
基本上 Assembler 會呼叫 DAO 去組合出 Collection 或 Transfer Object.
DAO 該如何實作, 有兩個方法
(1) JDBC Driver
Class.forName(classname);
Connection con = DriverManager.getConnect(url,"user","password");
(2) Datasource
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("JNDIName");
Connection con = ds.getConnection();

至於如何實作 select / insert / update / delete
請自行查閱 j2se db 文件

假設我們設定了有這兩個 select method.
Collection getAllMembers();
MemberTO getMember(int id);

我們就要建立一個 MemberTO 相同的 javabean 來對應 table
簡單的方法是, 取出來 ResultSet, 一個一個放到 TO 中
如果是 Collection 也是同理, 先做完 MemberTO 接著 add 在 Collection 中
比較好的做法是採用 , commons-beanUtils 的 RowSetDynaClass 及 PropertyUtils 來做資料交換, 請參閱我的電子報第 5 期.

... 懶得講例子



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
DAO 的實作 可以參考
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

觀念就是下面這個 uml, 當 DAO 去 create ValueObject 的時候
commons-beanUtils 就是最好的工具,
至少可以節省開發 getXXX setXXX 的 code



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
1-5 Scriptlet 取出值來顯示

在 JSP 2.0 , JSTL 就已經是標準的 taglib 了,
因為 Model 1 要使用 JSTL 比較麻煩
所以我就介紹該如何 Scriptlet 來顯示

list_member.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.util.*,
com.softleader.member.MemberDelegate,
com.softleader.member.MemberTO"
%>
<%
// 透過 Business Delegate 取出資料
MemberDelegate md = new MemberDelegate();
Collection members = md.getAllMembers();
%>
<%
// 以下可以使用 <c:forEach> jstl 來取代
Iterator itr = mebers.iterator();
while ( itr.hasNext()) {
MemberTO mto = (MemberTO) itr.next();
out.println( mto.getId());
out.println( "=" );
out.println( mto.getName());
out.println( "<br>");
}
%>


Model 1 在程式裡會出現大量的程式碼
是我們不樂於見到的
(1) 不易網頁工作者開發
(2) 維護不易

因此, 第二章將開始講解到 Model 2 by Struts ..........
敬請期待 ^^"", 我將要忙個一兩天 !


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
第一章習題

(1) 嘗試建立一個 Datasource 的 DAO .
(2) 透過 DAO 取得的 ResultSet or RowSet 該如何放到 TO , Collection ( TOs) ?
(3) 將 BusinessDelegate 改成 Singleton Pattern , 在 JSP 使用 BusinessDelegate bd = BusinessDelegate.getInstance();


第一章 結束
----------------------------------------------------------------
有一個專案, 我們用了 Struts 開發, 但是在最後驗收的時候
他卻要我們拔成 Model 1 架構
原因是他們維護看不懂 Model 2 的架構,
我只能說, 無奈呀.........................................



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
Chapter 2 Model 2 透過 servlet 接值

2-1 Model 2 的開始
Model 2 架構是使用 servlet 來接收 client 端的 request ,
根據送來的 parameters 傳到 Model 端, 得到結果後,
給予適當的網頁呈現.


因為 Model 2 可以將 Servlet 作為 Controller 處理程序, 網頁導向, 呼叫商業邏輯等等工作
所以就以 MVC ( Model-View-Controller )作為 Design Pattern

各個 MVC Framework 最重要的核心就是 Controller,
各公司可以根據他已經存在的特色, 來判斷是否採納他們的框架
http://www.waferproject.org/feature-matrix2.html

基本上 Apache 所出的 struts, turbine, tapestry 及 Barracuda, JApple, JPublish, SOFIA 等等 MVC Framework 都有不同的族群在支持著.
如何選擇適當的 Framework , 是個人的偏好, 及公司的考量,
因為本公司採用 Struts ( 目前全球最多 Java 族群使用的 Framework ),
所以本章的例子將採用 Struts 為基礎.

MVC 一詞來自 http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html 設計 Pattern.
而 MVC 到底是什麼?
最常常舉的例子就是,
你有一個標準時間 (Model), 透過一個產生器 ( Controller), 可以顯示成為 數位時間 以及 指針式時間 來表示標準時間.
當你使用指針式調整時間的時候, 數位式的時間也應該同時被修改為相同的狀態.
下圖是他們的相互關係


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
2-2 Struts 入門 (1)
我在這裡不依照正規的方法教導如何使用 Struts,
如果要真正學習 Struts 請購買書籍,
我認為 Manning - Struts in Action 及 Oreilly - Jakarta Struts 這兩本書看完之後, 大概就可以出師了, 另外就是嘗試著作一些專題或案子, 大概就可以爐火純青了........

那麼, 該從哪裡開始呢 ?
先談下載安裝吧.....
http://jakarta.apache.org/site/binindex.cgi
找到 jakarta-struts-1.1.zip 把他放到 c:/jakarta/temp 之下
接著解壓縮到 c:/jakarta/ 將會產生 c:/jakarta/jakarta-struts-1.1 這個目錄
你會看到該目錄下有 lib 這個目錄

我們建立一個專案叫做 strutswork , 建立在 server 的 webapps/ 下
把 lib 下面所有的 *.jar 擺到你的 strutswork/WEB-INF/lib/ 之下
接著 把所有的 *.tld,*.dtd 擺到你的 strutswork/WEB-INF/ 之下
還有一個 validation.xml 也放到 strutswork/WEB-INF/ 下面就可以了

接著設定 strutswork/WEB-INF/web.xml 吧
基本上, 是要設定 Controller , 在 Struts 中是 ActionServlet
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "/WEB-INF/dtds/web-app_2_3.dtd">
<web-app>
<display-name>strutswork</display-name>
<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>


最後建立一個
index.jsp 放在 strutswork/index.jsp 目錄

index.jsp

<%
out.println("I am very glad to introduce beauties to 99% Jakarta");
%>


此時, 重新啟動 jsp server ( 強烈建議使用, 因為我是用 tomcat4.1.24 )
http://localhost:8080/strutswork/
應該可以看到

I am very glad to introduce beauties to 99% Jakarta

^^~
==============================
介紹 tomcat manager
http://localhost:8080/manager/html/
如果你忘記安裝時候的帳號密碼
請到 %CATALINA_HOME%/conf/tomcat-users.xml 查閱

你應該可以看到 strutswork 這個 webapp
以後修改程式的時候
可以在這裡使用 reload

如果你要自動 reload
需要在 %CATALINA_HOME%/conf/server.xml
增加

<Context path="/strutswork" docBase="strutswork" debug="0" reloadable="true" crossContext="true"/>



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
2-3 Struts 入門(2) 基本觀念
上一節 說到的 index.jsp 根本沒有用到 Struts...
那麼進入 Struts 的架構之前
我先來說說 Struts 的架構

可以參考幾個國外網站
(1) http://jakarta.apache.org/struts/userGuide/
(2) http://www-106.ibm.com/developerworks/java/library/j-struts/
(3) http://www.javaworld.com/javaworld/jw-02-2002/jw-0201-strutsxslt_p.html

**基本上, 看完上面就懂的人, 大概就會覺得我實在太會胡扯了...

先簡單說明一下流程
(1) 互動式的網頁, 通常是使用 Form doGET or doPost 傳送資料到 Server 端
在 struts 你最好寫 <html:action action="xxx.do">...........</html:form>
來傳送資料
(2) 當你按下 submit() , ActionServlet 會接值, 將他丟到 FormBean 中
FormBean 可以作 validate, 如果有錯誤將導回 input
(3) 根據 struts-config.xml 的設定, 會找到 xxx.do 應該是執行哪個 action
(4) 當 Action 執行的時候, 通常會用到 FormBean 的資料, 不然你傳送這些資
料要幹麻.
(5) 取出 FormBean 的內容, 呼叫 Model 端的 methods, 我在 Model 1 盡可能
地告訴大家基本 Design Pattern , 就是如果未來你們採用 struts 或其他
mvc Framework, 也不用修改 Model 端
(6) 回傳的資料, 最好是 TO 或 Collection, 是因為讓 JSP 可以方便地使用 JSTL
(7) 將回傳的資料, request.setAttribute 到網頁,
根據 struts-config.xml 的設定, 嘗試導到正確或失敗的頁面


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
拿 JavaWorld 的圖來說明
http://www.javaworld.com/javaworld/jw-02-2002/jw-0201-strutsxslt_p.html

Controller : ActionServlet, Action
Model : Form bean, Result beans
View : JSP



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
2-4 Struts 入門(3) 範例程式
家芸妹子已經寫過範例程式
http://www.jsptw.com/jute/post/view?bid=11&id=583&sty=1&tpg=1&age=60

我不用多做說明, 基本上, 嘗試著讓 Action 去呼叫
Model 1 作業的 Business Delegate.
並且 return 回去 list

這些設定, 各位如果有問題
可以參閱書籍, 及教學網站
否則就互相討論
我不再此多說些啥


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
第二章習題

(1) 嘗試建立一個 member list 的系統
(2) 參考家芸之前的程式碼, 寫出 DynaActionForm 的程式
(3) 嘗試建立一個 insert/update/delete 的系統

第二章結束
==========================
寫文章就這麼辛苦了
寫書的人真不得了


Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
第二章補充教材
Fast Track to Struts from theserverside

StrutsFastTrack.pdf (316.31k)



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
感謝 im1000 的糾正, 我已經將 Model 1 與 Model 2 錯誤的地方用紅色字修正
希望大家繼續指導
至於 Model2x 的部分, 將以 Cocoon 作為範例, 敬請期待 ... ^^"
唯恐誤人子弟的輪



Re:JSP 架構介紹 - Model1 , Model2 , and Model2x [Re:jini]
Chapter 3 Model 2x , Servlet 接值 使用 XML 作 View 端呈現整合

3-1 Model 2x .
隨著 XML 的流行. 越來越多資料交換的格式採用 XML,
相對的, 網頁的呈現透過轉換 XML 資料,
可以具備更多元化的處理方式,
例如輸出成 HTML, SVG 圖檔, PDF 文件檔,
Flash MX 也可以接收 XML
未來會有更多的 parser 產生更多更方便的檔案,
讓大家在瀏覽網頁的時候更方便 ..

標準的 XML 處理器是透過 XSLT 轉換器,
Model 2x Framework 就是採用一些相關的 xml pipeline 觀念
讓資料經過標準的處理模式,
讓資料呈現更多元化.

講到 Model2x
首推 Apache Cocoon ( http://cocoon.apache.org/ )
當然還有其他不錯的 Framework
例如
oxf - Open XML Framework ( http://www.orbeon.com/oxf/ )
還有 Orbeon 也用 oxf 建立了 Model 2X to JSF ( http://www.orbeon.com/oxf/doc/integration-jsf )

Tornado2x ( 這是個新專案 )
http://tornado2x.sourceforge.net/

Xwork ( 就是 WebWork 那群人, 還沒有製作出來, 期待中... )
http://opensymphony.com/

我只有研究過 cocoon ,
所以未來將會採用 cocoon 來舉例...




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值