Действие Struts, выполняемое методом jQuery ajax()

В моем веб-приложении после проверки формы выполните запрос 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 31.05.2024 14:15

@aled Вопрос отредактирован, спасибо.

gre_c 31.05.2024 14:31

Ajax-запросы никогда не перенаправляются на какую-либо страницу.

Roman C 31.05.2024 14:47

@RomanC Думаю, вы имеете в виду что-то вроде этого: window.location.href = '/viewResult';

gre_c 31.05.2024 17:19

Нет, я имел в виду, что ответ не перенаправит вас на jsp/viewResult.jsp.

Roman C 31.05.2024 17:25

@RomanC ок, и как мне это сделать? Заранее спасибо!

gre_c 31.05.2024 17:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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" . Можете ли вы сказать мне, может ли теоретически это быть правильным решением?

gre_c 03.06.2024 10:07

Это не правильное решение. Если вам нужно перенаправить браузер в новое место, вам не следует использовать ajax-запрос, и результат перенаправления типа вернет вас в нужное место. Ajax используется браузером для выполнения любых дополнительных задач, таких как загрузка изображений, но он никогда не должен нарушать рабочий процесс. И с помощью window.location.href вы это сделали. Вместо этого вы можете использовать тег ancor, если вам это нужно.

Roman C 03.06.2024 11:04
Ответ принят как подходящий

Для гуглеров, которым приходится делать то же самое, 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

если ваша форма проверки или любые другие условия удовлетворены

Другие вопросы по теме