标题:webwork框架和struts框架的比较 (原创)
只看楼主
ming206
Rank: 2
来 自:重庆
等 级:等待验证会员
威 望:3
帖 子:545
专家分:7
注 册:2005-8-2
结帖率:100%
 问题点数:0 回复次数:9 
webwork框架和struts框架的比较 (原创)
过去在J2EE开发中一直很喜欢struts做MVC模式中的控制层,刚开始觉得确实比较烦琐(可能是因为小项目吧,所以没有体现出struts的优势),慢慢随着自己经验的积累,设计代码的灵活性(我一般不喜欢用生成代码方式来操作,我先用UML描述,最后认定后在自己写个生成代码的软件(用VB写也可以),做个完全合乎自己的代码生成器,那才叫正在的代码生成软件),我的流程大致:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++实体层
(1)基本模型(例如建立一个博客信息):
//假象就这样,实际并非如此简单

package com.myweb.beansModel;
import java.*;
/**作者:莫小明,BBS ID号:ming206 重庆交通大学 QQ:272038088*/
public class BlogModel{
         private Integer blogID;
         private String blogName;
        public BlogModel(){}
        //o强转化为BlogModel类型
        public void setBlogModel(BlogModel b,Object o){
            b=(BlogModel)o;
        }
        public BlogModel(Integer blogID,String blogName){
                 this.blogID=blogID;
                 //............其他代码
       }
        public  void setBlogID(Integer blogID){
             this.blogID=blogID;
       }
      public Integer getBlog(){
              return this.blog;
      }
      //................其他代码
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++业务逻辑层
(2)创建接口(其实有很多人不太喜欢接口编程,接口编程其实会给系统带来极大的伸缩性):
package com.myweb.dao;
import java.*;
import java.util.List;
import  com.myweb.beansModel.BlogModel;//引入BlogModel类
//定义接口
/**作者:莫小明,BBS ID号:ming206 重庆交通大学 QQ:272038088*/
public interface BlogDao{
     //创建一个BlogModel
     public abstract boolean createBlog(BlogModel mBlogModel) throws RuntimeException;
     //编辑一个BlogModel,这里当然也可以带两个参数,即BlogModel对象实例和BlogModel在数据库中表主键
     public abstract boolean updateBlog(BlogModel mBlogModel) throws RuntimeException;
     //删除一个BlogModel
    public abstract boolean removeBlog(int pk) throws RuntimeException;
    //读出所有记录
     public abstract List getAllBlog() throws RuntimeException;
     //……定义其他抽象方法
}
(3)实现接口

package com.myweb.dao.imp;
import java.*;
import java.util.List;
import  com.myweb.beansModel.BlogModel;//引入BlogModel类
import  com.myweb.dao.BlogDao;//引入BlogDao接口
//定义接口
/**作者:莫小明,BBS ID号:ming206 重庆交通大学 QQ:272038088*/
public class BlogDaoImp implements BlogDao {
    private Managerdb managerdb=null;
    public BlogDaoImp(){
        managerdb=new Managerdb();//常规JDBC操作方法
        //这里值得注意的是:并非人人都用传统的jdbc操作数据库。
        //当然也可以用Hibernate或Spring结合Hibernate做持久化工作。
        //当您采用Hibernate做持久化操作时,为了不破坏本类的结构。可以使用Managerdb类内继承
        //您的sessionFactory类,或自己写个更完整更健壮的组件
        //当您采用Spring+Hibernate时,可以继承HibernateDaoSupport类,进行再次封装
        //(HibernateDaoSupport本身就是对Hibernate已经做了一次封装了)
    }
     //创建一个BlogModel
     public abstract boolean createBlog(BlogModel mBlogModel) throws RuntimeException{
         //数据库操作
     }
     //编辑一个BlogModel,这里当然也可以带两个参数,即BlogModel对象实例和BlogModel在数据库中表主键
     public abstract boolean updateBlog(BlogModel mBlogModel) throws RuntimeException{
         //数据库操作
     }
     //删除一个BlogModel
    public abstract boolean removeBlog(int pk) throws RuntimeException{
        //数据库操作
    }
    //读出所有记录
     public abstract List getAllBlog() throws RuntimeException{
         //数据库操作
     }
     //……定义其他抽象方法
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++对外接口层
(4)创建一个抽象工厂(如果不喜欢这样做,可以直接跳到struts的Action类,即第6步骤,没关系)
   
