论坛首页 Java企业应用论坛

是多个Action好,还是一个Action好?

浏览 24732 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-08-04  
w_weidong 写道
slaser 写道
larlf 写道
Action同ActionForm是一一对应的啊,不同数据类型肯定会用到多个ActionForm的,这个问题你们怎么解决的啊?

这个我也经常碰到,我比较喜欢使用DispatchAction,或者由它扩展出来的自己的子类。
我的表单里面放一个隐藏字段来表示调用哪个method,一般一个action里面有很多的method,比如SAVE,LOAD,DELETE一类的。这些method不光对应于一个ActionForm,有时候会有多个。比如SAVE方法需要EDITForm,但是LIST方法需要SEARCHForm。
这样我的做法是Action类也只写一个,但是在config文件里面写上2个配置,都是一个Action class.但是url不同,ActionForm也不同:


<action path="LISTXXX" type="myAction" name="searchForm">
</action>
<action path="EDITXXX" type="myAction" name="EDITForm">
</action>


不知道有没有办法写到一个Action配置里面。或者更好的解决办法。


对你这种不是很赞同,这样给写配置文件觉得麻烦,而且也会多出很多不必要的form类。
如你所说的这种情况,你完全可以作为一个form,form类中有你原来的俄ditform的字段,再加上一个list对象,就完全可以解决你的问题。建议做法:将你说的editform中的字段放到一个VO对象中,然后把vo放到form中,这样感觉比较清晰,将页面元素的值传导业务层作处理也比较方便。


这样会不会过于冗余啊,我们业务有时一个模块对4个5个甚至更多表进行操作,难道遇到这些情况都放到一起?
0 请登录后投票
   发表时间:2005-08-09  
引用

larlf 写道:
Action同ActionForm是一一对应的啊,不同数据类型肯定会用到多个ActionForm的,这个问题你们怎么解决的啊?

这个我也经常碰到,我比较喜欢使用DispatchAction,或者由它扩展出来的自己的子类。
我的表单里面放一个隐藏字段来表示调用哪个method,一般一个action里面有很多的method,比如SAVE,LOAD,DELETE一类的。这些method不光对应于一个ActionForm,有时候会有多个。比如SAVE方法需要EDITForm,但是LIST方法需要SEARCHForm。
这样我的做法是Action类也只写一个,但是在config文件里面写上2个配置,都是一个Action class.但是url不同,ActionForm也不同:


java代码: 


&lt;action path="LISTXXX" type="myAction" name="searchForm"&gt;
&lt;/action&gt;
&lt;action path="EDITXXX" type="myAction" name="EDITForm"&gt;
&lt;/action&gt;




不知道有没有办法写到一个Action配置里面。或者更好的解决办法。

个人感觉DispatchAction是针对一个action form多种方法所用的,这样在action的配置文件中parameter="method" 这个配置参数才可以用到,起到相应的功能,不知道大家还有什么更好的方法
0 请登录后投票
   发表时间:2005-08-15  
究竟多少个action具体看业务逻辑了,一般添加、删除、详细、列表,都可以做放在一个action中,另建议自己继承DispatchAction,抽象项目中常用功功能写一个BaseAction,以后大家都从baseaction继承,DispathchAction有根据参数自动调用方法的功能

如:.do?method=add   (method要在struts-config.xml里配一下)
则会自动调用由baseaction中add方法.这样比较清析
0 请登录后投票
   发表时间:2005-09-06  
使用一个或者多个action要根据实际情况而定.一个模块一般对应一个action,而模块中的动作可以对应action中的不同method来实现.在该模块对应的不同地方的操作也可以同时使用该action.在不同动作对应不同的method实现时,可以设置隐藏语、javascript、以及按钮属性来实现
0 请登录后投票
   发表时间:2005-11-30  
我们在项目中只使用一个action,这个Action的代码如下:
package net.htjs.hlwsb.web.action;

