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](一天一点进步)
谢谢大家!