   package com.myweb.factory;
   import *;
   import java.util.*;
   import com.myweb.dao.*;//装入所有的接口
   /**
    * 本抽象类相当于将所有个接口做一个集合
    * 这样的做法一般会在大型系统中常用到。例如,客户管理系统、人力资源管理系统、市场调度管理系统等
    * 多个系统(或称之为组件)开发集成到一块,在代码维护并不太容易的情况下。可以建立多个FactoryDAO
    * 了。CustomerFactoryDAO、HumanResourcesFactoryDAO、MarketDispatcherFactoryDAO
    * 很明显的做三个FactoryDAO,是不是更能让人觉得代码的清晰?
    */
   /**作者:莫小明,BBS ID号:ming206 重庆交通大学 QQ:272038088*/
   public abstract class FactoryDAO {
    private static FactoryDAO dao = null;
    private static Object initLock = new Object();
    /**抽象方法:createBlogDao();*/
    public abstract BlogDao createBlogDao();
    //……其他代码
    public static SpringFactoryDAO getInstance() {
        if (dao == null) {
            synchronized (initLock) {
                if (dao == null) {
                    try {
                        dao =new Factory();//可以结合XML形式读取,夏昕先生的书往往喜欢那样做,很不错。解耦合更加到位。
                    } catch (Exception e) {
                        e.printStackTrace();
                        return null;
                    }
                }
            }
        }
        return dao;
    }
}
(5)实现抽象方法 FactoryDAO
   package com.myweb.factory;
   import *;
   import java.util.*;
   import com.myweb.dao.*;
   import com.myweb.dao.imp.*;
   /**作者:莫小明,BBS ID号:ming206 重庆交通大学 QQ:272038088*/
   public class Factory  extends FactoryDAO{
   
       public  BlogDao createAccountDAO(){
           return new BlogDaoImp();
       }
       //其他方法……
   }
  
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Struts、Spring、webwork或其他框架
//对于开发B/S模式的朋友们,这里您就可以使用Struts、Spring、webwork或其他框架了
//注意:Spring在这里似乎更好的运用,主要是因为他没必要再使用(4)和(5)步骤了(非用我也不反对你,你自由,哈哈,只是我觉得不怎么样好……反而限制了Spring的控制反转)。
//要对比Struts和webwork,可以从这里开始
//至于如何配置XML文件我就没必要说了啊。。。。。。
(6)
         《1》struts 框架:
              1、创建ActionForm的子类:
                 哦。我想起来了,似乎可以使用com.myweb.beansModel.BlogModel类哦。呵呵……
                 但是突然又想,不行 ,我还要继承 ActionForm 呢,想了一下……
                 也,那把 com.myweb.beansModel.BlogModel类继承ActionForm 吧,同时import进
                 struts一大把软件包,我晕!!!!这样做太无聊了吧,代码太丑陋了。但是我即
                 想继承ActionForm又想继承BlogModel啊,好好,就这样做!写代码……调试。。。
                 啊,。忘了忘了,java不是C++,不支持多继承。没办法,这方法不好。。。。。。
                 算了,直接拷贝。。。。(代码生成器往往就这样给你产生代码的,只不过它比com.myweb.beansModel.BlogModel
                 类的屁股多了个 extends ActionForm而以)
                 这样是不是很晕人呢。想了想,还是不行……
                 最后决定:
                 (1)创建MyActionFrom类:
                      //import 什么什么不写了……  
                      public class MyActionFrom extends ActionForm{
                          private Object o;
                          //
                          public MyActionFrom(Object o) {
                              this.o = o;
                          }
   
                          public Object getO() {
                              return o;
                          }
                      }
                  (2)建立BlogForm
                      public class BlogForm extends MyActionFrom{
                          //注意这里
                          public BlogForm() {
                               super(new com.myweb.beansModel.BlogModel());
                          }
                          //注意这里
                          public com.myweb.beansModel.BlogModel getModel() {
                               return (com.myweb.beansModel.BlogModel)super.getO();
                          }
   
