问题返回JSON值
我没有得到来自服务器的JSONtypes数据的响应。
我正在使用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 – 无法find操作或结果没有为操作action.Part和结果{“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的成功。 请纠正我,这里怎么了?
jQuery Ajax使用dataType : 'json'
来指定执行动作和结果时success
callback函数期望返回的数据types,以及服务器返回的响应。
dataType
(默认:智能猜测(xml
,json
,script
或html
))types:
String
您期望从服务器返回的数据types。 如果没有指定,jQuery将尝试根据响应的MIMEtypes推断它(一个XML MIMEtypes将产生XML,在1.4 JSON将产生一个JavaScript对象,在1.4脚本将执行该脚本,其他任何将作为string返回)。
该url应该正确指向操作映射。 假设它将在默认的命名空间中,否则你应该修改URL和映射来添加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>
如果您手动构buildJSONObject
则不需要返回json
结果types。 您可以将文本作为stream结果返回,然后在需要时将string转换为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"; } }
我已经将不同的结果与结果types和内容types进行了比较,以更好地描述这个想法 你可以返回任何这些结果,并返回JSON对象是否string化。 string化的版本需要parsing返回的数据来获取JSON对象。 你也可以select哪个结果types更好的序列化,以满足你的需求,但我的目标是显示,如果你需要序列化简单的对象,然后json插件是没有必要得到它的工作。
参考文献:
- 我们怎样才能返回一个文本string作为回应
- 如何将
JSONObject
转换为string
关于Struts2-JSON插件
Struts2 JSON插件以特定的方式工作:
JSON插件提供了一个“json”结果types,将动作序列化为JSON。
它将整个Action序列化为JSON,除了
- 瞬态属性
- 没有Getter的属性
如果您不希望整个Action被序列化,但是只有您select的一个对象,则可以指定一个根对象:
使用“root”属性(OGNLexpression式)指定要序列化的根对象。
它可以在struts.xml
完成,如下所示:
<result type="json"> <param name="root"> objectToBeSerialized </param> </result>
而行动应该有:
private CustomObject objectToBeSerialized; public CustomObject getObjectToBeSerialized(){ return this.objectToBeSerialized; }
CustomObject可以是一个原始types,一个string,一个数组等等。
通过这种方式(构build它的方式),您可以像在其他任何AJAX Struts2 Action中一样返回SUCCESS
和ERROR
,而不会违反框架约定,并像AJAX一样从AJAX jQuery调用的callback函数中访问序列化的JSON对象其他字段(如果使用rootObject,则var handledata = function(data)
的“data”将是您的对象,否则将是您的Action)。
关于你的具体情况
在你的情况下,假设你的对象结构看起来像这样
row1 [col1, col2], row2 [col1, col2], rowN [col1, col2]
你可以创build一个包含两列的对象列表:
价值对象
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>
要在AJAXcallback函数中testing它,只需使用$.each
:
var handledata = function(data) { $.each(data, function(index) { alert(data[index].col1); alert(data[index].col2); }); }
当然,你可以使用一个List<List<String>>
来代替一个Custom对象,或者你喜欢的任何其他对象结构,而不仅仅是这个想法。