<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
这是EasyJWeb新特性介绍的第三篇文章,主题是:简约而不简单,用最少的代码,做尽可能多的事情。
我们坚信,代码量少,表达规范,语法结构稳定的程序,更容易维护。EasyJWeb框架的一个最大特点,就是让你能用最少、简洁、规范的代码,做尽可能多的事情。
在写程序这样一个充满艺术及哲学美的领域里,能用一句代码解决的问题,决不能写两句代码;能不用代码解决的问题,就更不要写代码了:-)。我们要使用简体字,是因为我们知道该简化的一定要简化。简约而不简单,是每一个程序员追求的一种境界。
EasyJWeb的目标就是要让大家书写Java Web应用的时候,尽量的简洁,代码尽量少。但其实现的功能不简单,其体系不简单,其应用的领域不简单。他能让你用简洁及简约的表达方式,写出正统、层次分明、可维护性高的JavaEE应用程序,实现企业级应用的需求。
比如对于一个添删除改查,我们使用正统OO分析的方式就是先进行建模,然后把模型转化为java能识别的领域对象,或者是可持久化Entity对象。有了Entity或Domain,即可在这个基础上构建业务逻辑、DAO以及前端表示层的界面操作。在DAO层,EasyJWeb的应用框架支撑平台中提供了一些非常通用的解决方案,比如泛型DAO,JPA封装等,他能使你根据情况选择最适合你的持久层方案来解决专业问题。对于业务层来说,EasyJWeb通过引入了超级IOC容器,可以使得你用最适合自己的方式来解决业务层的问题,他同样提供了一些通用的业务实践及业务方法等辅助对象来帮助我们能使用尽量少、尽量简洁的代码来解决问题。
下面我们看看在一个添删改查、分页、排序等针对Entity对象的能用操作中,一个基于EasyJWeb写的Action中的内容:

publicclassPersonActionextendsCrudAction...{
@Inject(name="personDao")
privateGenericDAOPerson>dao;


publicvoidsetDao(GenericDAOPerson>dao)...{
this.dao=dao;
}

protectedClassentityClass()...{
returnPerson.class;
}

publicGenericDAOgetDao()...{
returndao;
}
}
对,只需要这么简单的几行代码,告诉这个Action使用哪一个DAO及对哪一个Entity类进行操作,其它的一切都交由EasyJWeb提供的通用CRUD基类搞定。
当然,我们使用其它的java mvc框架也能通过这样的封装来简化用户的Action,但实现同样的功能,EasyJWeb的基类Action所使用的代码肯定是比较少的,而且也是非常直观的。我们来看看添删改查的CrudAction基类及其父类的代码。

abstractpublicclassCrudActionextendsAbstractCrudAction...{
publicabstractGenericDAOgetDao();

protectedObjectfindEntityObject(Serializableid)...{
returngetDao().get(id);
}

protectedIPageListqueryEntity(IQueryObjectqueryObject)...{
returnQueryUtil.query(queryObject,entityClass(),getDao());
}

protectedvoidremoveEntity(Serializableid)...{
getDao().remove(id);
}

protectedvoidsaveEntity(Objectobj)...{
getDao().save(obj);
}

protectedvoidupdateEntity(Objectobj)...{
getDao().update(obj);
}
}
CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

publicabstractclassAbstractCrudActionextendsAbstractPageCmdAction...{
protectedabstractClassentityClass();

publicPagedoInit(WebFormform,Modulemodule)...{
returngo("list");
}

publicPagedoNew(WebFormform,Modulemodule)...{
returnmodule.findPage("edit");
}

publicPagedoSave(WebFormform)...{
Objectobj=form.toPo(entityClass());

if(hasErrors())...{
form.set("id",null);
returnforward("edit");
}
saveEntity(obj);
returngo("list");
}

publicvoiddoEdit(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.addPo(obj);
}

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.toPo(obj,true);
if(hasErrors())
returnforward("edit");
updateEntity(obj);
returngo("list");
}

publicvoiddoDel(WebFormform)...{
removeEntity(getIdValue(form));
go("list");
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));
CommUtil.saveIPageList2WebForm(pageList,form);
}


protectedSerializablegetIdValue(WebFormform)...{
return(Serializable)BeanUtils.convertType(form.get(getIdName()),
getIdClass());
}


protectedClassgetQueryClass()...{
returnQueryObject.class;
}

protectedClassgetIdClass()...{
returnLong.class;
}

protectedStringgetIdName()...{
return"id";
}

