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

news/2024/7/8 3:53:56

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

 

public   class  PersonAction  extends  CrudAction  {
 @Inject(name
="personDao")
 
private GenericDAO<Person> dao;
 
 
public void setDao(GenericDAO<Person> dao) {
  
this.dao = dao;
 }

 
protected Class entityClass() {  
  
return Person.class;
 }

 
public GenericDAO getDao() 
  
return dao;
 }
 
}


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

abstract   public   class  CrudAction  extends  AbstractCrudAction  {
 
public abstract GenericDAO getDao();
 
protected Object findEntityObject(Serializable id) {
  
return getDao().get(id);
 }

 
protected IPageList queryEntity(IQueryObject queryObject) {
  
return QueryUtil.query(queryObject, entityClass(), getDao());
 }

 
protected void removeEntity(Serializable id) {
  getDao().remove(id);
 }

 
protected void saveEntity(Object obj) {
  getDao().save(obj);
 }

 
protected void updateEntity(Object obj) {
  getDao().update(obj);
 }

}


  CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

public   abstract   class  AbstractCrudAction  extends  AbstractPageCmdAction  {
 
protected abstract Class entityClass();
 
public Page doInit(WebForm form, Module module) {
  
return go("list");
 }

 
public Page doNew(WebForm form, Module module) {
  
return module.findPage("edit");
 }

 
public Page doSave(WebForm form) {
  Object obj 
= form.toPo(entityClass());
  
if (hasErrors()) {
   form.set(
"id"null);
   
return forward("edit");
  }

  saveEntity(obj);
  
return go("list");
 }

 
public void doEdit(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.addPo(obj);
 }

 
public Page doUpdate(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.toPo(obj,
true);
  
if (hasErrors())
   
return forward("edit");
  updateEntity(obj);
  
return go("list");
 }

 
public void doDel(WebForm form) {
  removeEntity(getIdValue(form));
  go(
"list");
 }

 
public void doList(WebForm form) {
  IPageList pageList 
= queryEntity((IQueryObject) form.toPo(getQueryClass()));
  CommUtil.saveIPageList2WebForm(pageList, form);
 }


 
protected Serializable getIdValue(WebForm form) {
  
return (Serializable) BeanUtils.convertType(form.get(getIdName()),
    getIdClass());
 }


 
protected Class getQueryClass() {
  
return QueryObject.class;
 }

 
protected Class getIdClass() {
  
return Long.class;
 }

 
protected String getIdName() {
  
return "id";
 }


 
protected abstract void saveEntity(Object obj);
 
protected abstract Object findEntityObject(Serializable id);

 
protected abstract void updateEntity(Object obj);
 
protected abstract void removeEntity(Serializable id);
 
protected abstract IPageList queryEntity(IQueryObject queryObject);
}


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

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

 

  public   void  doList(WebForm form)  {
  IPageList pageList 
= 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中的内容:

 

public   class  PersonAction  extends  CrudAction  {
 @Inject(name
="personDao")
 
private GenericDAO<Person> dao;
 
 
public void setDao(GenericDAO<Person> dao) {
  
this.dao = dao;
 }

 
protected Class entityClass() {  
  
return Person.class;
 }

 
public GenericDAO getDao() 
  
return dao;
 }
 
}


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

abstract   public   class  CrudAction  extends  AbstractCrudAction  {
 
public abstract GenericDAO getDao();
 
protected Object findEntityObject(Serializable id) {
  
return getDao().get(id);
 }

 
protected IPageList queryEntity(IQueryObject queryObject) {
  
return QueryUtil.query(queryObject, entityClass(), getDao());
 }

 
protected void removeEntity(Serializable id) {
  getDao().remove(id);
 }

 
protected void saveEntity(Object obj) {
  getDao().save(obj);
 }

 
protected void updateEntity(Object obj) {
  getDao().update(obj);
 }

}


  CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

