web-dev-qa-db-ja.com

JSON値を返す問題

サーバーから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-アクションまたは結果が見つかりませんでしたアクションアクションの結果が定義されていません。パーツと結果{"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を成功させるためのデータが得られません。私を訂正してください、ここで何が問題なのですか?

9
user2444474

A dataType : 'json'jQuery Ajax によって使用され、アクションと結果が実行されたときにsuccessコールバック関数によって返されると予想されるデータ型、およびサーバーから返される応答を指定します。

dataType(デフォルト:インテリジェント推測(xmljsonscript、またはhtml))

タイプ:String

サーバーから返されると予想されるデータのタイプ。何も指定されていない場合、jQueryは応答のMIMEタイプに基づいてそれを推測しようとします(XML MIMEタイプはXMLを生成し、1.4ではJSONはJavaScriptオブジェクトを生成し、1.4ではスクリプトはスクリプトを実行します。文字列として返されます)。

URLは、アクションマッピングを正しく指している必要があります。デフォルトの名前空間にあると想定します。そうでない場合は、URLとマッピングを変更してnamespaceattributeを追加する必要があります。

<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を手動で作成する場合は、JSONObject結果タイプを返す必要はありません。テキストを ストリーム結果 として返し、必要に応じて文字列をJSONに変換できます。

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>

アクション:

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";
  }
}

アイデアをよりわかりやすく説明するために、結果タイプとコンテンツタイプで異なる結果を配置しました。これらの結果のいずれかを返し、文字列化されているかどうかに関係なくJSONオブジェクトを返すことができます。文字列化されたバージョンでは、JSONオブジェクトを取得するために返されたデータを解析する必要があります。ニーズに合わせてどの結果タイプをより適切にシリアル化するかを選択することもできますが、私の目標は、単純なオブジェクトをシリアル化する必要がある場合、それを機能させるためにjsonプラグインは必要ないことを示すことでした。

参照:

5
Roman C

Struts2-JSONプラグインについて

Struts2 JSONプラグイン 特定の方法で機能します:

JSONプラグインは、アクションをJSONにシリアル化する「json」結果タイプを提供します。

アクション全体をJSONにシリアル化します。

  • 過渡特性
  • ゲッターのないプロパティ

アクション全体をシリアル化するのではなく、選択したオブジェクトを1つだけシリアル化する場合は、ルートオブジェクトを指定できます。

「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アクション)と同じようにSUCCESSERRORを返すことができます。規則、および他のフィールドと同様にAJAX jQuery呼び出しのコールバック関数からシリアル化されたJSONオブジェクトにアクセスします(rootObjectを使用する場合、var handledata = function(data)の「データ」はオブジェクト、そうでなければそれはあなたのアクションになります)。


あなたの特定のケースについて

あなたの場合、オブジェクト構造が次のようになっていると仮定します

_row1 [col1, col2], 
row2 [col1, col2], 
rowN [col1, col2]
_

2つの列を持つオブジェクトのリストを作成できます。

値オブジェクト

_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>>_を使用することも、これ以上に好きなオブジェクト構造を使用することもできます。それは、アイデアを得るためだけのものでした。

14
Andrea Ligios