protectedabstractvoidsaveEntity(Objectobj);
protectedabstractObjectfindEntityObject(Serializableid);

protectedabstractvoidupdateEntity(Objectobj);
protectedabstractvoidremoveEntity(Serializableid);
protectedabstractIPageListqueryEntity(IQueryObjectqueryObject);
}

以代码比较多的doUpdate及doList为例,我们来看看他有哪些内容:

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));//根据某一种方式先读出需要修改的对象
form.toPo(obj,true);//读取客户端Form表单中传来数据,并更新到域对象中的相应属性。toPo方法还会触发数据较验的执行,true参数还会使得一但验证过程中出现异常,则回滚对obj的操作,也就是不会更改任何obj的属性。
if(hasErrors())//有错的话,则直接返回到数据录入页面
returnforward("edit");
updateEntity(obj);//执行更新操作
returngo("list");//跳转到list命令执行
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));//把form中传来在查询表单中输入的信息,构造查询对象,并执行查询操作
CommUtil.saveIPageList2WebForm(pageList,form);//保存查询结果,并自动使用list.html页面模板来显示查询结果。
}
可以试着用Struts2.0或1.x来实现上面的同样的功能,你会发现需要的代码及配置文件字节会多仅一倍多。
当然,如果熟悉动态语言中的MVC框架,比如Rails,你会发现,这些框架中要实现同样的功能,他的代码不会比EasyJWeb简洁多少。当然,造飞机、火箭的流程及所需要的技术肯定是比造拖拉机、摩托车要复杂得多,我们做的事情就是尽是简化。下面我会从多个方面进入介绍。
这是EasyJWeb新特性介绍的第三篇文章,主题是:简约而不简单,用最少的代码,做尽可能多的事情。
我们坚信,代码量少,表达规范,语法结构稳定的程序,更容易维护。EasyJWeb框架的一个最大特点,就是让你能用最少、简洁、规范的代码,做尽可能多的事情。
在写程序这样一个充满艺术及哲学美的领域里,能用一句代码解决的问题,决不能写两句代码;能不用代码解决的问题,就更不要写代码了:-)。我们要使用简体字,是因为我们知道该简化的一定要简化。简约而不简单,是每一个程序员追求的一种境界。
EasyJWeb的目标就是要让大家书写Java Web应用的时候,尽量的简洁,代码尽量少。但其实现的功能不简单,其体系不简单,其应用的领域不简单。他能让你用简洁及简约的表达方式,写出正统、层次分明、可维护性高的JavaEE应用程序,实现企业级应用的需求。
比如对于一个添删除改查,我们使用正统OO分析的方式就是先进行建模,然后把模型转化为java能识别的领域对象,或者是可持久化Entity对象。有了Entity或Domain,即可在这个基础上构建业务逻辑、DAO以及前端表示层的界面操作。在DAO层,EasyJWeb的应用框架支撑平台中提供了一些非常通用的解决方案,比如泛型DAO,JPA封装等,他能使你根据情况选择最适合你的持久层方案来解决专业问题。对于业务层来说,EasyJWeb通过引入了超级IOC容器,可以使得你用最适合自己的方式来解决业务层的问题,他同样提供了一些通用的业务实践及业务方法等辅助对象来帮助我们能使用尽量少、尽量简洁的代码来解决问题。
下面我们看看在一个添删改查、分页、排序等针对Entity对象的能用操作中,一个基于EasyJWeb写的Action中的内容:

publicclassPersonActionextendsCrudAction...{
@Inject(name="personDao")
privateGenericDAOPerson>dao;


publicvoidsetDao(GenericDAOPerson>dao)...{
this.dao=dao;
}

protectedClassentityClass()...{
returnPerson.class;
}

publicGenericDAOgetDao()...{
returndao;
}
}
对,只需要这么简单的几行代码,告诉这个Action使用哪一个DAO及对哪一个Entity类进行操作,其它的一切都交由EasyJWeb提供的通用CRUD基类搞定。
当然,我们使用其它的java mvc框架也能通过这样的封装来简化用户的Action,但实现同样的功能,EasyJWeb的基类Action所使用的代码肯定是比较少的,而且也是非常直观的。我们来看看添删改查的CrudAction基类及其父类的代码。

