且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

错误:找不到操作或结果 没有为操作操作定义结果.部分和结果{“col1":“col1",“col2":“col2"}

更新时间:2023-02-06 10:04:17

jQuery Ajax 指定执行action和result时success回调函数期望返回的数据类型,以及从服务器.

dataType(默认:智能猜测(xmljsonscripthtml))

类型:String

您期望从服务器返回的数据类型.如果未指定,jQuery 将尝试根据响应的 MIME 类型推断它(XML MIME 类型将产生 XML,在 1.4 中 JSON 将产生一个 JavaScript 对象,在 1.4 脚本中将执行脚本,其他任何类型都将以字符串形式返回).

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

如果您手动构建 JSONObject,则不需要返回 json 结果类型.您可以将文本作为 stream result 返回,然后根据需要将字符串转换为 JSON.

struts.xml:

<结果类型=流"><param name="contentType">text/html</param><param name="inputName">stream</param></结果></动作></包>

行动:

public class PartAction extends ActionSupport {公共类搜索结果{私人字符串 col1;私人字符串 col2;公共字符串 getCol1() {返回 col1;}公共无效setCol1(字符串col1){this.col1 = col1;}公共字符串 getCol2() {返回col2;}公共无效setCol2(字符串col2){this.col2 = col2;}公共搜索结果(字符串 col1,字符串 col2){this.col1 = col1;this.col2 = col2;}}私有 InputStream 流;//这里是getter公共输入流 getStream() {返回流;}私人列表<SearchResult>findList = new ArrayList();公共列表getFindList() {返回 findList;}public void setFindList(List findList) {this.findList = findList;}私人字符串列表(){JSONObject jo = new JSONObject();尝试 {for(搜索结果部分:findList){jo.put(col1", part.getCol1());jo.put(col2", part.getCol2());}System.out.println("--------->:"+jo.toString());} 捕获(异常 e){e.printStackTrace();System.out.println(e.getMessage());}返回 jo.toString();}@Action(值=部分",结果= {@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"})})公共字符串查找器(){findList.add(new SearchResult("val1", "val2"));流 = 新 ByteArrayInputStream(list().getBytes());返回流2";}}

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

参考:

I'm not getting response as JSON type data from server.

I'm using JSON plugin.

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

If dataType = 'json' I am not getting any response, but if I don't mention any dataType, I'm getting the HTML format of the page.

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 page:

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

Console error:

org.apache.struts2.dispatcher.Dispatcher - Could not find action or result No result defined for action action.Part and result {"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>

I'm not getting data to jQuery success. Please correct me, whats wrong here?

A dataType : 'json' is used by jQuery Ajax to specify a data type that is expected to return by the success callback function when the action and result is executed, and a response returned from the server.

dataType (default: Intelligent Guess (xml, json, script, or html))

Type: String

The type of data that you're expecting back from the server. If none is specified, jQuery will try to infer it based on the MIME type of the response (an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string).

The URL should correctly point to the action mapping. Assume it will be in the default namespace, otherwise you should modify URL and mapping to add the namespace attribute.

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

Returning json result type is not needed if you build the JSONObject manually. You can return text as stream result then convert a string to JSON if needed.

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>

Action:

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

I have placed different results with result type and content type to better describe the idea. You could return any of these results and return JSON object either stringified or not. The stringified version requires to parse returned data to get the JSON object. You can also choose which result type better serializes to suit your needs but my goal was to show that if you need to serialize the simple object then json plugin is not necessary to get it working.

References:

相关阅读

技术问答最新文章