WebWork

 Author: 李李

概述

WebWork是一个强大的基于Web的MVC框架, 它构建在一个command模式的框架XWork 之上. WebWork真正的力量在于它内在蕴涵的简单和协作的理念. 使用WebWork将有助于最小化代码,并允许开发人员更多的关注业务逻辑(business logic)和建模(modeling), 而不是关注构建基于web的应用程序必需的铅管系统(plumbing).

特性

------ 摘自 Webwork中文文档概述

官方文档
http://wiki.opensymphony.com/display/WW/WebWork

官方文档中文版
http://wiki.javascud.org/display/ww2cndoc/WebWork

其他中文资料
http://webwork.javascud.org/index.php?option=com_remository&Itemid=30&func=select&id=3

 

SpringSide中的Webwork

目前采用Sitemesh作为装饰器,FreeMarker作为页面模板,对图书的CRUD流程进行了演示,其中用到ExtremeTable作为列表显示组件。其中DAO/SERVICE层采用的是开源项目:bba96

设计说明

Webwork 的 ModelDriven 接口说明

ModelDriven Inteceptor 可首先调用 getModel() 方法,从而可以统一做model 的初始化工作,主要服务于统一的CRUD方法,参考 org.springside.modules.webwork.action.SSModelActionSupport,若不采用范型,则每个action均需定义自己的 getModel() 方法

ModelDriven Inteceptor 会把 model 压入 Stack

Sitemesh 说明

采用Sitemesh可以很好的分离内容页面与功能性页面,可让开发者只关注内容页面。

/WEB-INF下放置功能性页面,例如修饰页面,导航页面,Freemarker宏,/ 下放置内容页面,即 Webwork Action 的 result 指定页面,与 Action 的 Namespace 一致,方便查找。

bba96 说明

如果你使用spring+hibernate,而又不喜欢hibernate criteria的麻烦,不妨尝试一下bba96,作为基于Hibernate+Spring的持久层的架构应用,完全可以独立加入到你的项目中,让你可以把主要精力放到业务方面。

com.bba96.tiger.service.DefaultEntityManager 是使用最多的类,提供了很多单层逻辑的便利方法给你使用,其中也包括执行hsql或者sql查询/更新的方法,如果你要多层次逻辑的条件查询可以自己组装QueryObject,参见com.bba96.tiger.util.QueryWebUtils的main函数。

同时bba96还提供给你在view层自由增加查询的能力,使用起来很方便。以下就是SpringSide中 org.springside.modules.webwork.action.SSActionSupport 使用bba96实现方便的view查询的例子:

protected QueryWebParameter search;//定义接受查询参数的对象




public QueryWebParameter getSearch() {
    return search;
}
public void setSearch(QueryWebParameter search) {
    this.search = search;
}

public Page getPaginationResults() {
    //此处可对search处理,进行参数删减以实现灵活的功能或是增强安全
if (search == null) {
        search = new QueryWebParameter();
    }
    if (search.getPageSize() <= 0) {
        search.setPageSize(Constants.DEFAULT_PAGE_SIZE);//设置默认每页记录数
    }
    return getEntityManager().findByWebParameter(getEntityClass(), search);//执行查询返回分页的结果
}

action中就是上面这段话就可对所有的对象实现基本的查询功能。在jsp的要增加对应字段的查询只需遵循以下写法:

对每个需要查询的属性要定义三个变量,search.name, search.operator, search.value
其中search对应上面的QueryWebParameter的变量search
name对应属性名
    若是关联其它对象的非主键属性需用冒号定义别名。
          规则 -- 描述关联对象的属性:别名.该关联对象的属性
          举例 -- groups:g.name,支持多极别名,如groups.g.users:gu.name,这里gu就是g.users的别名
operator对应逻辑操作符,参考com.bba96.tiger.query.QueryParam
value对应值,默认为String类型,可在最后加下划线加类型如_Long或_Date?mm-DD

具体写法参见/webapps/ww/admin/book_list.ftl,关于更多view的逻辑,参见com.bba96.tiger.util.QueryWebUtils

在Spring中的配置也非常简单,如下所示,更新信息参见src/resources/applicationContext-webwork.xml

    <bean id="objectDao" class="com.bba96.tiger.dao.hibernate.HibernateObjectDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>
    <bean id="defaultEntityManager" parent="baseTxService">
        <property name="target">
            <bean class="com.bba96.tiger.service.DefaultEntityManager">
                <property name="objectDAO">
                    <ref local="objectDao"/>
                </property>
            </bean>
        </property>
    </bean>