abstractpublicclassCrudActionextendsAbstractCrudAction...{
publicabstractGenericDAOgetDao();

protectedObjectfindEntityObject(Serializableid)...{
returngetDao().get(id);
}

protectedIPageListqueryEntity(IQueryObjectqueryObject)...{
returnQueryUtil.query(queryObject,entityClass(),getDao());
}

protectedvoidremoveEntity(Serializableid)...{
getDao().remove(id);
}

protectedvoidsaveEntity(Objectobj)...{
getDao().save(obj);
}

protectedvoidupdateEntity(Objectobj)...{
getDao().update(obj);
}
}
CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

publicabstractclassAbstractCrudActionextendsAbstractPageCmdAction...{
protectedabstractClassentityClass();

publicPagedoInit(WebFormform,Modulemodule)...{
returngo("list");
}

publicPagedoNew(WebFormform,Modulemodule)...{
returnmodule.findPage("edit");
}

publicPagedoSave(WebFormform)...{
Objectobj=form.toPo(entityClass());

if(hasErrors())...{
form.set("id",null);
returnforward("edit");
}
saveEntity(obj);
returngo("list");
}

publicvoiddoEdit(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.addPo(obj);
}

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.toPo(obj,true);
if(hasErrors())
returnforward("edit");
updateEntity(obj);
returngo("list");
}

publicvoiddoDel(WebFormform)...{
removeEntity(getIdValue(form));
go("list");
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));
CommUtil.saveIPageList2WebForm(pageList,form);
}


protectedSerializablegetIdValue(WebFormform)...{
return(Serializable)BeanUtils.convertType(form.get(getIdName()),
getIdClass());
}


protectedClassgetQueryClass()...{
returnQueryObject.class;
}

protectedClassgetIdClass()...{
returnLong.class;
}

protectedStringgetIdName()...{
return"id";
}

protectedabstractvoidsaveEntity(Objectobj);
protectedabstractObjectfindEntityObject(Serializableid);

protectedabstractvoidupdateEntity(Objectobj);
protectedabstractvoidremoveEntity(Serializableid);
protectedabstractIPageListqueryEntity(IQueryObjectqueryObject);
}

以代码比较多的doUpdate及doList为例,我们来看看他有哪些内容:

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));//根据某一种方式先读出需要修改的对象
form.toPo(obj,true);//读取客户端Form表单中传来数据,并更新到域对象中的相应属性。toPo方法还会触发数据较验的执行,true参数还会使得一但验证过程中出现异常,则回滚对obj的操作,也就是不会更改任何obj的属性。
if(hasErrors())//有错的话,则直接返回到数据录入页面
returnforward("edit");
updateEntity(obj);//执行更新操作
returngo("list");//跳转到list命令执行
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));//把form中传来在查询表单中输入的信息,构造查询对象,并执行查询操作
CommUtil.saveIPageList2WebForm(pageList,form);//保存查询结果,并自动使用list.html页面模板来显示查询结果。
}
可以试着用Struts2.0或1.x来实现上面的同样的功能,你会发现需要的代码及配置文件字节会多仅一倍多。
当然,如果熟悉动态语言中的MVC框架,比如Rails,你会发现,这些框架中要实现同样的功能,他的代码不会比EasyJWeb简洁多少。当然,造飞机、火箭的流程及所需要的技术肯定是比造拖拉机、摩托车要复杂得多,我们做的事情就是尽是简化。下面我会从多个方面进入介绍。
这是EasyJWeb新特性介绍的第三篇文章,主题是:简约而不简单,用最少的代码,做尽可能多的事情。
我们坚信,代码量少,表达规范,语法结构稳定的程序,更容易维护。EasyJWeb框架的一个最大特点,就是让你能用最少、简洁、规范的代码,做尽可能多的事情。
在写程序这样一个充满艺术及哲学美的领域里,能用一句代码解决的问题,决不能写两句代码;能不用代码解决的问题,就更不要写代码了:-)。我们要使用简体字,是因为我们知道该简化的一定要简化。简约而不简单,是每一个程序员追求的一种境界。
EasyJWeb的目标就是要让大家书写Java Web应用的时候,尽量的简洁,代码尽量少。但其实现的功能不简单,其体系不简单,其应用的领域不简单。他能让你用简洁及简约的表达方式,写出正统、层次分明、可维护性高的JavaEE应用程序,实现企业级应用的需求。
比如对于一个添删除改查,我们使用正统OO分析的方式就是先进行建模,然后把模型转化为java能识别的领域对象,或者是可持久化Entity对象。有了Entity或Domain,即可在这个基础上构建业务逻辑、DAO以及前端表示层的界面操作。在DAO层,EasyJWeb的应用框架支撑平台中提供了一些非常通用的解决方案,比如泛型DAO,JPA封装等,他能使你根据情况选择最适合你的持久层方案来解决专业问题。对于业务层来说,EasyJWeb通过引入了超级IOC容器,可以使得你用最适合自己的方式来解决业务层的问题,他同样提供了一些通用的业务实践及业务方法等辅助对象来帮助我们能使用尽量少、尽量简洁的代码来解决问题。
下面我们看看在一个添删改查、分页、排序等针对Entity对象的能用操作中,一个基于EasyJWeb写的Action中的内容:

