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

WarBaby 2005-03-30 11:02:25

首先是一个基类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; 就必须写在所有的子方法中。

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

(本贴已经发在Jdon,原谅我急于知道答案而重发)
...全文
229 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
WarBaby 2005-04-01
算拉算拉,看了一下struts的代码,这样应该是没什么大问题
回复
WarBaby 2005-03-31
up一下
回复
007remember 2005-03-31
路过
学习ing
帮您顶
回复
hellwindy 2005-03-31
学习
回复
飞行的兔子 2005-03-31
你可以用jndi查询,何必用那样的方法取得bean呢?
这方面可能spring做的好一些,看看spring中讲的IOC!
回复
fashchina 2005-03-31
这个好象是hibernate+struts+spring的一个组合吧


是外国人整合的

不知道,用过,没想过你的问题
回复
jianghuxing 2005-03-31
UP 一下。
回复
WarBaby 2005-03-31
跟spring没什么关系的
另外我写的不太对的,子类不能在成员声明时就初始化对象,即:
XxxDAO xxxDao=(XxxDAO) getBean("xxxDao");
这样是错误的,应该:
XxxDAO xxxDao;

protected void onInit() {
xxxDao=(XxxDAO) getBean("xxxDao");
}

这样才对


100分没人要啊。。。。
回复
jianghuxing 2005-03-31
spring 没有用过,顶一下。
回复
相关推荐
发帖
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
帖子事件
创建了帖子
2005-03-30 11:02
社区公告
暂无公告