`
bubble
  • 浏览: 148779 次
  • 性别: Icon_minigender_1
  • 来自: 辽宁
社区版块
存档分类
最新评论

分析zooma敏捷框架的优点和缺陷

阅读更多
    最初想写zooma的原因是因为自己感到对经常性的重复劳动的厌烦,诸如一些po和vo的转换,针对不同entity的dao和service的实现,以及基本的action中crud操作,即使对dao和service以及action做了泛型的封装,还是要写不少的重复代码,前台的页面也是要来回的粘贴复制,于是我就有了zooma的原始模型:

    就是通过hibernate的mapping文件自动的生成对entity的包括po,vo,dao,service,action,actionform和前台的页面,一次性生成对该实体的包括c、s两端的基本操作代码,当然包括spring和struts的配置文件的更新,使得我可以把大部分的精力放在对于特定实体的特定逻辑的设计上。

    到zooma0.3版本,以上的模型已经全部实现,使用zooma为基础的山西某煤矿生产调度信息系统也同时完成收尾工作,在开发过程中遇到了zooma的先天缺陷,在后面会给大家介绍,希望使用它的人能够避免犯同样的错误。下面我来分析一下zooma的优点和缺点:

    首先我对后台的代码做了优化,使用泛型对dao,service和action做了基本操作的封装,这样可以看到dao实现的代码如下:
public class ZsxResumeDAO extends BabyDao <ZsxResume,Integer>{

}

service实现的代码如下:
(1)oracle下的代码
public class ZsxResumeService extends BabyService<ZsxResumeDAO,ZsxResume,ZsxResumeVO>{
   	
}

(2)mysql下的代码
public class ZsxResumeService extends BabyService<ZsxResumeDAO,ZsxResume,ZsxResumeVO>{

   public boolean delete(String[] ids){
    	try {
	    	for(int i=0;i<=ids.length;i++){
	    		this.getDao().delete(Integer.parseInt(ids[i]));
	    	}	    		
	    	return true;
		} catch (Exception e) {
			return false;
		}   
    }
	public ZsxResumeVO findById(String id) {
    	CoypUtil.copyProperties(this.getVo(),this.getDao().findById(Integer.parseInt(id)));
        return this.getVo();
	}
   	
}


action实现的代码:
public class ZsxResumeAllAction extends BabyActionAdvan<ZsxResumeService,ZsxResume,ZsxResumeVO,ZsxResumeForm>{
    /**
     * Struts execute
     */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		String action=request.getParameter("action");		
		String actionForward="404Failed";
		if ("insert".equals(action)) {
			/*insert表示插入,由xxx_add.jsp跳入,跳转xxx_index.jsp*/
			if (insert(form))actionForward="zsxResume_insert";
		}else if("update".equals(action)) {
			/*update表示修改,由xxx_update.jsp跳入,跳转xxx_index.jsp*/
			if(update(form))actionForward="zsxResume_update";//xxx_index.jsp
		}else if("show".equals(action)) {
			/*show表示修改显示,由xxx_index.jsp或xxx_query.jsp跳入,跳转xxx_update.jsp*/
			String id=request.getParameter("id");
			vo= (ZsxResumeVO)(service).findById(id);
			Vector<ZsxResumeVO> v=new Vector<ZsxResumeVO>();
			v.add(vo);
			request.setAttribute("result",v );
			actionForward="zsxResume_show";
		}else if("delete".equals(action)) {
			/*delete表示删除,由xxx_index.jsp或xxx_query.jsp跳入,跳转xxx_index.jsp或xxx_query.jsp*/
			String[] ids=request.getParameterValues("id");
			if (!delete(ids))actionForward="zsxResume_delete";		
		}else{
			/*query,由xxx_index.jsp或xxx_query.jsp跳入*/
			Page p=query(form, request, "zsxResume");/*第三个参数需要相应修改,值为当前action的path名称*/
            request.setAttribute("result",p.getItems());
			request.setAttribute("page",p);
			/*判断是主页跳入,还是查询页跳入*/			
			if ("index".equals(this.form)){
				//主页跳入,应该跳回主页
				actionForward = "zsxResume_index";//xxx_index.jsp
			}else if("query".equals(this.form)){
                //查询页跳入,应该跳回查询页
				actionForward = "zsxResume_query";//xxx_query.jsp
			}
		}
        return mapping.findForward(actionForward);
	}
	/**
	 * overrided begin
	 */
	
	/**
	 * ActionForm to VO
	 */
	public void copyForm(ZsxResumeForm form) {
		ZsxResumeForm f = form;	
		
		if(f.getId()!=null) {
			if(!f.getId().equals(""))vo.setId(new Integer(f.getId()));
		}			
		
		if(f.getAge()!=null) {
			if(!f.getAge().equals(""))vo.setAge(new Integer(f.getAge()));
		}			
		
		if(f.getSalary()!=null) {
			if(!f.getSalary().equals(""))vo.setSalary(new Float(f.getSalary()));
		}			
		
		if(f.getBrithday()!=null) {
			if(!f.getBrithday().equals(""))vo.setBrithday(DateUtil.stringToDate(f.getBrithday()));
		}			
		
		vo.setName(f.getName());
		
		vo.setCity(f.getCity());
		
	}
	/**
	 * query rules
	 */
	public DetachedCriteria getDetachedCriteria(ZsxResume po){
		//建立查询规则
		DetachedCriteria dc=DetachedCriteria.forClass(ZsxResume.class);
		
		if(po.getName()!=null&&!po.getName().equals("")){
			dc.add(Restrictions.like("name",po.getName(),MatchMode.ANYWHERE));			
		}
		
		if(po.getCity()!=null&&!po.getCity().equals("")){
			dc.add(Restrictions.like("city",po.getCity(),MatchMode.ANYWHERE));			
		}
		
		if(po.getId()!=null&&!po.getId().equals("")){
			dc.add(Restrictions.eq("id",new Integer(po.getId())));			
		}
		
		if(po.getAge()!=null&&!po.getAge().equals("")){
			dc.add(Restrictions.eq("age",new Integer(po.getAge())));			
		}
		
		if(po.getSalary()!=null&&!po.getSalary().equals("")){
			dc.add(Restrictions.eq("salary",new Float(po.getSalary())));			
		}
		
		if(po.getBrithday()!=null&&!po.getBrithday().equals("")){
			dc.add(Restrictions.eq("brithday",po.getBrithday()));			
		}
		
		dc.addOrder(Order.desc("id"));
		return dc;		
	}
}


    这些代码相对在量上有了明显的压缩,也更加的适合扩展,比如我希望在dao中添加一个按照name来查询的方法,直接在dao里添加如下方法就可以了:
public List findByName(String name){
		return this.getHibernateTemplate().find("from ZsxResume",name);
	}

    再比如我想使用其它实体的操作,只要在这个实体中用geter和seter注入就可以使用,当然相应的要在spring的配置文件中加入参数信息。

在action中只实现了单独实体的crud操作,想实现批量操作,可以自己重写insert(),delete(),update()方法,同样也可以通过ioc使用其他实体的crud操作
在查询方面使用hibernate的QBC进行动态混合查询,查询规则在action中的getDetachedCriteria方法中定义,同时将分页封装了进去,可以自己修改org.zooma.base.Page类的toString()方法,来改变翻页显示条。

     页面中尽量将java代码最少化,使得代码看起来更加易懂,所以使用了struts的标签,这里有个缺陷就是页面上按钮使用的js跳转,所以大家可以看到用我提供的模板生成的jsp文件需要使用js,css和images三个文件夹中的文件。

     在WEB-INF\templete下存放的是xml和xsl模板,zooma会先将mapping文件里的信息保存在xml\bean.xml中,然后使用它和xsl文件夹下的模板进行文件生成,一次前台页面的生成样式是完全可以自己定义的,只要按照bean.xml中的数据进行编写就可以了,当然名字还是要叫那个名字。

     zooma的缺陷:

    在项目中我是这样使用zooma的,单表直接只用zooma生成就ok了,多表关联的时候,先建立视图,然后对视图做生成——这里对表和视图有一定的限制,就是一定要以id为主键,并且id在oracle中使用number、在mysql中使用integer,否则会出错误,这个应该算是个缺陷吧——生成的视图用来显示关联后的实体数据,对视图修改的时候,却修改要被修改的被关联的单表,如果说对于比较简单的逻辑关系这样操作还是没有问题的,但是我们在实际项目中遇到的比较复杂的逻辑,使得实现的十分复杂,所以建议对多表关联使用zooma对单边生成后自己修改mapping文件和po、vo,使用hibernate的many-to-many进行操作,这是zooma得最大缺陷,它只能为开发者在比较简单的实体逻辑(一般我会在这样的逻辑中使用zooma:单表,many-to-one,one-to-many)下生成应用,使用它来做一些小型项目我绝得还是会很有益处的。

    还有就是zooma是基于struts1.2的,这令很多网友感到失望,我在演示视频中使用myeclipse进行项目搭建,有让很多人感到绝望,实际上完全可以除了基本架构的搭建,其他操作完全可以不使用myeclipse,但是需要自己手动写mapping文件和po。

    在zooma的下个版本中希望实现:
1、ant的项目导入,摆脱Myeclipse
2、升级为Struts2.0,有可能的话会添加ibates支持
分享到:
评论
4 楼 bubble 2008-04-02  
chenshuangjiang 写道
我支持一下,其实你说的上述缺点已经不算什么了,毕竟在灵活性上牺牲可以提高工作效率问题。不过你说的引入ANT 来摆脱对 Myeclipse的依赖我很赞同,其实只要按照web规范来就行了。用什么IDE都能导入。我觉得用eclipse的来架构web项目应该比较好而且eclipse毕竟用的人很多。呵呵。最后我想问的是怎么才能更灵活的升级新的框架。我觉现在的构架很多而且对应业务不同用的技术也不同。我建议你在综合几种流行的框架后。做个泛型封装,可以让用户自己来选择。可以生成不同的技术框架。不过想想可能它大了不过我觉得能更好的对技术进行解藕。而且spring技术在这方面也已经做的很好了。最后我支持这个项目能继续下去。希望能大家来一起做这个项目。把找个项目做下去。比较现在做敏捷开发框架很流行,也很有发展。
最后顺便问一下楼主来北京了吧。呵呵那天聚会吃饭啊。哈哈哈哈。一起交流交流。就怕我的技术浅你看不上我。哈哈

呵呵,怎么会呢,有空聚聚,现在上班了,挺忙的,突然节奏太快还是有些不适应啊,这两天放映比较大,头疼的厉害,业余时间相对的少了很多,而且现在的工作跟zooma的思想已经差距很大了,所以新的版本出来可能会非常慢
3 楼 chenshuangjiang 2008-03-28  
我支持一下,其实你说的上述缺点已经不算什么了,毕竟在灵活性上牺牲可以提高工作效率问题。不过你说的引入ANT 来摆脱对 Myeclipse的依赖我很赞同,其实只要按照web规范来就行了。用什么IDE都能导入。我觉得用eclipse的来架构web项目应该比较好而且eclipse毕竟用的人很多。呵呵。最后我想问的是怎么才能更灵活的升级新的框架。我觉现在的构架很多而且对应业务不同用的技术也不同。我建议你在综合几种流行的框架后。做个泛型封装,可以让用户自己来选择。可以生成不同的技术框架。不过想想可能它大了不过我觉得能更好的对技术进行解藕。而且spring技术在这方面也已经做的很好了。最后我支持这个项目能继续下去。希望能大家来一起做这个项目。把找个项目做下去。比较现在做敏捷开发框架很流行,也很有发展。
最后顺便问一下楼主来北京了吧。呵呵那天聚会吃饭啊。哈哈哈哈。一起交流交流。就怕我的技术浅你看不上我。哈哈
2 楼 bubble 2008-03-11  
jeromelee 写道
发哥,你帖子上首页啦。恭喜恭喜。我李洋,崔亮的同学。

呵呵,谢了
1 楼 jeromelee 2008-03-10  
发哥,你帖子上首页啦。恭喜恭喜。我李洋,崔亮的同学。

相关推荐

    ZOOM A3中文说明书

    ### 产品特点与功能 #### 1. 多种效果预设 ZOOM A3内置了丰富的音效预设,覆盖了从传统到现代的各种风格,包括但不限于: - **失真(Distortion)**:模拟各种放大器的失真效果,增加声音的厚度和冲击力。 - **过载...

    金属产品事业处经营检讨会.pptx

    本次报告旨在深入探讨金属产品事业处的多个关键领域,包括交货达成、资源管理、营收与成本、品质状况、制造KPI及新产品状况等核心环节,为公司后续的决策提供详尽的分析和建议。 首先,交货达成情况是检验一个公司...

    huibao.rar_swf

    - "main.dfm"、"line.dfm"、"flash.dfm"、"zoomx.dfm"、"Zooma.dfm":这些都是表单文件,定义了应用程序的界面布局和组件。例如,"flash.dfm"可能与SWF文件的显示有关,而"main.dfm"可能代表主界面。 - "keyan125....

    cad的基本设置.pdf

    AutoCAD软件是一款广泛应用于计算机辅助设计(CAD)领域的软件,它允许用户在计算机上创建精确的二维和三维设计。根据给定文件的部分内容,我们可以推断出一些关于AutoCAD软件的基本设置知识点。 首先,文件中提到...

    基于纯verilogFPGA的双线性差值视频缩放 功能:利用双线性差值算法,pc端HDMI输入视频缩小或放大,然后再通过HDMI输出显示,可以任意缩放 缩放模块仅含有ddr ip,手写了 ram,f

    基于纯verilogFPGA的双线性差值视频缩放 功能:利用双线性差值算法,pc端HDMI输入视频缩小或放大,然后再通过HDMI输出显示,可以任意缩放。 缩放模块仅含有ddr ip,手写了 ram,fifo 代码,可以较为轻松地移植到其他平台。 硬件平台:易灵思 ti60f225 EDA平台:efinity

    【java毕业设计】智慧社区智慧社区管理员密码修改与重置系统(源代码+论文+PPT模板).zip

    zip里包含源码+论文+PPT,有java环境就可以运行起来 ,功能说明: 文档开篇阐述了随着计算机技术、通信技术和网络技术的快速发展,智慧社区门户网站的建设成为了可能,并被视为21世纪信息产业的主要发展方向之一 强调了网络信息管理技术、数字化处理技术和数字式信息资源建设在国际竞争中的重要性。 指出了智慧社区门户网站系统的编程语言为Java,数据库为MYSQL,并实现了新闻资讯、社区共享、在线影院等功能。 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。

    基于51单片机的一个智能密码锁设计.7z

    基于51单片机的一个智能密码锁设计.7z

    《STM32单片机+2x180-SG90+2x360-SG90+OLED屏幕》源代码

    《基于STM32的舵机控制系统设计》毕业设计项目 1.STM32单片机+2x180_SG90+2x360_SG90+OLED屏幕 2.OLED屏幕显示舵机的方向、速度、角度各项数据 3.按键1:控制180度舵机正向转动角度      4.按键2:控制180度舵机反向转动角度 5.按键3:控制360度舵机正向转动并且控制舵机速度      6.按键4:控制360度舵机反向转动并且控制舵机速度 7.代码里面含有注释 8.硬件实物接上线就能直接运行

    pyside6-qml-modern-uiapp

    Pyside6+Qml+QtCreator做的桌面app

    基于深度堆叠卷积神经网络的图像融合详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于深度堆叠卷积神经网络的图像融合详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    基于卷积神经网络的语音识别声学模型的研究详细文档+全部资料+优秀项目+源码.zip

    【资源说明】 基于卷积神经网络的语音识别声学模型的研究详细文档+全部资料+优秀项目+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    IndexOutOfBoundsException(解决方案).md

    IndexOutOfBoundsException(解决方案)

    Mini-Imagenet数据集文件

    Mini-Imagenet数据集文件

    时间转换工具(BD时、GPS时、UTC时、北京时间相互转换,可计算日期)

    时间转换工具(BD时、GPS时、UTC时、北京时间相互转换,可计算日期)

    基于CNN神经网络实现的正方教务系统的验证码识别资料齐全+高分项目+文档+源码.zip

    【资源说明】 基于CNN神经网络实现的正方教务系统的验证码识别资料齐全+高分项目+文档+源码.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    西北工业大学 人工智能程序设计 Python NOJ程序源代码.zip

    西北工业大学 人工智能程序设计 Python NOJ程序源代码.zip

    车辆、飞机、船检测12-YOLO(v5至v11)、COCO、CreateML、TFRecord、VOC数据集合集.rar

    车辆、飞机、船检测12-YOLO(v5至v11)、COCO、CreateML、TFRecord、VOC数据集合集.rar对象检测分配-V2 2024-03-10 7:04 pm ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括2992张图像。 以可可格式注释船舶飞机。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 没有应用图像增强技术。

    基于SpringBoot2/3+Sa-Token+Mybatis-Plus和Vue3+Ant Design Vue+Uni-App+Uni-UI,并以高质量代码为核心,简洁、高效、安全的快速开发平台

    SmartAdmin以「高质量代码」为核心,「简洁、高效、安全」的快速开发平台;基于SpringBoot2/3+Sa-Token+Mybatis-Plus和Vue3 +Ant Design Vue+UniApp (提供JavaScript和TypeScript双版本、Java8和java17双版本);满足三级等保、网络安全、数据安全等功能要求。并重磅开源千余家企业在使用的《高质量代码规范》等

    计算机语言学中并查集数据结构的C++实现

    欢迎下载

    jsp基于WEB操作系统课程教学网站的设计与实现(源代码+论文)(2024i6).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

Global site tag (gtag.js) - Google Analytics