publicclassPersonActionextendsCrudAction...{
@Inject(name="personDao")
privateGenericDAOPerson>dao;


publicvoidsetDao(GenericDAOPerson>dao)...{
this.dao=dao;
}

protectedClassentityClass()...{
returnPerson.class;
}

publicGenericDAOgetDao()...{
returndao;
}
}
对,只需要这么简单的几行代码,告诉这个Action使用哪一个DAO及对哪一个Entity类进行操作,其它的一切都交由EasyJWeb提供的通用CRUD基类搞定。
当然,我们使用其它的java mvc框架也能通过这样的封装来简化用户的Action,但实现同样的功能,EasyJWeb的基类Action所使用的代码肯定是比较少的,而且也是非常直观的。我们来看看添删改查的CrudAction基类及其父类的代码。

abstractpublicclassCrudActionextendsAbstractCrudAction...{
publicabstractGenericDAOgetDao();

protectedObjectfindEntityObject(Serializableid)...{
returngetDao().get(id);
}

protectedIPageListqueryEntity(IQueryObjectqueryObject)...{
returnQueryUtil.query(queryObject,entityClass(),getDao());
}

protectedvoidremoveEntity(Serializableid)...{
getDao().remove(id);
}

protectedvoidsaveEntity(Objectobj)...{
getDao().save(obj);
}

protectedvoidupdateEntity(Objectobj)...{
getDao().update(obj);
}
}
CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

publicabstractclassAbstractCrudActionextendsAbstractPageCmdAction...{
protectedabstractClassentityClass();

publicPagedoInit(WebFormform,Modulemodule)...{
returngo("list");
}

publicPagedoNew(WebFormform,Modulemodule)...{
returnmodule.findPage("edit");
}

publicPagedoSave(WebFormform)...{
Objectobj=form.toPo(entityClass());

if(hasErrors())...{
form.set("id",null);
returnforward("edit");
}
saveEntity(obj);
returngo("list");
}

publicvoiddoEdit(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.addPo(obj);
}

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.toPo(obj,true);
if(hasErrors())
returnforward("edit");
updateEntity(obj);
returngo("list");
}

publicvoiddoDel(WebFormform)...{
removeEntity(getIdValue(form));
go("list");
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));
CommUtil.saveIPageList2WebForm(pageList,form);
}


protectedSerializablegetIdValue(WebFormform)...{
return(Serializable)BeanUtils.convertType(form.get(getIdName()),
getIdClass());
}


protectedClassgetQueryClass()...{
returnQueryObject.class;
}

protectedClassgetIdClass()...{
returnLong.class;
}

protectedStringgetIdName()...{
return"id";
}

protectedabstractvoidsaveEntity(Objectobj);
protectedabstractObjectfindEntityObject(Serializableid);

protectedabstractvoidupdateEntity(Objectobj);
protectedabstractvoidremoveEntity(Serializableid);
protectedabstractIPageListqueryEntity(IQueryObjectqueryObject);
}

