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

05-03-30 warbaby
首先是一个基类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 下一页