你不能用 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>
享受