以代码比较多的doUpdate及doList为例,我们来看看他有哪些内容:

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));//根据某一种方式先读出需要修改的对象
form.toPo(obj,true);//读取客户端Form表单中传来数据,并更新到域对象中的相应属性。toPo方法还会触发数据较验的执行,true参数还会使得一但验证过程中出现异常,则回滚对obj的操作,也就是不会更改任何obj的属性。
if(hasErrors())//有错的话,则直接返回到数据录入页面
returnforward("edit");
updateEntity(obj);//执行更新操作
returngo("list");//跳转到list命令执行
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));//把form中传来在查询表单中输入的信息,构造查询对象,并执行查询操作
CommUtil.saveIPageList2WebForm(pageList,form);//保存查询结果,并自动使用list.html页面模板来显示查询结果。
}
可以试着用Struts2.0或1.x来实现上面的同样的功能,你会发现需要的代码及配置文件字节会多仅一倍多。
当然,如果熟悉动态语言中的MVC框架,比如Rails,你会发现,这些框架中要实现同样的功能,他的代码不会比EasyJWeb简洁多少。当然,造飞机、火箭的流程及所需要的技术肯定是比造拖拉机、摩托车要复杂得多,我们做的事情就是尽是简化。下面我会从多个方面进入介绍。
这是EasyJWeb新特性介绍的第三篇文章,主题是:简约而不简单,用最少的代码,做尽可能多的事情。
我们坚信,代码量少,表达规范,语法结构稳定的程序,更容易维护。EasyJWeb框架的一个最大特点,就是让你能用最少、简洁、规范的代码,做尽可能多的事情。
在写程序这样一个充满艺术及哲学美的领域里,能用一句代码解决的问题,决不能写两句代码;能不用代码解决的问题,就更不要写代码了:-)。我们要使用简体字,是因为我们知道该简化的一定要简化。简约而不简单,是每一个程序员追求的一种境界。
EasyJWeb的目标就是要让大家书写Java Web应用的时候,尽量的简洁,代码尽量少。但其实现的功能不简单,其体系不简单,其应用的领域不简单。他能让你用简洁及简约的表达方式,写出正统、层次分明、可维护性高的JavaEE应用程序,实现企业级应用的需求。
比如对于一个添删除改查,我们使用正统OO分析的方式就是先进行建模,然后把模型转化为java能识别的领域对象,或者是可持久化Entity对象。有了Entity或Domain,即可在这个基础上构建业务逻辑、DAO以及前端表示层的界面操作。在DAO层,EasyJWeb的应用框架支撑平台中提供了一些非常通用的解决方案,比如泛型DAO,JPA封装等,他能使你根据情况选择最适合你的持久层方案来解决专业问题。对于业务层来说,EasyJWeb通过引入了超级IOC容器,可以使得你用最适合自己的方式来解决业务层的问题,他同样提供了一些通用的业务实践及业务方法等辅助对象来帮助我们能使用尽量少、尽量简洁的代码来解决问题。
下面我们看看在一个添删改查、分页、排序等针对Entity对象的能用操作中,一个基于EasyJWeb写的Action中的内容:

publicclassPersonActionextendsCrudAction...{
@Inject(name="personDao")
privateGenericDAOPerson>dao;


publicvoidsetDao(GenericDAOPerson>dao)...{
this.dao=dao;
}

protectedClassentityClass()...{
returnPerson.class;
}

publicGenericDAOgetDao()...{
returndao;
}
}
对,只需要这么简单的几行代码,告诉这个Action使用哪一个DAO及对哪一个Entity类进行操作,其它的一切都交由EasyJWeb提供的通用CRUD基类搞定。
当然,我们使用其它的java mvc框架也能通过这样的封装来简化用户的Action,但实现同样的功能,EasyJWeb的基类Action所使用的代码肯定是比较少的,而且也是非常直观的。我们来看看添删改查的CrudAction基类及其父类的代码。

abstractpublicclassCrudActionextendsAbstractCrudAction...{
publicabstractGenericDAOgetDao();

protectedObjectfindEntityObject(Serializableid)...{
returngetDao().get(id);
}

protectedIPageListqueryEntity(IQueryObjectqueryObject)...{
returnQueryUtil.query(queryObject,entityClass(),getDao());
}

protectedvoidremoveEntity(Serializableid)...{
getDao().remove(id);
}

protectedvoidsaveEntity(Objectobj)...{
getDao().save(obj);
}

protectedvoidupdateEntity(Objectobj)...{
getDao().update(obj);
}
}
CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

publicabstractclassAbstractCrudActionextendsAbstractPageCmdAction...{
protectedabstractClassentityClass();

publicPagedoInit(WebFormform,Modulemodule)...{
returngo("list");
}

publicPagedoNew(WebFormform,Modulemodule)...{
returnmodule.findPage("edit");
}

publicPagedoSave(WebFormform)...{
Objectobj=form.toPo(entityClass());

if(hasErrors())...{
form.set("id",null);
returnforward("edit");
}
saveEntity(obj);
returngo("list");
}

publicvoiddoEdit(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.addPo(obj);
}

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.toPo(obj,true);
if(hasErrors())
returnforward("edit");
updateEntity(obj);
returngo("list");
}

publicvoiddoDel(WebFormform)...{
removeEntity(getIdValue(form));
go("list");
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));
CommUtil.saveIPageList2WebForm(pageList,form);
}