                          public Integer getBlog() {
                               return getModel().getBlog();
                          }
   
                          public void setBlogID(Integer blogID) {
                              getModel().setBlogID(blogID);
                          }
                          //其他代码……
                       }
                       这样是不是似乎更体现面向对象编程中的代码重用性?好象是吧,呵呵,不过也不见得哦。。。。
                       对懒人来说,直接copy  com.myweb.beansModel.BlogModel最方便的,最编程极度爱好,极
                       有写代码欲望的朋友,也许他会多想想,怎么设计更好。更能体现面想对象思想
                       还有个更好的办法,懒可以想办法使用Map类,……这办法更少写代码。这里就不谈了。
                       
                2、创建Action的子类:
                      //当然import 那些东西近来拉
                      import com.myweb.beansModel.BlogModel;
                      //如果不喜欢用这里,当然可以直接只引入com.myweb.dao.BlogDao接口
                      import com.myweb.factory.FactoryDAO;
                      import com.myweb.dao.BlogDao;
                      public class BlogAction extends Action{
                           //如果是用Spring
                           //必须在STRUTS XML文件里配置相关连接器,webwork同样如此,不过是在web.xml里配置的
                           //并且写两个简单的javabean标准语句
                           //例如:private BlogDao blogDao;
                           //public BlogDao getBlogDao(){return this.blogDao}
                           //public void set(BlogDao blogDao){blogDao=blogDao;}
                           //就这样,其他啥也别管(Spring的相关配置自己注意bean id 是blogDao)
                           
                           
                           //妈妈呀,,,,,,,这么多参数,虽然是自动生成的,但是看起两个字:反感!   
                           public ActionForward execute(ActionMapping mapping,
                                                        ActionForm actionform,
                                                        HttpServletRequest request,
                                                        HttpServletResponse response)
                           throws IOException, ServletException {
                               BlogForm form = (BlogForm)actionform; //接表单参数(假如是表单的,呵呵……)
                               //
                               BlogModel b=new BlogModel();
                               b.setBlogModel(b,form);
                               //比如说要创建
                               try{
                                   boolean b=FactoryDAO.getInstance().createBlogDao().createBlog(b);
                                   //如果是用Spring
                                   //就:boolean b=this.blogDao.createBlog(b);
                                   //其他什么new ,别在这里出现,不然就不叫Spring里,呵呵,所谓运行时候决定嘛。
                                   return b?mapping.findForward("s"):mapping.findForward("f");
                               }catch(Exception e){
                                  //……
                               }
                               //更多异常处理,建议对异常的重视……
                           }
                      }
                     
        《1》webwork 框架:
                (1)哈哈,不像struts 的ActionForm那么麻烦了。。
                 直接用 com.myweb.beansModel.BlogModel就可以了。
                 如果你确实不爽快,想还接收一新的参数。
                 好!可以extends 它!
                 于是
                 public class Blog extends  com.myweb.beansModel.BlogModel(){
                     public Blog(){}
                     public Blog(Integer blogID,String blogName){
                         super(blogID,blogName);
                     }
                     private int otherParam=0;
                     //加新代码。。。。。。。
                 }            
                    
                 就这样,完了塞。,比  创建ActionForm的子类简单得多了。
                 (2)好了,第二步骤开始:
                 
                     import com.opensymphony.xwork.ActionSupport;
                     //不想继承ActionSupport可以使用 import com.opensymphony.xwork.Action
                     //只做接口的实现
                     public class ActionBlog extends  ActionSupport {
                         //注意对比 struts中
                         //BlogForm form = (BlogForm)actionform; //接表单参数
                         private Blog _Blog = new Blog();
                         //get/set
                         public void setBlog(Blog _Blog){this._Blog=_Blog;}
                         public Blog get(){return _Blog;}
                         //
                         //哈哈,webwork的execute显得更干净,没那么多晕人的参数
                         public String execute() throws Exception {
                             //直接复制struts中的execute里的try{}里的代码,并且修改返回值
                             //……
                             try{
                                   boolean b=FactoryDAO.getInstance().createBlogDao().createBlog(b);
                                   //如果是用Spring
                                   //就:boolean b=this.blogDao.createBlog(b);
                                   //其他什么new ,别在这里出现,不然就不叫Spring里,呵呵,所谓运行时候决定嘛。
                                   return b?"s":"f";
                               }catch(Exception e){
                                  //……
                               }
                         }
                        
                     }
                     
(7) ,总结:值得注意的是:用struts时候, web表单参数:blogID,blogName
                         用webwork时候,web表单参数:_Blog.blogID,_Blog.blogName
     
