В моем веб-приложении после проверки формы выполните запрос Ajax к моему действию Struts:
$.ajax({
url: "viewResult",
type:"POST",
data: "TEST",
contentType: "application/json; charset=utf-8",
success: function(res, textStatus, jqXHR) {
.....
Запрос Ajax успешно выполнен, а мой метод выполнения в действии, поэтому я ожидаю, что меня перенаправят на указанную страницу, но этого не происходит. Ниже моего struts.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name = "struts.enable.DynamicMethodInvocation" value = "true" />
<constant name = "struts.devMode" value = "true" />
<constant name = "struts.custom.i18n.resources" value = "package" />
<constant name = "struts.custom.i18n.resources" value = "label" />
<constant name = "struts.action.extension" value = "," />
<constant name = "struts.url.escapeAmp" value = "false" />
<constant name = "struts.multipart.maxSize" value = "50000000" />
<package name = "generic" extends = "struts-default,json-default,tiles-default" namespace = "/">
<result-types>
<result-type name = "json" class = "org.apache.struts2.json.JSONResult" />
<result-type name = "tiles" class = "org.apache.struts2.views.tiles.TilesResult" />
<result-type name = "redirect" class = "org.apache.struts2.result.ServletDispatcherResult" />
</result-types>
<interceptors>
<interceptor name = "exception" class = "com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor" />
<interceptor name = "modelDriven" class = "com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor" />
<interceptor name = "annotationWorkflow" class = "com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>
<interceptor name = "httpHeaderInterceptor" class = "comparatorProject.interceptor.HttpHeaderInterceptor"/>
<interceptor-stack name = "defaultInterceptor">
<interceptor-ref name = "defaultStack" />
<interceptor-ref name = "annotationWorkflow"/>
<interceptor-ref name = "httpHeaderInterceptor"/>
<interceptor-ref name = "exception" />
<interceptor-ref name = "json">
<param name = "enableSMD">true</param>
</interceptor-ref>
</interceptor-stack>
<interceptor-stack name = "defaultInterceptorExecuteAndWait">
<interceptor-ref name = "defaultInterceptor" />
<interceptor-ref name = "execAndWait">
<!-- override delay and delaySleepInterval parameters of execAndWait to 500ms -->
<param name = "delay">500</param>
<param name = "delaySleepInterval">500</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name = "defaultInterceptor" />
</package>
<package name = "default" extends = "struts-default,json-default,tiles-default" namespace = "/">
<action name = "welcome" class = "comparatorProject.navigator.actions.WelcomeAction" method = "execute">
<result name = "success">jsp/welcome.jsp</result>
</action>
</package>
<package name = "comparatorProject" extends = "struts-default" namespace = "/">
<action name = "searchPage">
<result name = "success">jsp/searchPage.jsp</result>
</action>
<action name = "viewResult" class = "comparatorProject.navigator.actions.ViewResultAction" method = "execute" >
<result name = "success" >jsp/viewResult.jsp</result>
</action>
</package>
</struts>
ViewResultAction .java
package comparatorProject.navigator.actions;
import com.opensymphony.xwork2.ActionSupport;
public class ViewResultAction extends ActionSupport{
private static final long serialVersionUID = 1L;
// private String url;
public String execute() {
// url = "/viewResult" ;
return SUCCESS;
}
// public String getUrl() {
//
// return url;
//
// }
}
и мой файл web.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<web-app id = "WebApp_ID" version = "2.4"
xmlns = "http://java.sun.com/xml/ns/j2ee"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Comparator Project</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- Restricts access to pure JSP files - access available only via Struts action -->
<security-constraint>
<display-name>No direct JSP access</display-name>
<web-resource-collection>
<web-resource-name>No-JSP</web-resource-name>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>no-users</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<description>Don't assign users to this role</description>
<role-name>no-users</role-name>
</security-role>
</web-app>
Я уже пытался использовать:
<action name = "viewResult" class = "comparatorProject.navigator.actions.ViewResultAction" method = "execute" > <result name = "success type = "redirect" >${url}</result> </action>
и
<action name = "viewResult" class = "comparatorProject.navigator.actions.ViewResultAction" method = "execute" >
<result name = "success" type = "dispatcher">
<param name = "location">jsp/viewResult.jsp</param>
</result>
</action>
@aled Вопрос отредактирован, спасибо.
Ajax-запросы никогда не перенаправляются на какую-либо страницу.
@RomanC Думаю, вы имеете в виду что-то вроде этого: window.location.href = '/viewResult';
Нет, я имел в виду, что ответ не перенаправит вас на jsp/viewResult.jsp.
@RomanC ок, и как мне это сделать? Заранее спасибо!




Ajax-запрос успешно выполнен, как и мой метод
executeв действии, поэтому я ожидал, что меня перенаправят на указанную страницу, но этого не происходит.
Потому что запросы Ajax ведут себя иначе, чем обычные http-запросы. Когда запрос выполняется, он не меняет текущее местоположение в браузере. И ответ возвращается в функцию обратного вызова, поэтому его можно обработать там.
success: function(res, textStatus, jqXHR) {
$("div1").html(res);
}
Текст ответа представляет собой xhtml, отображаемый результатом Struts dispatcherjsp/viewResult.jsp. Вы можете поместить этот результат в целевой элемент <div> на той же странице.
<div id = "div1">Div 1</div>
Также обратите внимание, что существует плагин struts2-jquery-plugin, который делает то же самое, используя теги struts. Более подробную информацию см. JQuery Ajax не работает в JSP со Struts.
Привет, Роман, спасибо за ответ, но у меня это не работает. Я получаю ожидаемый результат, если использую window.location.href = "myAction" . Можете ли вы сказать мне, может ли теоретически это быть правильным решением?
Это не правильное решение. Если вам нужно перенаправить браузер в новое место, вам не следует использовать ajax-запрос, и результат перенаправления типа вернет вас в нужное место. Ajax используется браузером для выполнения любых дополнительных задач, таких как загрузка изображений, но он никогда не должен нарушать рабочий процесс. И с помощью window.location.href вы это сделали. Вместо этого вы можете использовать тег ancor, если вам это нужно.
Для гуглеров, которым приходится делать то же самое, Ajax jquery не подходит, это мое решение: в вашем JSP-файле
'<form action='"'yourAction'"' метод='"'post'"' name='"formname"' novalidate>
<button type='"submit" value="submit"' class=""btn btn-primary"'>Cerca''
в вашем js-файле создайте список событий для события отправки следующим образом:
document.addEventListener('submit', yourFunction, false);
и в вашей функции добавьте
document.forms["formname"].submit(); //this send form to struts
если ваша форма проверки или любые другие условия удовлетворены
Не добавляйте подробности в комментариях. отредактируйте свой вопрос.