protectedSerializablegetIdValue(WebFormform)...{
return(Serializable)BeanUtils.convertType(form.get(getIdName()),
getIdClass());
}


protectedClassgetQueryClass()...{
returnQueryObject.class;
}

protectedClassgetIdClass()...{
returnLong.class;
}

protectedStringgetIdName()...{
return"id";
}

protectedabstractvoidsaveEntity(Objectobj);
protectedabstractObjectfindEntityObject(Serializableid);

protectedabstractvoidupdateEntity(Objectobj);
protectedabstractvoidremoveEntity(Serializableid);
protectedabstractIPageListqueryEntity(IQueryObjectqueryObject);
}

以代码比较多的doUpdate及doList为例,我们来看看他有哪些内容:

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));//根据某一种方式先读出需要修改的对象
form.toPo(obj,true);//读取客户端Form表单中传来数据,并更新到域对象中的相应属性。toPo方法还会触发数据较验的执行,true参数还会使得一但验证过程中出现异常,则回滚对obj的操作,也就是不会更改任何obj的属性。
if(hasErrors())//有错的话,则直接返回到数据录入页面
returnforward("edit");
updateEntity(obj);//执行更新操作
returngo("list");//跳转到list命令执行
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));//把form中传来在查询表单中输入的信息,构造查询对象,并执行查询操作
CommUtil.saveIPageList2WebForm(pageList,form);//保存查询结果,并自动使用list.html页面模板来显示查询结果。
}
可以试着用Struts2.0或1.x来实现上面的同样的功能,你会发现需要的代码及配置文件字节会多仅一倍多。
当然,如果熟悉动态语言中的MVC框架,比如Rails,你会发现,这些框架中要实现同样的功能,他的代码不会比EasyJWeb简洁多少。当然,造飞机、火箭的流程及所需要的技术肯定是比造拖拉机、摩托车要复杂得多,我们做的事情就是尽是简化。下面我会从多个方面进入介绍。
这是EasyJWeb新特性介绍的第三篇文章,主题是:简约而不简单,用最少的代码,做尽可能多的事情。
我们坚信,代码量少,表达规范,语法结构稳定的程序,更容易维护。EasyJWeb框架的一个最大特点,就是让你能用最少、简洁、规范的代码,做尽可能多的事情。
在写程序这样一个充满艺术及哲学美的领域里,能用一句代码解决的问题,决不能写两句代码;能不用代码解决的问题,就更不要写代码了:-)。我们要使用简体字,是因为我们知道该简化的一定要简化。简约而不简单,是每一个程序员追求的一种境界。
EasyJWeb的目标就是要让大家书写Java Web应用的时候,尽量的简洁,代码尽量少。但其实现的功能不简单,其体系不简单,其应用的领域不简单。他能让你用简洁及简约的表达方式,写出正统、层次分明、可维护性高的JavaEE应用程序,实现企业级应用的需求。
比如对于一个添删除改查,我们使用正统OO分析的方式就是先进行建模,然后把模型转化为java能识别的领域对象,或者是可持久化Entity对象。有了Entity或Domain,即可在这个基础上构建业务逻辑、DAO以及前端表示层的界面操作。在DAO层,EasyJWeb的应用框架支撑平台中提供了一些非常通用的解决方案,比如泛型DAO,JPA封装等,他能使你根据情况选择最适合你的持久层方案来解决专业问题。对于业务层来说,EasyJWeb通过引入了超级IOC容器,可以使得你用最适合自己的方式来解决业务层的问题,他同样提供了一些通用的业务实践及业务方法等辅助对象来帮助我们能使用尽量少、尽量简洁的代码来解决问题。
下面我们看看在一个添删改查、分页、排序等针对Entity对象的能用操作中,一个基于EasyJWeb写的Action中的内容:

publicclassPersonActionextendsCrudAction...{
@Inject(name="personDao")
privateGenericDAOPerson>dao;


publicvoidsetDao(GenericDAOPerson>dao)...{
this.dao=dao;
}

protectedClassentityClass()...{
returnPerson.class;
}

publicGenericDAOgetDao()...{
returndao;
}
}
对,只需要这么简单的几行代码,告诉这个Action使用哪一个DAO及对哪一个Entity类进行操作,其它的一切都交由EasyJWeb提供的通用CRUD基类搞定。
当然,我们使用其它的java mvc框架也能通过这样的封装来简化用户的Action,但实现同样的功能,EasyJWeb的基类Action所使用的代码肯定是比较少的,而且也是非常直观的。我们来看看添删改查的CrudAction基类及其父类的代码。