public   abstract   class  AbstractCrudAction  extends  AbstractPageCmdAction  {
 
protected abstract Class entityClass();
 
public Page doInit(WebForm form, Module module) {
  
return go("list");
 }

 
public Page doNew(WebForm form, Module module) {
  
return module.findPage("edit");
 }

 
public Page doSave(WebForm form) {
  Object obj 
= form.toPo(entityClass());
  
if (hasErrors()) {
   form.set(
"id"null);
   
return forward("edit");
  }

  saveEntity(obj);
  
return go("list");
 }

 
public void doEdit(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.addPo(obj);
 }

 
public Page doUpdate(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.toPo(obj,
true);
  
if (hasErrors())
   
return forward("edit");
  updateEntity(obj);
  
return go("list");
 }

 
public void doDel(WebForm form) {
  removeEntity(getIdValue(form));
  go(
"list");
 }

 
public void doList(WebForm form) {
  IPageList pageList 
= queryEntity((IQueryObject) form.toPo(getQueryClass()));
  CommUtil.saveIPageList2WebForm(pageList, form);
 }


 
protected Serializable getIdValue(WebForm form) {
  
return (Serializable) BeanUtils.convertType(form.get(getIdName()),
    getIdClass());
 }


 
protected Class getQueryClass() {
  
return QueryObject.class;
 }

 
protected Class getIdClass() {
  
return Long.class;
 }

 
protected String getIdName() {
  
return "id";
 }


 
protected abstract void saveEntity(Object obj);
 
protected abstract Object findEntityObject(Serializable id);

 
protected abstract void updateEntity(Object obj);
 
protected abstract void removeEntity(Serializable id);
 
protected abstract IPageList queryEntity(IQueryObject queryObject);
}


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

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

 

  public   void  doList(WebForm form)  {
  IPageList pageList 
= 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中的内容:

 

public   class  PersonAction  extends  CrudAction  {
 @Inject(name
="personDao")
 
private GenericDAO<Person> dao;
 
 
public void setDao(GenericDAO<Person> dao) {
  
this.dao = dao;
 }

 
protected Class entityClass() {  
  
return Person.class;
 }

 
public GenericDAO getDao() 
  
return dao;
 }
 
}


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

abstract   public   class  CrudAction  extends  AbstractCrudAction  {
 
public abstract GenericDAO getDao();
 
protected Object findEntityObject(Serializable id) {
  
return getDao().get(id);
 }

 
protected IPageList queryEntity(IQueryObject queryObject) {
  
return QueryUtil.query(queryObject, entityClass(), getDao());
 }

 
protected void removeEntity(Serializable id) {
  getDao().remove(id);
 }

 
protected void saveEntity(Object obj) {
  getDao().save(obj);
 }

 
protected void updateEntity(Object obj) {
  getDao().update(obj);
 }

}


  CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

public   abstract   class  AbstractCrudAction  extends  AbstractPageCmdAction  {
 
protected abstract Class entityClass();
 
public Page doInit(WebForm form, Module module) {
  
return go("list");
 }

 
public Page doNew(WebForm form, Module module) {
  
return module.findPage("edit");
 }

 
public Page doSave(WebForm form) {
  Object obj 
= form.toPo(entityClass());
  
if (hasErrors()) {
   form.set(
"id"null);
   
return forward("edit");
  }

  saveEntity(obj);
  
return go("list");
 }

 
public void doEdit(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.addPo(obj);
 }

 
public Page doUpdate(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.toPo(obj,
true);
  
if (hasErrors())
   
return forward("edit");
  updateEntity(obj);
  
return go("list");
 }

 
public void doDel(WebForm form) {
  removeEntity(getIdValue(form));
  go(
"list");
 }

 
public void doList(WebForm form) {
  IPageList pageList 
= queryEntity((IQueryObject) form.toPo(getQueryClass()));
  CommUtil.saveIPageList2WebForm(pageList, form);
 }


 
protected Serializable getIdValue(WebForm form) {
  
return (Serializable) BeanUtils.convertType(form.get(getIdName()),
    getIdClass());
 }


 
protected Class getQueryClass() {
  
return QueryObject.class;
 }

 
protected Class getIdClass() {
  
return Long.class;
 }

 
protected String getIdName() {
  
return "id";
 }


 
protected abstract void saveEntity(Object obj);
 
protected abstract Object findEntityObject(Serializable id);

 
protected abstract void updateEntity(Object obj);
 
protected abstract void removeEntity(Serializable id);
 
protected abstract IPageList queryEntity(IQueryObject queryObject);
}


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

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

 

  public   void  doList(WebForm form)  {
  IPageList pageList 
= 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中的内容:

 

public   class  PersonAction  extends  CrudAction  {
 @Inject(name
="personDao")
 
private GenericDAO<Person> dao;
 
 
public void setDao(GenericDAO<Person> dao) {
  
this.dao = dao;
 }

 
protected Class entityClass() {  
  
return Person.class;
 }

 
public GenericDAO getDao() 
  
return dao;
 }
 
}


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

