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 文件

getPlans当您调用操作时调用您的方法的原因plan是方法名称以 开头get。由于您没有为 JSON 结果指定任何自定义序列化和反序列化,因此以 开头的所有内容都get将被序列化,这意味着在生成响应getPlans方法时将因序列化而被调用。
您可以更改操作方法名称来解决此问题,另请参阅此JSON 插件文档来控制响应中发送的 json 对象。如果您不控制响应中的 json 对象,可能会导致无意的数据泄露,从而导致安全风险和 .
更新:根据文件
序列化过程是递归的,这意味着从操作类(不包括基类)开始的整个对象图将被序列化(可以使用“root”属性自定义根对象)
这意味着操作中的每件事都将被序列化(因此这意味着将调用带有前缀的每个方法),这是通过深入对象(不包括基类)的递归来完成的。get
| 归档时间: |
|
| 查看次数: |
865 次 |
| 最近记录: |