abstractpublicclassCrudActionextendsAbstractCrudAction...{
publicabstractGenericDAOgetDao();

protectedObjectfindEntityObject(Serializableid)...{
returngetDao().get(id);
}

protectedIPageListqueryEntity(IQueryObjectqueryObject)...{
returnQueryUtil.query(queryObject,entityClass(),getDao());
}

protectedvoidremoveEntity(Serializableid)...{
getDao().remove(id);
}

protectedvoidsaveEntity(Objectobj)...{
getDao().save(obj);
}

protectedvoidupdateEntity(Objectobj)...{
getDao().update(obj);
}
}
CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

publicabstractclassAbstractCrudActionextendsAbstractPageCmdAction...{
protectedabstractClassentityClass();

publicPagedoInit(WebFormform,Modulemodule)...{
returngo("list");
}

publicPagedoNew(WebFormform,Modulemodule)...{
returnmodule.findPage("edit");
}

publicPagedoSave(WebFormform)...{
Objectobj=form.toPo(entityClass());

if(hasErrors())...{
form.set("id",null);
returnforward("edit");
}
saveEntity(obj);
returngo("list");
}

publicvoiddoEdit(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.addPo(obj);
}

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));
form.toPo(obj,true);
if(hasErrors())
returnforward("edit");
updateEntity(obj);
returngo("list");
}

publicvoiddoDel(WebFormform)...{
removeEntity(getIdValue(form));
go("list");
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));
CommUtil.saveIPageList2WebForm(pageList,form);
}


protectedSerializablegetIdValue(WebFormform)...{
return(Serializable)BeanUtils.convertType(form.get(getIdName()),
getIdClass());
}


protectedClassgetQueryClass()...{
returnQueryObject.class;
}

protectedClassgetIdClass()...{
returnLong.class;
}

protectedStringgetIdName()...{
return"id";
}

protectedabstractvoidsaveEntity(Objectobj);
protectedabstractObjectfindEntityObject(Serializableid);

protectedabstractvoidupdateEntity(Objectobj);
protectedabstractvoidremoveEntity(Serializableid);
protectedabstractIPageListqueryEntity(IQueryObjectqueryObject);
}

以代码比较多的doUpdate及doList为例,我们来看看他有哪些内容:

publicPagedoUpdate(WebFormform)...{
Objectobj=findEntityObject(getIdValue(form));//根据某一种方式先读出需要修改的对象
form.toPo(obj,true);//读取客户端Form表单中传来数据,并更新到域对象中的相应属性。toPo方法还会触发数据较验的执行,true参数还会使得一但验证过程中出现异常,则回滚对obj的操作,也就是不会更改任何obj的属性。
if(hasErrors())//有错的话,则直接返回到数据录入页面
returnforward("edit");
updateEntity(obj);//执行更新操作
returngo("list");//跳转到list命令执行
}