abstract   public   class  CrudAction  extends  AbstractCrudAction  {
 
public abstract GenericDAO getDao();
 
protected Object findEntityObject(Serializable id) {
  
return getDao().get(id);
 }

 
protected IPageList queryEntity(IQueryObject queryObject) {
  
return QueryUtil.query(queryObject, entityClass(), getDao());
 }

 
protected void removeEntity(Serializable id) {
  getDao().remove(id);
 }

 
protected void saveEntity(Object obj) {
  getDao().save(obj);
 }

 
protected void updateEntity(Object obj) {
  getDao().update(obj);
 }

}


  CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

public   abstract   class  AbstractCrudAction  extends  AbstractPageCmdAction  {
 
protected abstract Class entityClass();
 
public Page doInit(WebForm form, Module module) {
  
return go("list");
 }

 
public Page doNew(WebForm form, Module module) {
  
return module.findPage("edit");
 }

 
public Page doSave(WebForm form) {
  Object obj 
= form.toPo(entityClass());
  
if (hasErrors()) {
   form.set(
"id"null);
   
return forward("edit");
  }

  saveEntity(obj);
  
return go("list");
 }

 
public void doEdit(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.addPo(obj);
 }

 
public Page doUpdate(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.toPo(obj,
true);
  
if (hasErrors())
   
return forward("edit");
  updateEntity(obj);
  
return go("list");
 }

 
public void doDel(WebForm form) {
  removeEntity(getIdValue(form));
  go(
"list");
 }

 
public void doList(WebForm form) {
  IPageList pageList 
= queryEntity((IQueryObject) form.toPo(getQueryClass()));
  CommUtil.saveIPageList2WebForm(pageList, form);
 }


 
protected Serializable getIdValue(WebForm form) {
  
return (Serializable) BeanUtils.convertType(form.get(getIdName()),
    getIdClass());
 }


 
protected Class getQueryClass() {
  
return QueryObject.class;
 }

 
protected Class getIdClass() {
  
return Long.class;
 }

 
protected String getIdName() {
  
return "id";
 }


 
protected abstract void saveEntity(Object obj);
 
protected abstract Object findEntityObject(Serializable id);

 
protected abstract void updateEntity(Object obj);
 
protected abstract void removeEntity(Serializable id);
 
protected abstract IPageList queryEntity(IQueryObject queryObject);
}


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

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

 

  public   void  doList(WebForm form)  {
  IPageList pageList 
= 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中的内容:

 

public   class  PersonAction  extends  CrudAction  {
 @Inject(name
="personDao")
 
private GenericDAO<Person> dao;
 
 
public void setDao(GenericDAO<Person> dao) {
  
this.dao = dao;
 }

 
protected Class entityClass() {  
  
return Person.class;
 }

 
public GenericDAO getDao() 
  
return dao;
 }
 
}


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

abstract   public   class  CrudAction  extends  AbstractCrudAction  {
 
public abstract GenericDAO getDao();
 
protected Object findEntityObject(Serializable id) {
  
return getDao().get(id);
 }

 
protected IPageList queryEntity(IQueryObject queryObject) {
  
return QueryUtil.query(queryObject, entityClass(), getDao());
 }

 
protected void removeEntity(Serializable id) {
  getDao().remove(id);
 }

 
protected void saveEntity(Object obj) {
  getDao().save(obj);
 }

 
protected void updateEntity(Object obj) {
  getDao().update(obj);
 }

}


  CrudAction的父类AbstractPageCmdAction,也就是添删改查CRUD性质应用的基类的代码,如下:

