原文引自:
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;
}