這是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來實現上面的同樣的功能,你會發現需要的代碼及配置文件字節會多僅一倍多。Struts2是webwork的升級,代碼確實簡化了不少,大家可以用他實現上面的功能,對照一下代碼誰簡潔一比便知。
當然,如果熟悉動態語言中的MVC框架,比如Rails,你會發現,這些框架中要實現同樣的功能,他的代碼不會比EasyJWeb簡潔多少。當然,造飛機、火箭的流程及所需要的技術肯定是比造拖拉機、摩托車要復雜得多,我們做的事情就是盡是簡化。下面我會從多個方面進入介紹。
posted on 2007-08-14 10:05
簡易java框架 閱讀(897)
評論(5) 編輯 收藏