public   abstract   class  AbstractCrudAction  extends  AbstractPageCmdAction  {
 
protected abstract Class entityClass();
 
public Page doInit(WebForm form, Module module) {
  
return go("list");
 }

 
public Page doNew(WebForm form, Module module) {
  
return module.findPage("edit");
 }

 
public Page doSave(WebForm form) {
  Object obj 
= form.toPo(entityClass());
  
if (hasErrors()) {
   form.set(
"id"null);
   
return forward("edit");
  }

  saveEntity(obj);
  
return go("list");
 }

 
public void doEdit(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.addPo(obj);
 }

 
public Page doUpdate(WebForm form) {
  Object obj 
= findEntityObject(getIdValue(form));
  form.toPo(obj,
true);
  
if (hasErrors())
   
return forward("edit");
  updateEntity(obj);
  
return go("list");
 }

 
public void doDel(WebForm form) {
  removeEntity(getIdValue(form));
  go(
"list");
 }

 
public void doList(WebForm form) {
  IPageList pageList 
= queryEntity((IQueryObject) form.toPo(getQueryClass()));
  CommUtil.saveIPageList2WebForm(pageList, form);
 }


 
protected Serializable getIdValue(WebForm form) {
  
return (Serializable) BeanUtils.convertType(form.get(getIdName()),
    getIdClass());
 }


 
protected Class getQueryClass() {
  
return QueryObject.class;
 }

 
protected Class getIdClass() {
  
return Long.class;
 }

 
protected String getIdName() {
  
return "id";
 }


 
protected abstract void saveEntity(Object obj);
 
protected abstract Object findEntityObject(Serializable id);

 
protected abstract void updateEntity(Object obj);
 
protected abstract void removeEntity(Serializable id);
 
protected abstract IPageList queryEntity(IQueryObject queryObject);
}


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

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

 

  public   void  doList(WebForm form)  {
  IPageList pageList 
= queryEntity((IQueryObject) form.toPo(getQueryClass()));//把form中传来在查询表单中输入的信息,构造查询对象,并执行查询操作
  CommUtil.saveIPageList2WebForm(pageList, form);//保存查询结果,并自动使用list.html页面模板来显示查询结果。
 }

  可以试着用Struts2.0或1.x来实现上面的同样的功能,你会发现需要的代码及配置文件字节会多仅一倍多。

  当然,如果熟悉动态语言中的MVC框架,比如Rails,你会发现,这些框架中要实现同样的功能,他的代码不会比EasyJWeb简洁多少。当然,造飞机、火箭的流程及所需要的技术肯定是比造拖拉机、摩托车要复杂得多,我们做的事情就是尽是简化。下面我会从多个方面进入介绍。
 





http://www.niftyadmin.cn/n/3648067.html

相关文章

.glusterfs_如何在Ubuntu 20.04上使用GlusterFS创建冗余存储池

.glusterfsAn earlier version of this tutorial was written by Justin Ellingwood. 本教程的早期版本由Justin Ellingwood编写。 介绍 (Introduction) When storing any critical data, having a single point of failure is very risky. While many databases and other so…

EasyJWeb、RoR、JSFStruts2,谁更Easy?

这是一篇摘自EasyJF团队交流群里面关于MVC框架的讨论&#xff0c;涉及到目前的一些主流框架&#xff0c;如RoR、JSF及Struts2等&#xff0c;如何改进EasyJWeb&#xff0c;如何才能让WEB应用开发变得快速、高效、简单。这是讨论的主题&#xff0c;这里发出来&#xff0c;欢迎更多…

EasyJF第一次网下交流会成功召开

3月31日&#xff0c;EasyJF开源团队的第一次网下交流会成功在北京召开。这次会议是EasyJF开源的第一次网下交流会&#xff0c;会议主要对EasyJF2007年要开展项目、工作、团队的改组、目标、定位、管理等作了比较深入的交流及探讨。会议主要是身在北京的成员参加&#xff0c;并邀…

.glusterfs_如何在Ubuntu 18.04上使用GlusterFS创建冗余存储池

.glusterfsAn earlier version of this tutorial was written by Justin Ellingwood. 本教程的早期版本由Justin Ellingwood编写。 介绍 (Introduction) When storing any critical data, having a single point of failure is very risky. While many databases and other so…

前端调试devtools_如何使用内置调试器和Chrome DevTools调试Node.js

前端调试devtoolsThe author selected the COVID-19 Relief Fund to receive a donation as part of the Write for DOnations program. 作者选择了COVID-19救济基金来接受捐赠&#xff0c;这是Write for DOnations计划的一部分。 介绍 (Introduction) In Node.js development…

centos ssl证书_如何在CentOS 8上为Apache创建自签名SSL证书

centos ssl证书介绍 (Introduction) TLS, or “transport layer security” — and its predecessor SSL — are protocols used to wrap normal traffic in a protected, encrypted wrapper. Using this technology, servers can safely send information to their clients wi…

5月26日北京开源沙龙活动通知

为了加强对前沿技术的学习及交流&#xff0c;EasyJF团队将于5月26日下午在北京举办第一次开源沙龙活动&#xff0c;本次活动主题为“JPASpring2.0EasyJWeb技术构架在企业级系统中的应用”&#xff0c;凡是EasyJF的正式及考察成员均可报名参加。由于本次活动场地人数限制&#x…

使用JPA+Spring2.0+EasyJWeb开发企业级应用

作为EJB3.0的一部分&#xff0c;JPA是一个好东西。其简单的配置方式及强大的默认配置支持&#xff0c;使其可以轻松自由的存在于轻量与重量之间&#xff0c;如果现在您的JavaEE项目&#xff0c;不管是选择轻量级构架还是重量级构架&#xff0c;持久层使用JPA应当是企业级应用系…