在java的web开发领域较麻烦的是数据库操纵,如果有工具能像delphi开发数据库运用系统那样高效,它一定会受到开发者的欢迎。
经过五个方面的比较,newxy+struts WEB开发与deiphi桌面开发相比,速度更快,能力更强。 http://blog.csdn.net/nlhlx/archive/2006/06/12/791047.aspx
newxy是hibernate的替代者,struts+newxy是struts+hibernate的替代方案。
struts的不足,下面一篇文章有代表性:《Struts的巨大烦恼 真的不适合大系统?》http://dev.csdn.net/develop/article/85/85114.shtm。
主要观点是:
一、转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp, 而涉及到转向,需要配置forward,如果有十个展示层的jsp,需要配置十次struts, 而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后, 要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统, 这样的操作简单不可想象。现在就是这样,几十上百个人同时在线使用我们的 系统, 大家可以想象一下,我的烦恼有多大。
二、当页面表单需要自动变化或者频繁变化时。
对于一个成熟的MIS系统来说,页面表单肯定是不固定的,甚至象有些系统,页面表单是存在数据库中, 需要填写的表单在页面自动生成,比如填写一个人员基本信息,本来只需要填写 姓名、性别、出生年月 三个指标, 而我后来需要增加籍贯这样的指标,我只需要在数据库中添加籍贯这个记录,并在页面就能自动增加籍贯这样的表单。 而 struts在这方面,其优势反而变成了不足,我参考了非常多的人力资源管理系统,这些系统几乎都能够做系统里面就可以控制人员信息的指示, 进行使展示层能随之灵活变化,如果使用了struts,这些灵活性就根本用不上。 同时,如果页面表单频繁变化时,就需要频繁修改formbean对应的方法和属性,而每次修改之后,就要求重新部署,或者重新启动服务器……。
hibernate的不足,下面是一位网友的看法,具有代表性:
一、对象与数据库的映射,关键在于对象关系的映射,但是没做到很理想,配置过多,控制复杂, 另外还会出错。其实本质在于对象不够自由。
二、事务处理。这点上更容易出问题,相对于各种各样的事务管理器,要兼容是一个大问题, 总归在各种应用服务器上有很多问题。其本质在于创建了一个自我数据存取小环境,必然面临各种兼容问题。
三、HQL语言。建立对象查询语言,类SQL,但是不同于任何一种SQL,调试环境复杂。本质在于创建了一种语言,增加学习成本。
这位网友还提出了减化和退化方案。
struts+newxy之所以在开发效率上比struts+hibernate能提高十倍、甚至几十倍,是因为克服了struts与hiberate的不足。
利用newxy DAO类,标签, struts+newxy可以在以下几个方面不用写java代码,不用配置struts。 http://blog.csdn.net/nlhlx/archive/2006/06/11/788541.aspx
1.数据库的增、删、改;
2.对查询所得数据缓存,指定缓存时长;
3.数据库字符编码与本地字符编码转换;
4.文件上传,上传大小控制;
5.文件下载,下载记数;
6.图片显示;
7.数据分页显示;
8.客户端标记记录集哪条记录被选择;
因为可以不写java代码,不用建立ActionForm类、Action类,因而不用配置struts,不用重新编译类文件、不用重新打包、不用重启服务器。 可以克服struts的不足。
在克服hibernate的不足方面,newxy采用“退化”和“进化”并用的方案。
newxy在进行数据的查询、增、删、改时都会调用一注册方法,根据业务涉及到的数据库相关数据源名和表名进行注册, 注册的目的是要获得表字段对应的java类名,主关键字段名,主关键字段长度等数据,保存在一个单子实例中,以供DAO类调用。 如果已注册不再注册。
可以对多表查询语句注册,如:“select a.field1,b.field2 from table1 as a,table2 as b where ...";
可以对跨数据源的查询注册。如:"select a.field1,b.field2 from table1 as a,DB3.dto.table2 as b where ...";
如果是数据增、删、改,则是对单一表注册;
由于struts+newxy用即时注册的方法,可以不象hibernate那样用静态文件影射数据库到值对象类。开发者不用配置任何文件。可以使用任意查询语句,克服“对象不够自由”问题。
hibernate通过配置文件设置表之间的关系,有一定意义,newxy在这方面算是“退化”的,但struts+newxy在处理数据库表之间关系方面是很容易的。
在事务处理方面,newxy提供了一事务类net.newxy.dbm.Transaction。它可以将多个数据库的操作放在一个事务中。由于DAO类对数据操作前的注册方法得到的表及其字段各种特性都是与数据库直接相关的,而不是事先用静态文件影射, 因而极少发生错误;开发者可以通过Transaction的方法为不同的数据库设置不同的隔离等级;可以设置操时回滚时间,在设置的时间内事务没有完成,会有一线程进行干预,将事务回滚。
hibernate的HQL语言是和数据库与对象影射规则相适应的,它没有特别功能,主要是利用值对象类来查询数据。 newxy也提供了一种查询语言NQL。开发者不需用特殊的语法来构建查询语句。非常容易理解,不会增加学习成本。
struts一旦与newxy结合到一起运用是如此简单,下列是struts+newxy代替struts+hibernate的例子。
struts配置中,formBean的type是“net.newxy.struts_faces.DynaFormBean”,开发者不需另外设计ActionForm类。如:
<form-bean name="myFormBean" type="net.newxy.struts_faces.DynaFormBean" />
用户从页面表单submit数据后,在Action类的方法中,开发者可以用DynaFormBean代替struts ActionForm,用DynaDto代替hibernate 对象类。
public ActionForward methodName(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws Exception{
......
DynaFormBean form=(DynaFormBean)actionForm;
DynaDto dto=(DynaDto)form.getDto();
dto.set_table("table1");//如果用户页面没有传来数据库表名。
try{
IFacade ifacade=IFacadeFactory.getFacade(httpServletRequest.getParameter("_dao"),
httpServletRequest.getLocale()); //绝大多数情况是:IFacade ifacade=IFacadeFactory.getFacade();
//更新或插入,如果result==null,为update,否则为insert。
result = ifacade.update(dto);//或:FormBeanUtils.update(ifacade, form);
//删除记录
ifacade.remove(dto);//或:FormBeanUtils.remove(ifacade, form);
//数据查询,如果上传了符合newxy多项查询规则的数据。查询记录集放在newForm 的_coll属性中。
DynaFormBean newForm=new DynaFormBean();
FormBeanUtils.createForm(newForm, httpServletRequest);
......
//开发者如果想知道生成的sql语句,可以这样:
//string sql=form.get_sql();
//由于开发者在对数据进行操作时完全不需知道sql语句,所以没有提供方法让开发者直接得到sql语句来控制数据操作。
//未来版本可能提供这样的方法。
}catch(Exception e){
......
}
}
如果使用newxy的标签可以不建立Action类,不设置struts的formBean及action,可以不写代码。