我没有收到来自服务器的JSON类型数据作为响应。

我正在使用JSON插件。

jQuery( "#dialog-form" ).dialog({ 
    autoOpen: false,
    height: 500,
    width: 750,
    modal: true,
    buttons :{
        "Search" : function(){
            jQuery.ajax({type : 'POST',
            dataType : 'json',
             url : '<s:url action="part" method="finder" />',
         success : handledata})
        }
    }
});
var handledata = function(data)
{
    alert(data);
}


如果dataType = 'json'我没有收到任何答复,但是如果我没有提及任何dataType ,我正在获取页面的HTML格式。

public String list(){
    JSONObject jo = new JSONObject();
    try {
        Iterator it = findList.iterator();
        while(it.hasNext()){
             SearchResult part = (SearchResult) it.next();
             jo.put("col1",part.getcol1());
             jo.put("col2",part.getcol2());
        }
        log.debug("--------->:"+jo.toString());
    } catch (Exception e) {
        log.error(e);
    }
    return jo.toString();
}


struts.xml:

<package name="default" namespace="/ajax" extends="json-default">
  <action name="finder" 
       class="action.Part" method="finder" name="finder">
       <result type="json" />
  </action>
</package>


JSP页面:

<div id="dialog-form" >
    <form action="" id="channelfinder">
        <textarea id="products" name="prodnbr"<s:property value='prodNbr'/>   
    </form>
</div>


控制台错误:


org.apache.struts2.dispatcher.Dispatcher-无法找到动作或result
没有为操作action定义任何结果。部分
和结果{“ col1”:“ col1”,“ col2”:“ col2”}


web.xml

    <?xml version="1.0" encoding="ISO-8859-1"?>
     <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      <display-name>/parts</display-name>
      <description>Parts List Web App</description>

    <filter>
          <filter-name>struts-cleanup</filter-name>
          <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
        </filter>

        <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
        </filter>

       <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>actionPackages</param-name>
            <param-value>com.action</param-value>
        </init-param>
    </filter>


    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/errorPage.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/errorPage.jsp</location>
    </error-page>

  <!-- Spring -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  </web-app>


我没有获取到成功的jQuery数据。
请更正我,这里出了什么问题?

评论

请立即调查。

更新了问题。仍然无法使用...

您不应该返回json字符串,要么返回void要么返回SUCCESS。当您返回json字符串时,您会听到控制台错误

请注意,您的textarea是自动关闭的,然后再次关闭:)

尝试使用GET而不是POST

#1 楼

jQuery Ajax使用dataType : 'json'来指定预期在执行操作和结果时从success回调函数返回的数据类型,以及从服务器返回的响应。 Intelligent Guess(dataTypexmljsonscript))
类型:html
您期望从服务器返回的数据类型。如果未指定,则jQuery将尝试根据响应的MIME类型来推断它(XML MIME类型将产生XML,在1.4中,JSON将产生JavaScript对象,在1.4脚本中,脚本将执行该脚本,而其他任何内容将是返回为字符串)。

URL应该正确指向操作映射。假设它将在默认名称空间中,否则您应该修改URL和映射以添加String属性。
 namespace  

