与struts2.X无关的struts动作调用

时间:2014-06-24 02:26:30

标签: java ajax json struts2

使用struts 2.x处理其中一个大型Web应用程序(目前使用struts-core 2.3.4.1)

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

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

请找到以下代码

Struts Action Class

 package lpaction;

public class PlanAction {

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

    public String getPlans() {
        return "PLAN1_ACTION_SUCCESS";
    }
}

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>

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>

Web.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>

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

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

我正在使用以下JAR文件 enter image description here

1 个答案:

答案 0 :(得分:4)

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

您可以更改操作方法名称以解决此问题,也可以参考此 JSON Plugin Documentation 来控制响应中发送的json对象。如果你没有控制json对象的响应,它可能导致无意的数据暴露,实习生会带来安全风险。

更新:根据文件

  

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

这意味着行动中的所有内容都会被序列化(这意味着将调用前缀为 getPlans 每个方法 ) ,这是通过递归进行的,该递归深入除了基类之外的对象。