> 设为首页 加入收藏 关于我们
 
 
首页 新闻 技术 教程 框架 源码 服务中心  
 
 
  合作 MyRSS 博客 wiki 社区
 
信息搜索: 全部网站 easyjf.com
  当前位置:首页-EasyJWeb
用尽量少的代码,做尽量多的事情
作者:大峡 来源:  发布时间:2007-08-13
杏仁黄 秋叶褐 胭脂红 芥末绿 天蓝 雪青 灰 银河白(默认色)
 

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

下一篇[挑战MVC极限]零配置及惯例代替配置 
 

评论】 【加入收藏】 【推荐给朋友】 【字体:  】 【关闭 
 
团队常用资源链接
《EasyJF办公室及联系方式》
《如何参与EasyJF开源工作》
EasyJF协同及版本控制-SVN
《EasyJF团队章程》
《EasyJF团队成员工作手册》
《EasyJF成员名单》
《EasyJF项目列表》
《EasyJF开源基金赞助名单》
 
 
EasyJWeb
EasyJWeb是基于
java技术,应用于
WEB应用程序快速
开发的MVC框架,
框架设计构思来源于国内众多项
目实践,框架旨在借鉴当前主要
流行的开源Web框架(Struts、
JSF、Tapestry 、Webwork),吸
取其优点及精华,利用
Velocity作为模板页面引擎,实
现页面及代码完全分离的MVC开发
取框架。
EasyJF开源CMS
EasyJF开源CMS
有常用CMS系统的
基本功能,另外还
有自动html文件生
成、AJAX级联菜单、积分系统、
权限管理等功能,支持UBB。该论
坛系统使用基于OO的方法设计,
采用多层B/S构架,数据库持久层
使用Hibernate,Web层使用
Struts框架,java代码与页面
完全分离,易扩展。
EasyJF开源博客系统
EasyJF开源博客系
统基本的博客的书
写、博客圈、流量
统计、排名、个人
像册、音乐、专题等功能。支持
自定义模板、静态html文件生成
、服务器集群、权限系统、积分
系统等。系统使用基于OO的方法
设计,采用多层B/S构架,数据库
持久层使用EasyDBO,Web层使用
EasyJWeb框架,java代码与页面
完全分离,易扩展。
EasyDBO
EasyDBO是一个非
常适合中小型软件
数据库开发的数据
持久层框架,系统
参考hibernate、JDO等,结合中
小项目软件的开发实际,实现简
单的对象-关系数据库映射。

友情连接
LUPA开源论坛 Java研究组织(JR)  与JAVA共舞  java视野   Java开源大全   BlogJava      Jdon解道 SpringSide   天乙论坛   CowNew开源团队  AgileJava开源   javathinker   CSDN Java频道  赛迪网Java频道 中国Eclipse社区   Java家   Java中文站 FireFox中锁文网   java天下   ideagrace   解惑

Copyright (C) 2005 EasyJF.com, All Rights Reserved
版权所有 简易java框架网

渝ICP备06004507号 如有意见请与我们联系 Powered by EasyJFramework