publicvoiddoList(WebFormform)...{
IPageListpageList=queryEntity((IQueryObject)form.toPo(getQueryClass()));//把form中传来在查询表单中输入的信息,构造查询对象,并执行查询操作
CommUtil.saveIPageList2WebForm(pageList,form);//保存查询结果,并自动使用list.html页面模板来显示查询结果。
}
可以试着用Struts2.0或1.x来实现上面的同样的功能,你会发现需要的代码及配置文件字节会多仅一倍多。
当然,如果熟悉动态语言中的MVC框架,比如Rails,你会发现,这些框架中要实现同样的功能,他的代码不会比EasyJWeb简洁多少。当然,造飞机、火箭的流程及所需要的技术肯定是比造拖拉机、摩托车要复杂得多,我们做的事情就是尽是简化。下面我会从多个方面进入介绍。
分享到:
相关推荐
- 遵循单一职责原则,一个类或方法只做一件事情。 - 尽量减少类的成员变量数量,增加内聚性,降低耦合度。 - 使用构造函数初始化对象,避免在类中使用静态初始化块。 4. **异常处理**: - 异常不应该被忽视,...
垂直格式上行数应该尽量少,简洁明了,不同的概念或逻辑代码应该用空行隔开,相关代码应该尽量写在一起。水平格式上需要关注缩进和对齐。 六、对象与数据结构 区别过程式代码和面向对象代码非常重要。过程式代码...
在编写函数时,应遵循单一职责原则,确保每个函数只做一件事情,避免过长的函数和过于复杂的逻辑。 再者,Synopsys代码风格重视错误处理和异常管理。良好的错误处理机制能及时发现并报告问题,避免程序的意外崩溃。...
- 方法应尽可能短小,每个方法只做一件事情,以提高可读性和可测试性。 - 避免过长的控制流,如嵌套循环和if-else语句,考虑使用策略模式或函数式编程技巧简化逻辑。 4. **错误处理**: - 不要忽视异常,使用try...
* 一行代码是否只做一件事情 * if、for、while、do等语句是否自占一行 * 分界符‘{’和‘}’是否独占一行并且位于同一列,同时与引用它们的语句左对齐 * 缩进是否合格 * 每行代码的长度是否在80个字符以内 * 注释...
- 遵循单一职责原则(SRP),一个类只做一件事情。 - 尽量减少类的成员变量,提倡使用局部变量。 - 避免使用过长的生命周期,尽可能早地初始化对象,晚地销毁。 - 使用访问控制符来保护数据,如私有化成员变量并...
一个函数或方法应只做一件事情,这样可以降低复杂度,提高可测试性和可理解性。 5. **共享性(Re-usable Code)**:设计模块化和可重用的代码。创建通用的函数库或组件,可以在多个项目中复用,减少重复工作。 6. ...
3. 遵循单一职责原则,每个类或方法只做一件事情。 ### 变量度量 变量设计应遵循最小作用域原则,避免全局变量。合理使用局部变量,避免过多的临时变量。 ### Java 5.0特性 Java 5引入了许多新特性,如枚举、泛型...
- 遵循单一职责原则,每个类或方法只做一件事情。 - 使用恰当的访问修饰符(public, private, protected)来控制访问级别。 - 避免过长的方法,一般不超过50行,复杂的逻辑应拆分为多个方法。 - 优先使用接口而...
3. 遵循单一职责原则(SRP),每个类或方法只做一件事情。 4. 使用using语句块自动管理资源,如`using System;`。 5. 使用`readonly`修饰符来声明只读字段,确保数据安全性。 四、异常处理 1. 不要滥用`catch ...
1. **单一职责原则**:每个类或模块只做一件事情,确保代码职责分明。 2. **开闭原则**:对扩展开放,对修改关闭,设计时考虑到未来需求变化,使代码易于扩展。 3. **里氏替换原则**:子类型必须能够替换其基类型,...
3. **代码结构**:保持函数短小,每个函数尽量只做一件事情。使用面向对象原则,如单一职责原则(SRP)、开放封闭原则(OCP)等。合理组织类和文件,每个类应有明确的职责。 4. **错误处理**:正确处理异常和错误,...
通常,每个类都应该至少有一个构造函数,即使这个构造函数没有做任何事情,也应当明确声明。构造函数的存在不仅是为了初始化对象状态,也是为了遵循面向对象编程的原则,确保对象创建时的封装性和一致性。 **1.2.2 ...
13. **单一职责**:每个函数和方法应只做一件事情,避免过多的责任混杂在一起。这样可以提高代码的可读性和可维护性。 14. **参数管理**:避免过长的函数签名,如示例中的 `MyGirlFriendFunc` 接受过多参数。可以...
重要的一点是,函数应该尽量单一职责,即函数只完成一件事情,而且要尽可能少地使用参数。每个函数应尽量保持在一个抽象层级上,避免出现逻辑上的复杂嵌套。这样的设计有助于代码的可维护和可测试。 ### 代码风格...
如果你不知道什么是全局变量,那么只需要知道软件设计的一般原则是要尽量少使用全局变量,因为有可能带来无法预测的结果。 在丰田的软件系统中,每个 Task 都有自己的名字,但这些名字非常敏感,敏感到每次被提及的...
这意味着编写尽量少的代码,但这并不意味着要舍弃代码的质量和可读性。 Java 开发者应该尽量减少代码的行数,但同时也要确保代码的可读性和可维护性。 四、请不要硬编码 硬编码是指在代码中硬编码变量的值,这可能...
- 尽量减少全局变量的使用,提高代码的封装性。 - 为方法添加默认访问修饰符(无修饰符),除非需要特定的访问级别。 4. **异常处理** - 不要忽视异常,确保每个可能抛出异常的方法都进行捕获或声明。 - 使用...
- 一个类只做一件事情,遵循单一职责原则。 - 遵循模块化设计,将相关功能封装到单独的类或模块中。 - 使用接口定义契约,提高代码的灵活性和可测试性。 7. **错误处理和日志**: - 不要忽视异常,确保所有可能...