来自 Struts 2 的 JSON 响应不适用于 AJAX

JSON Response from Struts 2 not working with AJAX

提问人:s.surya Prakash 提问时间:11/6/2022 最后编辑:Roman Cs.surya Prakash 更新时间:10/2/2023 访问量:223

问:

我正在使用 Ajax 从 Struts 2 获得成功响应,但它最终给出了对错误函数的响应,并在 Ajax 中解析 JSON 的解析错误。

下面是我的代码。

操作类 - PropertyTesting.java

import java.io.IOException;
import org.apache.struts2.ServletActionContext;
import org.json.simple.JSONObject;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class PropertyTesting extends ActionSupport 
{
    public String execute() 
    {
        JSONObject obj  = new JSONObject();
        obj.put("Name", "PersonName");
        obj.put("ID", "PersonID");
        try {
            ServletActionContext.getResponse().getWriter().write(obj.toJSONString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return SUCCESS;
    }
}

JSP 页面 - PropertyTesting.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Property Testing</title>
</head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script type="text/javascript">
function invokeAjax()
{
    $.ajax(
    {
        type:"POST",
        url:"PropertyTesting",
        dataType:"json", 
        success: function(responseText)
        {
            console.log(responseText);  
        },
        error: function(errorResponse)
        {
            console.log(errorResponse);
        }
    });
}
    
</script>
</head>
<body>
    <button type="button" onclick="invokeAjax()" >Submit</button>
</body>
</html>

Struts.xml

<struts>
   <constant name="struts.devMode" value="true"/>
   <package name="WebTesting" extends="json-default">
        <action name="PropertyTesting" class="org.testing.PropertyTesting" >
            <result type="json"></result>
        </action>
   </package>
</struts> 

而且,如果我使用 Servlet 做同样的事情,它会给我提供使用 Struts 的确切结果,只会给出此类问题。

java json ajax jsp struts2

评论

0赞 Roman C 11/6/2022
您不需要在操作中访问这样的 servlet 对象。如果要使用 json 插件,则需要指定序列化的属性。这个答案可能会对你有所帮助。
0赞 Roman C 11/6/2022
你给出这种问题只是因为你不了解 Struts,同样的事情是不同的。
0赞 s.surya Prakash 11/6/2022
然后,@RomanC提供一种解决方案,例如如何使用支柱来完成。仅供参考,任何其他解决方案(例如使用响应编写)都将受到赞赏,而不是将其声明为成员并通过 getter 和 setter 访问它。
0赞 Roman C 11/6/2022
解决方案由上面的链接给出。你使用的代码有很多错误,不像开发人员那样的 Struts。如果你不跟着我去消除这些错误,那么你永远不会以正确的方式去做。这个问题将作为题外话关闭,因为它没有足够的细节来诊断问题。
0赞 Dave Newton 11/7/2022
您当前正在直接编写并使用操作结果;选择一个。当发布有错误的问题时,请发布实际错误(请参阅“如何提问”页面)。可能值得退后一步,要么在框架内工作,要么学习如何(以及为什么/何时)不这样做。

答:

1赞 Roman C 11/10/2022 #1

JSONObject当您返回 JSON 结果时,有点问题。默认情况下,它会序列化操作。由于没有要序列化的属性,因此应创建属性。

Struts2 中的操作不是单例的,因此您不必担心创建属性。

public class PropertyTesting extends ActionSupport 
{

    Map obj;

    public Map getJSON(){
       return obj;
    }

    public String execute() 
    {
        obj  = new HashMap();
        obj.put("Name", "PersonName");
        obj.put("ID", "PersonID");
   
        return SUCCESS;
    }
}

评论

0赞 s.surya Prakash 11/10/2022
感谢您的回答,有没有办法像儿子一样在响应编写器中编写它,以便更轻松地编写我想要的 JSONString。ServletActionContext.getResponse().getWriter().write(obj.toJSONString());
1赞 Roman C 11/11/2022
唯一的方法是返回结果 NONE。
0赞 Roman C 11/17/2022
如果这个答案对你有帮助,那么你应该把它标记为接受。该复选框位于答案的左侧。