【问题标题】:Preserving all request parameters through a redirect to an Action通过重定向到操作来保留所有请求参数
【发布时间】:2014-10-27 21:40:08
【问题描述】:

更新页面中的记录后,我需要使用更新的消息(成功/失败)填充记录。这两个动作都来自同一页面。我已将代码添加为,完成更新操作后将结果类型添加为链并显示成功消息。但是当我们在更新操作完成后立即(第一次)单击搜索时,它并没有消失。帮助我在单击搜索操作时清除消息。

由于上述问题,我在结果类型中使用了重定向选项。但我可以在重定向操作中获取请求参数。除了硬编码之外,还有什么方法可以在重定向操作中获取所有请求参数?

<interceptor-stack name="storeStack">
    <interceptor-ref name="defaultStack" />
    <interceptor-ref name="store">
        <param name="operationMode">STORE</param>
    </interceptor-ref>
</interceptor-stack>

<interceptor-stack name="retrieveStack">
    <interceptor-ref name="defaultStack" />
    <interceptor-ref name="store">
        <param name="operationMode">RETRIEVE</param>
    </interceptor-ref>
</interceptor-stack>

<action name="hierarchySaveMap" method="updateHierarchyMap"
    class="com.cotyww.bru.web.action.master.HierarchyUpdateAction">
    <interceptor-ref name="storeStack" />
    <result name="success" type="redirectAction">
        <param name="actionName">hierUpdateMDA</param>
        <param name="parse">true</param>
    </result>
    <result name="input" type="tiles">hierarchyUpdate{1}</result>
    <result name="error" type="tiles">hierarchyUpdate{1}</result>
</action>

有没有办法在 struts.xml 中不进行硬编码而将参数动态发送到下一个操作?

【问题讨论】:

    标签: java parameters struts2 request http-redirect


    【解决方案1】:

    你不能用 redirectAction 来做到这一点,其中参数名称和值可以是动态的,但参数的数量必须是硬编码的,比如

    <result name="success" type="redirectAction">
        <param name="actionName">hierUpdateMDA</param>
        <param name="${paramName1}">${paramValue1}</param>
        <param name="${paramName2}">${paramValue2}</param>
        <param name="${paramName3}">${paramValue3}</param>
    

    但您可以使用 redirect 结果来实现(通常用于重定向到非操作 URL)。

    基本上,您只需要在 Struts 配置中指定命名空间和操作名称(它们也可以是动态的,TBH),以及表示 QueryString 的动态参数。

    然后在第一个Action(或BaseAction)中,您需要一个方法来获取Parameter Map,循环遍历每个参数(及其每个值),对它们进行URLEncode并返回已安装的QueryString。而已。

    这将适用于表单数据 (POST)、查询参数(通常是 GET)或两者(带有表单数据 QueryString 的 POST),并且它是 URL 安全的。

    Struts 配置

    <package name="requestGrabber" namespace="cool" extends="struts-default">
        <action name="source" class="org.foo.bar.cool.RequestGrabberAction" 
              method="source">
            <result type="redirect">                
                <param name="location">/cool/target.action${queryParameters}</param>
            </result>
        </action>
        <action name="target" class="org.foo.bar.cool.RequestGrabberAction" 
              method="target">
            <result name="success">/cool/requestGrabber.jsp</result>
        </action>
    </package>
    

    org.foo.bar.cool.RequestGrabberAction.java(动作类)

    package org.foo.bar.cool;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.Enumeration;
    import org.apache.struts2.interceptor.ServletRequestAware;
    import com.opensymphony.xwork2.ActionSupport;
    
    @SuppressWarnings("serial")
    public class RequestGrabberAction extends ActionSupport 
                                   implements ServletRequestAware {
    
        private HttpServletRequest request; 
        public void setServletRequest(HttpServletRequest request){ 
            this.request = request;
        }
    
        public String source(){
            System.out.println("Source Action executed");
            return SUCCESS;
        }
    
        public String target(){     
            System.out.println("Target Action executed");
            return SUCCESS;
        }
    
    
        public String getQueryParameters() throws UnsupportedEncodingException {
            String queryString = "";
    
            // Get parameters, both POST and GET data
            Enumeration<String> parameterNames = request.getParameterNames();
    
            // Loop through names
            while (parameterNames.hasMoreElements()) {            
                String paramName = parameterNames.nextElement();
                // Loop through each value for a single parameter name
                for (String paramValue : request.getParameterValues(paramName)) {
                    // Add the URLEncoded pair
                    queryString += URLEncoder.encode(paramName, "UTF-8") + "="
                                 + URLEncoder.encode(paramValue,"UTF-8") + "&";
                } 
            }
    
            // If not empty, prepend "?" and remove last "&"
            if (queryString.length()>0){  
                queryString = "?" 
                            + (queryString.substring(0,queryString.length()-1));
            }
    
            return queryString;
        }
    
    }
    

    /cool/requestGrabber.jsp

    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    
    <!doctype html>
    <html>
        <head>
            <title>Request Grabber</title>
        </head>
        <body>
            QueryString = <s:property value="queryParameters" />
            <s:form action="source" namespace="/cool">
                <s:textfield name="foo" value="%{#parameters.foo}" />
                <s:textfield name="bar" value="%{#parameters.bar}" />
                <s:submit />
            </s:form>       
        </body>
    </html>
    

    享受

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 2012-12-02
      • 2013-07-24
      • 2015-08-04
      • 1970-01-01
      • 2012-09-06
      相关资源
      最近更新 更多