原文引自:
http://www.3doing.net/forums/dispbbs.asp?boardID=57&ID=226&page=2一個簡單對象的CRUD操作的Demo,對用戶對象的增刪查改操作。
僅僅演示系統架構的組成,從單純的需求實現角度來看,這個Demo非但沒有減少代碼,反而非常復雜,然而作為了解系統架構的角度來說,這個Demo卻是一個完整的架構例子,是一個簡單的入手點。
一、系統架構:
Hibernate/Spring/Webwork2/FreeMarker
使用Hibernate作為持久層框架,Spring封裝DAO,作為業務層組件,Webwork2作為Web層的MVC框架,FreeMarker作為View,取代JSP。
二、項目目錄:
這是一個Eclipse Project的目錄,可以直接import到Eclipse里面。
src:源代碼和配置文件目錄
lib:一些web application不需要的庫和框架源代碼
simple: web application
(缺test case)
三、文件:
com.javaeye.User: 實體類,表示用戶實體
com.javaeye.UserManager: 用戶實體的DAO接口
com.javaeye.impl.UserManagerHibernateImpl: 用戶實體的DAO接口的Hibernate實現類
com.javaeye.util.ServletFilter: 設定HTML Form提交的字符集,解決Form提交的亂碼問題
com.javaeye.action.*: webwork的相關action
applicationContext.xml: SpringFramework的bean配置文件
jdbc.properties: 數據庫連接配置文件
xwork.xml: Webwork的Action bean配置文件
webwork.properties: webwork配置文件
freemarker.properties: freemarker配置文件
log4j.properties: log4j配置文件
四、運行
將simple目錄作為web application發布到相應的Application Server上即可,已經內置HSQLDB,無需另外的數據庫支持。
================================================================
webwork沒用過,如果用struts的話,extends DispatchActionSupport更好,一個action class解決問題。由于我做的是對簡單的表的CRUD操作,所以沒用到CRUD中的R,直接從list方法得數據,當也沒那么多jsp頁面,采用單頁面CRUD,這樣一個action class+一個jsp+及pojo和manager之類的東西寫起來很簡單、方便。
java代碼: |
package com.terac.tm.action;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessages; import org.apache.struts.action.DynaActionForm;
import com.terac.tm.dao.LinkDAO; import com.terac.tm.model.Link;
/** * @author andy */ public class LinkAction extends AuthorizedDispatchAction {
????public ActionForward delete(ActionMapping mapping, ActionForm form, ????????????HttpServletRequest request, HttpServletResponse response) ????????????throws Exception {???????? ????????... ????} ????public ActionForward list(ActionMapping mapping, ActionForm form, ????????????HttpServletRequest request, HttpServletResponse response) ????????????throws Exception {???????? ????????... ????} ????public ActionForward save(ActionMapping mapping, ActionForm form, ????????????HttpServletRequest request, HttpServletResponse response) ????????????throws Exception {???????? ????????... ????}
========================================== To andy163:
我想了一下,明白了當你使用Struts的時候,為什么傾向于合并了。因為Struts的Action是所有線程一個單一實例的,Action的方法需要的數據都通過方法參數(request, response, actionForm)傳遞給方法的內部,因此所有的邏輯都局限在方法的內部,在這種情況下,拆開成為多個Action,每個Action一個方法,和你現在這種單個Action,包含多個方法,實質上是沒有差別的,邏輯上不會增加任何復雜度,并且配置文件的長度,Action的數量都可以大幅度減少,所以傾向于合并。
而Webwork的Action是每線程一個實例,Action方法需要的數據和組件都是通過getter/setter方式由容器注入,此時合并Action,就會比較混亂,不如拆開邏輯清楚。
|
==================================================================
我覺得如果表比較多的情況下,可以考慮對于一個表操作的邏輯都合并到一個Action,表比較少的話還是robbin這樣的寫法比較清晰。
PS. robbin什么時候寫個含一對一,一對多,多對多的例子。呵呵,是不是我要求太高了
==================================================
這個例子是我講課的時候,現場做出來的,所以比較簡單,很多情況都沒有考慮,以后會逐漸補充更加復雜的例子。
====================================================
希望能增加分頁顯示的部份,一直搞不清楚 是要在userManager里寫 findUsers(int from, int to) 嗎?=================================
分頁的方法很多,最好是在DAO中,減少內存占用量
借用一下別人的例子:
public Iterator getInfos(int position, int length) throws Exception {
Iterator iterator = null;
String queryString = " select info from Info as info order by info.id desc";
Query query = getHibernateTemplate().createQuery(getSession(), queryString);
//設置游標的起始點
query.setFirstResult(position);
//設置游標的長度
query.setMaxResults(length);
//記錄生成
List list = query.list();
//把查詢到的結果放入迭代器
iterator = list.iterator();
return iterator;
}