Проблема возврата значения 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();
}
распорки.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.апаш.struts2.диспетчер.Диспетчер - Не удалось найти действие или результат Нет результата определенных действий действий.Часть и результат {"столбца 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. Пожалуйста, поправьте меня, что здесь не так?
2 ответов
A dataType : 'json'
используется jQuery Ajax чтобы указать тип данных, который, как ожидается, будет возвращен success
функция обратного вызова при выполнении действия и результата, а также ответ, возвращенный с сервера.
dataType
(по умолчанию: Intelligent Guess (xml
,json
,script
илиhtml
))тип:
String
тип данных, которые вы ожидаете от сервера. Если none не указан, jQuery попытается вывести его на основе типа MIME ответа (тип MIME XML даст XML, в 1.4 JSON даст объект JavaScript, в 1.4 скрипт выполнит скрипт, и все остальное будет возвращено в виде строки).
URL должен правильно указывать на сопоставление действий. Предположим, что он будет в пространстве имен по умолчанию, иначе вы должны изменить URL и сопоставление, чтобы добавить .
<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 не нужен для его работы.
ссылки:
о плагине Struts2-JSON
Struts2 JSON плагин работает определенным образом:
плагин JSON предоставляет тип результата "json", который сериализует действия в JSON.
он сериализует все действие в JSON, кроме
- переходные свойства
- свойства без Геттера
если вы не хотите, чтобы все действие быть сериализованным, но только один объект по вашему выбору, вы можете указать корневой объект:
используйте атрибут "root" (выражение OGNL), чтобы указать корневой объект для сериализации.
это можно сделать в struts.xml
такой:
<result type="json">
<param name="root">
objectToBeSerialized
</param>
</result>
в то время как действие должно иметь:
private CustomObject objectToBeSerialized;
public CustomObject getObjectToBeSerialized(){
return this.objectToBeSerialized;
}
где CustomObject может быть примитивом, строкой, массивом и т. д...
используя его таким образом (путь он построен для), Вы можете возвращение SUCCESS
и ERROR
как и в любом другом действии AJAX Struts2, без нарушения рамочных соглашений и доступа к сериализованному объекту JSON из функции обратного вызова вызова AJAX jQuery, как и любое другое поле (при использовании rootObject, "данные"var handledata = function(data)
будет вашим объектом, иначе это будет ваше действие).
о вашем конкретном случае
в вашем случае, предполагая, что ваша структура объекта выглядит так
row1 [col1, col2],
row2 [col1, col2],
rowN [col1, col2]
вы можно создать список объекта с двумя столбцами:
Стоимость Объекта
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>>
вместо пользовательского объекта или любой другой структуры объекта вам нравится больше, чем это: это было только, чтобы получить вам идею.