使用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文件
答案 0 :(得分:4)
调用getPlans
操作时调用plan
方法的原因是方法名称以 get
开头。由于您尚未为JSON结果指定任何自定义序列化和反序列化,因此以 get
开头的所有内容都将被序列化,这意味着在生成响应时{由于序列化,将调用{1}}方法。
您可以更改操作方法名称以解决此问题,也可以参考此 JSON Plugin Documentation 来控制响应中发送的json对象。如果你没有控制json对象的响应,它可能导致无意的数据暴露,实习生会带来安全风险。
更新:根据文件
序列化过程是递归的,意味着整个对象 图,从动作类开始(不包括基类) 序列化(可以使用“root”属性自定义根对象)
这意味着行动中的所有内容都会被序列化(这意味着将调用前缀为 getPlans
的 每个方法 ) ,这是通过递归进行的,该递归深入除了基类之外的对象。