返回<script type="text/javascript"> $(function() { $("#dialog-form").dialog ({ autoOpen: true, height: 500, width: 750, modal: true, buttons : { "Search" : function() { $.ajax({ url : '<s:url action="part" />', success : function(data) { //var obj = $.parseJSON(data); var obj = data; alert(JSON.stringify(obj)); } }); } } }); }); </script> 如果您手动构建json,则不需要结果类型。您可以返回文本作为流结果,然后根据需要将字符串转换为JSON。
JSONObject
 struts.xml 

操作:
 <package name="default" extends="struts-default">
  <action name="part" class="action.PartAction" method="finder">    
    <result type="stream">
      <param name="contentType">text/html</param>
      <param name="inputName">stream</param>
    </result>
  </action>
</package>
 

我将结果类型和内容类型放入了不同的结果,以更好地描述这个想法。您可以返回这些结果中的任何一个,并返回带或不带字符串的JSON对象。字符串化版本需要解析返回的数据以获得JSON对象。您还可以选择哪种序列类型更好地进行序列化以满足您的需要,但我的目标是表明,如果需要序列化简单对象,则不需要json插件来使其工作。
参考文献:


如何返回文本字符串作为响应

如何将public class PartAction extends ActionSupport { public class SearchResult { private String col1; private String col2; public String getCol1() { return col1; } public void setCol1(String col1) { this.col1 = col1; } public String getCol2() { return col2; } public void setCol2(String col2) { this.col2 = col2; } public SearchResult(String col1, String col2) { this.col1 = col1; this.col2 = col2; } } private InputStream stream; //getter here public InputStream getStream() { return stream; } private List<SearchResult> findList = new ArrayList<>(); public List<SearchResult> getFindList() { return findList; } public void setFindList(List<SearchResult> findList) { this.findList = findList; } private String list() { JSONObject jo = new JSONObject(); try { for (SearchResult part : findList) { jo.put("col1", part.getCol1()); jo.put("col2", part.getCol2()); } System.out.println("--------->:"+jo.toString()); } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); } return jo.toString(); } @Action(value="part", results = { @Result(name="stream", type="stream", params = {"contentType", "text/html", "inputName", "stream"}), @Result(name="stream2", type="stream", params = {"contentType", "application/json", "inputName", "stream"}), @Result(name="json", type="json", params={"root", "findList"}) }) public String finder() { findList.add(new SearchResult("val1", "val2")); stream = new ByteArrayInputStream(list().getBytes()); return "stream2"; } } 转换为字符串


评论


那么,将jsonarray转换为纯文本吗?如果从jsonarray转换为jsonobject,将工作吗?

–user2444474
2013年6月13日20:44



您是否已在操作中获取json字符串?然后,您可以将其作为成功功能的数据。

–罗马C
13年6月13日在20:47

public String list(){JSONObject jo = new JSONObject();弦乐部分;部分= build(); jo.put(“ array”,jo); return jo.toString();}-仍然无法正常工作。

–user2444474
2013年6月13日21:10



您没有建立有效的乔。试试这个myString = new JSONObject()。put(“ JSON”,“ Hello,World!”)。toString();

–罗马C
2013年6月13日在21:13



非常感谢您的努力。无论来自动作类的任何数据,我都需要使用datatable来显示。这就是我试图通过ajax将其放入数组或JSON数据的原因,但是这些文本格式数据也可以用于datatable吗?

–user2444474
2013年6月17日下午4:35

#2 楼

关于Struts2-JSON插件
Struts2 JSON插件以特定的方式工作:

JSON插件提供了一个“ json”结果类型,该结果类型将操作序列化为JSON。它将整个Action序列化为JSON,但

临时属性
属性(不带Getter)

如果您不希望整个Action序列化,而只是您可以选择一个对象,然后指定一个根对象:

使用“ root”属性(OGNL表达式)指定要序列化的根对象。

它可以可以在struts.xml中完成,例如:
 <result type="json">
    <param name="root">
        objectToBeSerialized
    </param>
</result>
 

,而动作应具有:
private CustomObject objectToBeSerialized;

public CustomObject getObjectToBeSerialized(){
    return this.objectToBeSerialized;
}

其中的CustomObject可以是基本体,字符串,数组等...
以这种方式(为其构建方式)使用,您可以像在其他任何AJAX Struts2 Action中一样返回SUCCESSERROR,而无需破坏框架约定,并从回调访问序列化的JSON对象像任何其他字段一样,AJAX jQuery调用的功能(如果使用rootObject,则var handledata = function(data)的“数据”将是您的对象,否则将是您的Action)。

关于您的特定情况
在您的情况下,假设您的对象结构看起来像这样
row1 [col1, col2], 
row2 [col1, col2], 
rowN [col1, col2]

,则可以创建具有两列的对象的列表:
Value Object
public class MyRow implements Serializable {
    private static final long serialVersionUID = 1L;

    private String col1; 
    private String col2;

    // Getters
    public String getCol1(){ 
        return this.col1; 
    }
    public String getCol2(){ 
        return this.col2; 
    }
}

动作类
public class PartAction implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private List<MyRow> rows;   

    // Getter
    public  List<MyRow> getRows() { 
        return this.rows; 
    } 

    public String finder() {
        String result = Action.SUCCESS;
        rows = new ArrayList<MyRow>();

        try {
            Iterator it = findList.iterator();
            while(it.hasNext()) {
                SearchResult part = (SearchResult) it.next();
                MyRow row = new MyRow();
                row.setCol1(part.getcol1());
                row.setCol2(part.getcol2());
                rows.add(row);
            }
        } catch (Exception e) {
            result = Action.ERROR;
            log.error(e);
        }
        return result;
    }  
} 

Struts.xml
 <package name="default" namespace="/ajax" extends="json-default">
    <action name="finder" class="action.Part" method="finder" name="finder">
        <result type="json" >
            <param name="root">
                rows
            </param>
        </result>
  </action>
</package>
 

要在AJAX回调函数中对其进行测试,只需使用$.each
 var handledata = function(data) {
    $.each(data, function(index) {
        alert(data[index].col1);
        alert(data[index].col2);
    });     
}
 

当然,您可以使用List<List<String>>代替“自定义”对象或您更喜欢的其他任何对象结构:只是让你知道。