Сохранение всех параметров запроса посредством перенаправления на действие
Мне нужно заполнить записи с обновленным сообщением (успех / неудача) после обновления записей на странице. оба действия с одной страницы. Я добавил код как, После завершения действия Обновить добавил тип результата как Цепочка, и он показывает сообщение об успехе. Но оно не исчезает, когда мы нажимаем на Поиск сразу (в первый раз) после завершения действия обновления. Помогите мне убрать сообщение, нажимая на действие поиска.
Из-за вышеупомянутой проблемы я использовал опцию перенаправления в типе результата. Но я мог бы получить параметры запроса в перенаправленном действии. Есть ли способ получить все параметры запроса в перенаправленном действии, кроме жесткого его кодирования?
<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?
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).
По сути, вам нужно указать только пространство имен и имя действия (и они также могут быть динамическими, TBH) в конфигурации Struts и динамический параметр, представляющий QueryString.
Затем в первом действии (или в BaseAction) вам нужен метод для получения карты параметров, просмотра каждого параметра (и каждого из его значений), кодирования URLEncode и возврата смонтированного QueryString. Вот и все.
Это будет работать с данными формы (POST), параметрами запроса (обычно GET) или обоими (POST с данными формы и QueryString), и это безопасно для URL.
Struts config
<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>
наслаждаться