     通过整体的流程可以看出, webwork工作原理是更出色的。他的配置文件也很容易配置。
     手工就可以的。基本上不会出错,就如同我上面的所写的代码事例一样,没经过调试,也没经过UML建模型,
     直接就这样写。因为这是我常用的开发模式。这样的代码我写了又写,写了又写,所以深有体会,有时候也
     想拿出来跟大家分享分享,愿意者请保留偶个源创权,哈哈。
     
     最后申明:作者:莫小明,BBS ID号:ming206 重庆交通大学 QQ:272038088
    上的blog: [url=http://ming204.blog.]http://ming204.blog.[/url](一天一点进步)
     
     谢谢大家!
搜索更多相关主题的帖子: webwork struts 莫小明 框架 
2007-11-24 12:30
ming206
Rank: 2
来 自:重庆
等 级:等待验证会员
威 望:3
帖 子:545
专家分:7
注 册:2005-8-2
得分:0 
斑竹关注一下,也好让我知道好与坏?对大伙是否有帮助?

外贸综合平台:E贸通
2007-11-26 09:52
黄袖标
Rank: 4
等 级:贵宾
威 望:13
帖 子:676
专家分:0
注 册:2007-3-22
得分:0 
直接用struts2解除你现在的问题就好。 哇咔咔 。

我胡汉三又回来啦!物是人非啊,只有静夜思大大还在。
2007-11-26 11:44
ming206
Rank: 2
来 自:重庆
等 级:等待验证会员
威 望:3
帖 子:545
专家分:7
注 册:2005-8-2
得分:0 
楼上说得太对了,呵呵.
Struts 2建立在Struts 1和WebWork两个框架整合的基础之上,因此提供了更多优秀的机制。
本人目前也正在研究中......

外贸综合平台:E贸通
2007-11-28 12:22
无缘今生
Rank: 2
等 级:新手上路
威 望:3
帖 子:523
专家分:7
注 册:2007-6-25
得分:0 
前段时间看了点struts2,由于事情较多,就放下了.

请教一下:如果不学struts和webwork,可否直接学习struts2.
我感觉struts2还是比较好用的.

时不再来!!!
2007-11-28 14:55
ming206
Rank: 2
来 自:重庆
等 级:等待验证会员
威 望:3
帖 子:545
专家分:7
注 册:2005-8-2
得分:0 
可以的,不是很难.当时学的时候是先硬做一个小例子,记得有本书<<struts开发入门与项目实践>>
那是我第一次接触的struts,一个人研究了两天才调试出来,然后慢慢顺着它个工作原理,慢慢看.大概花几天时间,把原理看懂,最后可能就是需要再实战了.把重点掌握之后在看一下别人对它的评价以及运用,呵呵,总之,学之,用之,讨论之,借鉴别人更优秀的作品.

外贸综合平台:E贸通
2007-11-29 07:07
xunmi_love
Rank: 2
等 级:论坛游民
帖 子:204
专家分:18
注 册:2006-10-14
得分:0 
支持
看不懂也要支持!

低頭做人,擡頭做事。
2007-11-30 10:05
黄袖标
Rank: 4
等 级:贵宾
威 望:13
帖 子:676
专家分:0
注 册:2007-3-22
得分:0 
什么都是从不会开始的。当然会ww上手会容易些。

我胡汉三又回来啦!物是人非啊,只有静夜思大大还在。
2007-11-30 17:03
风月_无边
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:60
帖 子:2959
专家分:652
注 册:2007-1-19
得分:0 
說的確實不錯﹐只要想學沒有學不會的東西

我的网站 http://www.
2007-11-30 18:19
sea7
Rank: 2
等 级:新手上路
威 望:3
帖 子:291
专家分:0
注 册:2007-2-17
得分:0 
支持……

软件是一种修养
2007-11-30 20:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-188049-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.197738 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved