一个关于Struts Action的小框架, 请高手指点一下
首先是一个基类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; 就必须写在所有的子方法中。
不知道我这样做能不能较好的解决上面的问题?虽然会带来一些初始化的负担,但是实际运行时应该不会怎么影响效率。我主要关心的是,这个结构还可不可以优化?另外有没有什么安全/效率方面的硬伤?望高手们多多指点!