`
阿尔萨斯
  • 浏览: 4203785 次
社区版块
存档分类
最新评论

用尽量少的代码,做尽量多的事情

 
阅读更多
<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简洁多少。当然,造飞机、火箭的流程及所需要的技术肯定是比造拖拉机、摩托车要复杂得多,我们做的事情就是尽是简化。下面我会从多个方面进入介绍。




分享到:
评论

相关推荐

    安卓Excelwordppt文档读写相关-在android中显示表格是非常痛苦的事情以为屏幕空间有限一般我们尽量避免表格这种形式出现但是如果你非要使用表格那么可以考虑使用TableFixHeaders.rar

    在android中显示表格是非常痛苦的事情,以为屏幕空间有限,一般我们尽量避免表格这种形式出现,但是如果你非要使用表格,那么可以考虑使用TableFixHeaders.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调...

    自己动手写操作系统(含源代码).part2

    我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己的系统,让电脑听从自己的指令,对系统的每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科的解释是...

    自己动手写操作系统(含源代码).part1

    我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己的系统,让电脑听从自己的指令,对系统的每个部分都了如指掌。 黑客(hacker)实际是褒义词,维基百科的解释是...

    Snipe5.1.5相关资料整合包.zip

    有些简单的事情还是要去做的, 我已经部署好,并且也修改了很多的代码以满足自己在内部网络的使用,在此一一跟大家分享。下面将Snipe-IT从安装部署到使用以及修改代码进行一一分享;其中翻译的中文手册,因为英文...

    Guns基于Spring Boot2,致力于做更简洁的后台管理系统 .rar

    一个好的后台管理系统框架可以让我们少做很多事情,有更多的时间来编写自己感兴趣的代码,下面就介绍一下guns这个方便的后台管理系统框架如何快速使用。 1、项目可以从码云上拉取,Guns: Guns基于Spring Boot2,...

    jQuery权威指南-源代码

    但在阅读本书的示例时,请尽量不要照抄书中的所有示例,而是重在理解代码的实现思路,自己动手开发相似功能的应用,并逐步完善其功能,这样才能真正领会示例所反映出的jQuery技术的理论本质。 联系作者 希望这部...

    VC++6.0核心编程源码.rar

    你可以看到,每个错误都有3种表示法:即一个消息ID(这是你可以在源代码中使用的一个宏,以便与GetLastError的返回值进行比较),消息文本(对错误的英文描述)和一个号码(你应该避免使用这个号码,而应该使用消息...

    ant使用基础啊

    功能强大--ant能做的事情很多,可能你用了很久,你仍然不知道它能有多少功能。当你自己开发一些ant插件的时候,你会发现它更多的功能。 4,ant的兄弟make ant做的很多事情,大部分是曾经有一个叫make的所做的,不过...

    web前端开发JQuery常用实例代码片段(50个)

    这些都是我尽量记住的有着最佳性能的代码段,因此如果你发现你任何可以做得更好的地方的话,欢迎把你的版本粘贴在评论中!我希望你在这一文章中能找到有帮助的东西。 1. 如何创建嵌套的过滤器 //允许你减少集合中的...

    antd-visual-editor:ant-design 组件库实时可视化编辑器,实时生成 react 代码

    代码基本很难维护,现在发布出来仅供参考思路,感兴趣的可以根据原理重构一版,实现一个更完备的可视化编辑友情提醒:不建议在团队内投入大量精力做类似的事情(企图一步到位改变开发现状),与行业里用 AI 切页面...

    KKORM-demo

    KKORM 是一款 Android轻量级sqlite orm框架~ 宗旨:简洁、快速。代码少最尽量多的事情。你的类不需要任何继承,即可轻松进行数据库操作。

    nginx核心讲解

    为了达到这个目标,文档里就尽量的少贴代码多画图,当然,一些必要的代码是不可缺少的,所以你还是会在本文档里看到源代码。虽然我的个人期望比较好,可惜水平比较矬,目前写出来的文档也就这个样了。 最后,说一下...

    基于Android的记事本的设计与开发(实验报告+源代码).pdf

    2.1性能需求 由于android系统本⾝的资源限制以及⽤户⼿机设备的硬件性能问题,该记事本在性能上需要满⾜以下⼏点要求 能够兼容低版本的android系统 内存占⽤尽量少,不能出现内存泄露的问题 CPU资源占⽤尽量少,...

    Afinal(jar包)

    Afinal最新jar包(使用Afinal框架,尽量一行代码完成所有事情。)

    从实例谈面向对象编程、工厂模式和重构

    不能飞翔,就少了几许灵动的气韵。我们需要 给代码带去温暖的阳光,让僵冷的翅膀重新飞起来。结合实例,通过应用 OOP、设计模式和重构,你会看 到代码是怎样一步一步复活的。 为了更好的理解设计思想,实例尽可能...

    afinal框架实现多布局的新闻列表Android

    约定配置的方式之后,尽量一行代码完成所有事情,代码入侵性小,在三者中比较推荐。在这里我们主要使用http框架的 FinalHttp和FinalBitmap组件实现网络图片的加载。 实现功能:使用afinal框架+Gson实现多布局的新闻...

    jquery插件使用方法大全

    其宗旨是——WRITE LESS,DO MORE,写更少的代码,做更多的事情。 由于目前高校基本尚未开JavaScript的相关课程,目前jQuery的学习,使用,研究都仅限于在职Web程序员之间。 用jq的前提,首先要引用一个有jq的文件 ...

    南方排八字专业程序

    PC机软件,需要.NET Framework 2.0  排八字是命理爱好者经常要做的事情。可能您书桌上摆放着《万年历》、《三命通会》等工具书。每排一八字,您可能要翻阅好多遍这些工具书;计算大运的起运岁数时还得动用点...

Global site tag (gtag.js) - Google Analytics