import net.htjs.hlwsb.web.tools.http.WebContext;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;

/**
* Date: 2005-7-19&lt;br&gt;
* 该类继承于struts的Action。系统可以只存在一个该类的对象。大大减少action的类数量。
* 它利用反射原理,根据URL来决定调用formbean的哪个方法。BeanAction大大简化了struts?
* 编程模式,降低了对struts的依赖。
* &lt;p/&gt;
* 这种新的设计思路,要求FormBean不仅具有属性操作,而且有了业务操作。
* &lt;p/&gt;
* 注意发送请求的两种格式:
* &lt;li&gt;在struts配置文件中使用parameter="methodName"
* &lt;li&gt;使用URL格式 例如: /xxx/methodName.do
* &lt;li&gt;使用URL格式 例如: /xxx/xxx.do?method=methodName
*
* @author &lt;a href="mailto:yanghongjian@htjs.net"&gt;YangHongJian&lt;/a&gt;
* @version 2.0
* @since 1.4.1
*/
public class BeanAction extends Action {
    private Logger log = Logger.getLogger(this.getClass());

    /**
     * @param actionMapping  配置文件的映射实体
     * @param actionForm 容器实体
     * @param httpServletRequest 请求对象
     * @param httpServletResponse 响应对象
     * @return org.apache.struts.action.ActionForward 导航对象
     * @throws java.lang.Exception 运行时受检异常
     */
    public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        String forward = "login";
        try {
            WebContext.initialize(httpServletRequest, httpServletResponse);
            WebContext wec = WebContext.getWebContext();
            HttpSession session = wec.getRequest().getSession();
            String url=wec.getRequest().getRequestURI();
            log.info("client:"+wec.getRequest().getRemoteAddr() + " URL:" + url);           

            if (!url.equals("/logins.do")&&!url.equals("/regedit.do")) {
                log.info("检查登录标识:login");
                if (session.getAttribute("login") == null) {
                    log.info("用户Session失效,重新转到登录界面");
                    session.invalidate();
                    wec.setSimpleMessage("用户Session失效,请重新登录!");
                    return actionMapping.findForward(forward);
                }
            }
            if (actionForm != null) {
                Method method = null;   //方法
                String methodName = actionMapping.getParameter();   //方法名称
                if ((methodName != null) && !("*".equals(methodName))) {
                    log.info("使用属性传递过来的方法名:" + methodName);
                    try {
                        method = actionForm.getClass().getMethod(methodName, null);
                        forward = (String) method.invoke(actionForm, null);
                        log.info("导航到:" + forward);
                    } catch (Exception e) {
                        log.error(e.getMessage());
                    }
                }
                if ((method == null) && !("*".equals(methodName))) {
                    String paramMethod = httpServletRequest.getParameter("method");
                    if (paramMethod != null)
                        methodName = paramMethod;
                    else
                        methodName = actionMapping.getPath();
                    log.info("传递的参数:" + paramMethod);
                    log.info("传递过来的URL:" + methodName);
                    if (methodName.length() &gt; 1) {
                        if (paramMethod == null) {
                            int index = methodName.lastIndexOf("/") + 1;
                            methodName = methodName.substring(index);
                            log.info("使用URL路径方法名:" + methodName);
                        } else
                            log.info("使用URL传递过来的方法名:" + methodName);
                        if (methodName.length() &gt; 0) {
                            try {
                                method = actionForm.getClass().getMethod(methodName, null);
                                forward = (String) method.invoke(actionForm, null);
                                log.info("导航到:" + forward);
                            } catch (Exception e) {
                                log.error(e.getMessage());
                            }
                        }
                    }
                }
                log.info("client:"+wec.getRequest().getRemoteAddr());
            }
        } catch (Exception e) {
            httpServletRequest.setAttribute("Exception", e);
            throw e;
        }
        return actionMapping.findForward(forward);
    }
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics