随笔 - 115  文章 - 481  trackbacks - 0
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(19)

随笔档案(115)

文章档案(4)

新闻档案(1)

成员连接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  这是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页面模板来显示查询结果。
 }

   

  可以试着用Struts1.x来实现上面的同样的功能,你会发现需要的代码及配置文件字节会多仅一倍多。Struts2webwork的升级,代码确实简化了不少,大家可以用他实现上面的功能,对照一下代码谁简洁一比便知。

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

posted on 2007-08-14 10:05 简易java框架 阅读(893) 评论(5)  编辑  收藏

FeedBack:
# re: 用尽量少的代码,做尽量多的事情  2007-08-14 11:36 
嗯,你以后写的代码全部只有两个字节,那就是0和1。  回复  更多评论
  
# re: 用尽量少的代码,做尽量多的事情  2007-08-14 11:57 爱兼职
首先声明我不喜欢struts。框架的比较不是看需要几行代码,哪个少?而是看哪个更易于理解,程序员需要而且有比较了解框架的实现原理和细节,否则就被忽悠了。  回复  更多评论
  
# re: 用尽量少的代码,做尽量多的事情  2007-08-14 12:44 terrybean
为什么用rails能那么简洁,而用java就要费那么费劲呢?  回复  更多评论
  
# re: 用尽量少的代码,做尽量多的事情  2007-08-14 12:52 pass86
少的代码中蕴含这更多的内容。  回复  更多评论
  
# re: 用尽量少的代码,做尽量多的事情  2008-01-24 15:22 小人物
啥也别说了, 纯属一个SB而已.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: