【问题标题】:How to change ActionForward with dynamic params in Struts 2如何在 Struts 2 中使用动态参数更改 ActionForward
【发布时间】:2013-07-24 04:31:49
【问题描述】:

将应用程序从 Struts 1 迁移到 Struts 2 时

在某些地方,根据请求参数,相同的操作类已用于不同类型的视图。

例如:如果createType 为1 表示需要附加一个参数,或者createType 为2 表示需要附加一些额外的参数,例如我需要使用@ 将动态参数传递给其他操作987654323@.

struts-config.xml:

<action path="/CommonAction" type="com.example.CommonAction" scope="request">
    <forward name="viewAction" path = "/ViewAction.do"/>
</action>

动作类:

public class CreateAction extends Action
{
    public ActionForward execute(ActionMapping m, ActionForm f, HttpServletRequest req, HttpServletResponse res) throws ServletException, Exception
    {
            String actionPath = m.findForward("viewAction").getPath();
            String createType = req.getParameter("createType");
            String params = "&action=view";
            if("1".equals(createType)){
               params = params + "&from=list";
            }else if("2".equals(createType)){
               params = params + "&from=detail&someParam=someValue";
            }//,etc..
            String actionUrl = actionPath+"?"+params;
            return new ActionForward(actionUrl);
    }
}

但是,我不能在 Struts 2 中做同样的事情。是否有可能在 Struts 2 中使用动态参数更改 ActionForward

【问题讨论】:

    标签: java struts2 migration struts actionresult


    【解决方案1】:

    您可以使用带有result 的动态参数,请参阅dynamic result configuration

    在动作中你应该为参数写一个getter

    private String actionUrl;
    
    public String getActionUrl() {
        return actionUrl;
    }
    

    并配置结果

    <action name="create" class="CreateAction">
        <result type="redirect">${actionUrl}</result>
    </action>
    

    所以,常识是像这样重写代码

    public class CreateAction extends ActionSupport
    {
    
        private String actionUrl;
    
        public String getActionUrl() {
            return actionUrl;
        }
    
        @Override
        public String execute() throws Exception
        {
                String actionPath = "/view";
                String createType = req.getParameter("createType");
                String params = "&action=view";
                if("1".equals(createType)){
                   params = params + "&from=list";
                }else if("2".equals(createType)){
                   params = params + "&from=detail&someParam=someValue";
                }//,etc..
                actionUrl = actionPath+"?"+params;
                return SUCCESS;
        }
    }
    

    如果您需要更好的方法从操作映射创建 url,您可以查看this 答案。

    【讨论】:

    • 在 Struts 1 中,除非我们将重定向参数设为 true [ new ActionForward(path,redirect) ],否则它不会重定向。但是在 Struts 2 中,正如您所建议的,它总是重定向为一个新的动作。如何在 Struts 2 中避免这种情况?
    • 重定向是一个正常的处理动作。确定要转发到操作吗?
    • 一个新的Action对象总是根据请求创建,你想避免它吗?
    • 我不想从浏览器获得新的请求,我只是想要内部操作。
    • 那么你应该配置struts过滤器来接受来自dispatcher的转发请求。
    猜你喜欢
    • 2017-01-14
    • 2016-07-12
    • 1970-01-01
    • 2012-11-09
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多