与 struts2.X 不相关的 struts 操作调用

Sad*_*and 2 java ajax json struts2

使用 struts 2.x 开发大型 Web 应用程序之一(当前使用 struts-core 2.3.4.1 )

在此应用程序中,当我通过 ajax 调用操作时,从操作返回后,会调用不相关的其他操作。我花了很多天也没有找到解决方案。

后来我想创建一个简单的示例应用程序,它只有两个操作,没有Web服务调用,只有一个jsp,并且只有一个映射的操作(我也尝试在struts.xml中映射其他操作)再次遇到同样的问题

请找到下面的代码

Struts 动作类

 package lpaction;

public class PlanAction {

    public String updatePlan() {
        return "PLAN_ACTION_SUCCESS";
    }

    public String getPlans() {
        return "PLAN1_ACTION_SUCCESS";
    }
}
Run Code Online (Sandbox Code Playgroud)

JSP代码

    <%@page import="org.json.JSONArray"%>
<%@page import="org.json.JSONObject"%>
<%@ page contentType="text/html; charset=utf-8" language="java"
    import="java.sql.*" errorPage=""%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <title>Client</title>
    <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
    <link rel="icon" href="../images/favicon.png" type="image/png" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/Libs/utility.js"></script>
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/Libs/jquery1.10.js"> </script>
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/Libs/ui/jquery-ui.js"></script>
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/Libs/jquery.ba-throttle-debounce.min.js"></script>

    <script>
        function callme(){
            var formdata = "";
            console.log("formData =  "+formdata);
            $.ajax({
                      type: 'POST',      
                      url: 'plan',
                      contentType: "application/x-www-form-urlencoded",
                      async: false,
                      data :formdata, 
                      cache: false,
                      processData:false,
                      datatype: "json",
                      success: function(response) {
                          alert("Success"+response);
                      },
                      error: function(e) { 
                          alert("Fail");
                      }
                });

        }
    </script>
    </head>
    <body>
        <div id="wrap">
            <input type="button" onclick="callme()"> press me </>
        </div>
    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

Struts.xml 文件

     <!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.devMode" value="true" />
    <package name="lessonPlan" extends="json-default">
        <action name="plan" class="lpaction.PlanAction"
            method="updatePlan">
            <result name="PLAN_ACTION_SUCCESS" type="json" />
            <result name="PLAN_ACTION_FAIL" type="json" />
        </action>

        <!-- <action name="plan1" class="lpaction.PlanAction"
            method="getPlans">
            <result name="PLAN1_ACTION_SUCCESS" type="json" />
            <result name="PLAN1_ACTION_FAIL" type="json" />
        </action> -->

    </package>
</struts>
Run Code Online (Sandbox Code Playgroud)

网页.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <filter>
        <filter-name>testClient</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>testClient</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
</web-app>
Run Code Online (Sandbox Code Playgroud)

如果我在两个操作方法中都放置断点,则第一个操作方法将在第二个操作方法调用之后调用。

为什么第二个操作方法被调用?事实上第二个操作根本没有映射(注意我试图取消注释 struts.xml 中的操作映射,仍然是同样的问题)

我正在使用以下 JAR 文件 在此输入图像描述

Yog*_*esh 5

getPlans当您调用操作时调用您的方法的原因plan是方法名称以 开头get。由于您没有为 JSON 结果指定任何自定义序列化和反序列化,因此以 开头的所有内容都get将被序列化,这意味着在生成响应getPlans方法时将因序列化而被调用。

您可以更改操作方法名称来解决此问题,另请参阅此JSON 插件文档来控制响应中发送的 json 对象。如果您不控制响应中的 json 对象,可能会导致无意的数据泄露,从而导致安全风险和 .

更新:根据文件

序列化过程是递归的,这意味着从操作类(不包括基类)开始的整个对象图将被序列化(可以使用“root”属性自定义根对象)

这意味着操作中的每件事都将被序列化(因此这意味着将调用带有前缀的每个方法),这是通过深入对象(不包括基类)的递归来完成的。get