一个关于Struts Action的小框架, 请高手指点一下

         
warbaby
05-03-30 14 670

首先是一个基类BaseAction
=================================================================
public class BaseAction extends ActionSupport {
/** 简单的得到spring bean的方法*/
public Object getBean(String beanName) {
return this.getWebApplicationContext().getBean(beanName);
}

/** 由子类Action对象调用, 可以在初始化时反射自身的结构, 形成一个映射, 用来日后dispatchSubaction.
*
* @return 存放了methods对象的Map
*/
protected Map getMethodMap() {
......
}

/** 将Action转移给子动作.
* 在子类中调用时,只需要新建一个Object[] {参数1, 参数2, ...} 一般为 {form, request, dao}
* 然后调用dispatchSubAction(String, objects) 即可
*
* @param action 字符串,决定子动作的方法名
* @param objs 参数对象列表
* @param methods 由getMethodMap得到的Map
* @return 用来findForward的别名
*/
protected String dispatchSubAction(String action, Object[] objs, Map methods) throws Exception {
......
}

之后是子类的写法:
================================================================
public class SomeAction extends BaseAction {
protected Map methods = getMethodMap(); //各线程公用
//--------- 下面是此Action中公用的一些对象,线程安全?
XxxDAO xxxDao=(XxxDAO) getBean("xxxDao");
XxxService xxxService = (XxxService) getBean("xxxService");

public ActionForward execute(......) throws Exception {
// ===================== 初始化环境 ===================== \\
XxxForm form = (XxxForm) actionForm;
ActionErrors errors = new ActionErrors();

// ==================== 获取用户参数 ==================== \\
//主要是进行数据转换如:form.setXxx() = form.getXxx().split("..");

// ==================== 调用业务逻辑 ==================== \\
Object[] params = {form, request, errors};
//这里的params要和下面定义的所有子程序的参数对应起来
String forward = dispatchSubAction(form.getSubaction(), params, methods);

// ==================== 设置回传参数 ==================== \\
saveErrors(request,errors);
return mapping.findForward(forward);
}

//所有的子程序的参数声明都应该相同, 但是每个Action可以根据自己的情况有所区别
public String show(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) {
......
return "show";
}

public String edit(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) {
......
return "edit";
}

public String save(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) {
......
return "show";
}
}
================================================================
归纳:我知道struts有lookupDispatchAction,1.2还有MappedAction,但是那些东西使用起来都不太方便。
1. 有的需要在MessageResources里面进行Submit按钮文字定义。
2. 有的需要在config中有特殊的配置
3. 必须使用和execute完全相同的冗长的函数声明
4. 各方法之间没有交集,难以实现统一的log处理,代码重复写的太多,例如一个简单的XxxForm form = (XxxForm) actionForm; 就必须写在所有的子方法中。

不知道我这样做能不能较好的解决上面的问题?虽然会带来一些初始化的负担,但是实际运行时应该不会怎么影响效率。我主要关心的是,这个结构还可不可以优化?另外有没有什么安全/效率方面的硬伤?望高手们多多指点!

SportsBaby1980
2005-04-05 23:50

没看明白

是自己写的mvc实现?

还是在struts上作的一些方便开发的功能?

banq
2005-04-06 11:39

一个建议:
将 Object[] params = {form, request, errors};
包装成对象,其实这是DTO对象,可参考Jdon框架中的EventModel。

一个疑问:
show、edit等重要方法是如何激活的? 这里是性能的关键点。

如果使用struts的dispatchAction,它根据参数parameter的值来直接映射的,比较方便。

在Jdon框架中,BaseAction(SomeAction ) 相当于ModelHandler,但是这部分代码在通常情况下可自动生成,通过配置完成。

zyhalj
2005-04-09 23:03

为了确保线程安全在一个应用的生命周期中,struts框架只会为每个action类创建一个action实例,所有的用户共请求共享同一个action实例,并且所有的请求线程可以同时执行action实例的execute()方法。所以你的小框架中的xxxDao 变量是实例变量,肯定是线程不安全的。采用同步方法也是不能解决线程安全的问题的。同样还是会出现“脏读”现象。

banq说的对,你为什么不用dispatchAction呢,config配置并不复杂呀。这点灵活性

zyhalj
2005-04-11 14:47

ThreadLocal 是解决多线程内部数据的,你可以在网上看看相关例子

3Go 1 2 3 下一页