ajax+json存List 不到Success函数

J2EE 码拜 9年前 (2015-04-06) 1239次浏览 0个评论
 

问题如下:
  在service获取List<Project> 在action里转成json对象 再到js里来显示这个list 
问题出现了,json对象死活不到success方法 只到error方法 ,后来查了一晚上 都说是json格式不正确,我也确定是json格式的问题,用正确的json格式传进去,还是没法到success,我快疯了,好人们过来帮个忙啊。用的struts1.
action层如下:
List<Project> list=applicationService.getProjectName();
JSONArray array = JSONArray.fromObject(list);
System.out.println(array.toString());
request.setAttribute(“data”, array);
// response.getWriter().write(“{“result”:”true”, “msg”:”删除成功”}”);
response.getWriter().write(array.toString());
return null;
这里array有值  打印出来结果为[{“id”:1283,”name”:”Internal CR Print Smart Grade”},{“id”:1284,”name”:”TAL PLM Import & Export”}]
js代码如下:
function getProjName() {
alert(“sss”);
$.ajax( {
type : “POST”,
url : “http://localhost:8080/FBTrack_PMO/transfer/getProj.fb”,
dataType : “JSON”,
cache : “false”,
success : function(data) {
alert(data);
},
 error: function(res, text) {
            alert(“错误信息:” + text);
        }
});
}
这里如果我把dataType改成text,就可以获取到以一个html格式的数据,也能到success 的方法
如果是json 则到error 显示parsererror 
大侠们救命啊,这个解决不了我几天吃不下去饭了。。。。

ajax+json存List 不到Success函数
2分
我这边也遇到过这种情况  是jquery版本的问题  一开始用的是  jquery-1.4.1.min.js  后来用的jquery-1.6.2.min.js 可以的   你试试看 
ajax+json存List 不到Success函数
我用的jquery1.7的 那我试试其他版本 
大侠们 救命啊
ajax+json存List 不到Success函数
1分
换个版本的jquery试试
ajax+json存List 不到Success函数
2分
response.setContentType(“application/json;charset=UTF-8”);
ajax+json存List 不到Success函数
回复4楼:
加了 还是一如既往的不行···
ajax+json存List 不到Success函数
引用 5 楼  的回复:

回复4楼:
加了 还是一如既往的不行···

换版本么有?

ajax+json存List 不到Success函数
1分
dataType : “JSON”,
中JSON改为小写呢
ajax+json存List 不到Success函数
1分
我记得jquery的dataType应该都是小写字母的
ajax+json存List 不到Success函数
4分
本来想偷懒的,写个完整的,如果OK,记得结贴。

List<Project> list=applicationService.getProjectName();
Iterator<Project> iterator = list.iterator();
StringBuffer jsonStr = new StringBuffer();
while (iterator.hasNext()) {
    Project project = iterator.next();
    jsonStr.append("{"id":"").append(project.getId())
	   .append("","name":"").append(project.getName())
	   .append(""}");
    if (iterator.hasNext())
        jsonStr.append(",");
}
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("[" + jsonstr + "]");
return null;
ajax+json存List 不到Success函数
2分
以前我遇到过这样的问题,看是不是因为action返回的信息有错
ajax+json存List 不到Success函数
引用 8 楼  的回复:

我记得jquery的dataType应该都是小写字母的

换成小写了 也不行 

ajax+json存List 不到Success函数
引用 6 楼  的回复:

引用 5 楼  的回复:
回复4楼:
加了 还是一如既往的不行···

换版本么有?

换成新版本后 也能进action 我设了断点 也能进去  说明ajax也能用 就是不到success方法

ajax+json存List 不到Success函数
引用 9 楼  的回复:

本来想偷懒的,写个完整的,如果OK,记得结贴。

Java code

List<Project> list=applicationService.getProjectName();
Iterator<Project> iterator = list.iterator();
StringBuffer jsonStr = new StringBuffer();
while (iterator……

放心 每个回答的我都会给分 一会加分
你这方法我也试了 还是到error方法
顺便问一下 怎么用火狐的看返回的信息? 我也用了firebug 但是不知道看哪里 高手指点一下

ajax+json存List 不到Success函数
引用 14 楼  的回复:

每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分

灌水帖 没分 

ajax+json存List 不到Success函数
也换<script language=”javascript” src=”js/jquery-1.4.2.js”></script>了
dataType:”json”也小写了
response.setContentType(“application/json;charset=UTF-8”);也设置返回类型是json了
这咋这么难呢 我要是吧dataType设置成text就没问题  
谁知道咋看返回的东西的 既然是parsererror 那肯定是返回的不是json格式的
那我write()里面写的是标准的json,也不到success方法 ,为啥啊为啥啊
ajax+json存List 不到Success函数
2分
直接返回[{“id”:1283,”name”:”Internal CR Print Smart Grade”},{“id”:1284,”name”:”TAL PLM Import & Export”}]找个字符串能欧诺个json拿到不,
我这边直接写找个字符串当json接收没问题
ajax+json存List 不到Success函数
你后边写那个return null干啥
ajax+json存List 不到Success函数
2分
你把dataType改成text得到的结果是啥,发出来看看,怎么会是个html呢
ajax+json存List 不到Success函数
引用 18 楼  的回复:

你后边写那个return null干啥

因为是struts1 用ajax来异步获取List这里必须是return null 否则你随意return个 strut就会往配置里找 就可能到其他界面,return null就可以避免, 然后把返回的值写到response里 关键是把json写进去 竟然传不到success方法 

ajax+json存List 不到Success函数
怎么发图片啊 我怎么发布上去  这里我发现个问题 要是返回的text 那String数据在那html里 而且在<tr><td>里
ajax+json存List 不到Success函数
2分
那找个问题应该是你处理逻辑里报了错了吧!
你配置错误跳转页面了吧,返回的应该是你的错误跳转页面吧,不然text返回的应该是和json一样的字符串的
ajax+json存List 不到Success函数
图片如下 
[img=http://my.csdn.net/my/album/detail/1111239#][/img]
[img=http://my.csdn.net/my/album/detail/1111239][/img]
ajax+json存List 不到Success函数
晕 图片咋没上去 我传相册了啊
[img=http://my.csdn.net/my/album/detail/1111239#][/img]
ajax+json存List 不到Success函数
2分
你那个返回的东西不对的,中间肯定有问题!是不是还有其他的处理!
ajax+json存List 不到Success函数
4分
第一步 :在后台打印转换后的json的数据,看看数据的格式是否正确
第二部 :查看前台是否引入了正确的js文件
第三步 :编写的js是否正确

据分析楼主第一步应该没有问题。

ajax+json存List 不到Success函数
2分
引用 9 楼  的回复:

本来想偷懒的,写个完整的,如果OK,记得结贴。

Java code

List<Project> list=applicationService.getProjectName();
Iterator<Project> iterator = list.iterator();
StringBuffer jsonStr = new StringBuffer();
while (iterator……

用9楼的方式还是不行,还了jquery版本还是不行的话,建议还是用firebug调试,看看到底jsp中jquery方法执行到那里报错了。
另外,

把这段

error: function(res, text) {
  alert(“错误信息:” + text);
  }
});

拿掉。

ajax+json存List 不到Success函数
2分
error: function(res, text,aa) {
  alert(“错误信息:” + text +aa);
  }
看看aa打印出来是什么,这个里面的信息才是你的准确错误信息,text只是错误状态
ajax+json存List 不到Success函数
引用 29 楼  的回复:

error: function(res, text,aa) {
  alert(“错误信息:” + text +aa);
  }
看看aa打印出来是什么,这个里面的信息才是你的准确错误信息,text只是错误状态

打印的信息的parseerrorundfine
没定义?  这是为啥?返回的值怎么没定义呢 我在那里response.getWriter().write(“{“result”:”true”, “msg”:”删除成功”}”); write了

ajax+json存List 不到Success函数
http://img.my.csdn.net/uploads/201204/10/1334043929_6711.jpg
ajax+json存List 不到Success函数
2分

List<User> list = this.getUserService().getUserDao().getList(
				"from User");
		Map hashMap = new HashMap();
		hashMap.put("success", true);

		hashMap.put("totalProperty", list.size());
		List root = list;
		JSONArray ja = JSONArray.fromObject(root);

		hashMap.put("root", ja);
		JSONObject jo = JSONObject.fromObject(hashMap);

		try {
			System.out.println(jo);
			response.getWriter().print(jo);
		} catch (IOException e) {
			e.printStackTrace();
		}

你试试这种格式

ajax+json存List 不到Success函数
2分

首先
ajax别用post提交
用get

其次你考虑给ajax加同步锁
async:false,

ajax+json存List 不到Success函数
引用 34 楼  的回复:


首先
ajax别用post提交
用get

其次你考虑给ajax加同步锁
async:false,

换成get也试了 同步锁也设了   还是不行  
我在火狐上设置个断点 图在上面 发现到这success后不进去 到另一个scuuess()没有参数的这里跳了 
看来问题很清楚了,没有返回来值  但是问题也就在这 我就算在action里write的是大家说的标准的json,竟然也不行,JSONObject jo = JSONObject.fromObject(hashMap);这句话打印出来就是标准的json格式的
还有其他的原因吗?

ajax+json存List 不到Success函数
[{“id”:1283,”name”:”Internal CR Print Smart Grade”},{“id”:1284,”name”:”TAL PLM Import & Export”}
打印出来的是这些  list里我放的是project对象,值有好多 是不是因为长度的问题呢 因为数据有500条(id,name)但是也不对呀 我就放一个
(“{“result”:”true”, “msg”:”删除成功”}”);这也不到success
ajax+json存List 不到Success函数
10分
引用 35 楼  的回复:

引用 34 楼  的回复:


首先
ajax别用post提交
用get

其次你考虑给ajax加同步锁
async:false,

换成get也试了 同步锁也设了   还是不行  
我在火狐上设置个断点 图在上面 发现到这success后不进去 到另一个scuuess()没有参数的这里跳了 
看来问题很清楚了,没有返回来值  但是问题也就在这 我就算在action里w……

 hashMap.put(“success”, true);
 然后再hashMap.put(“这里是你的list”);
然后再JSONObject jo = JSONObject.fromObject(hashMap)
最后 response.getWriter().print(jo);看看

ajax+json存List 不到Success函数
2分
如果都不行的话,楼主可能是你return null;这里出问题了,貌似我以前也出现过这样的问题,你改成不要返回值的试试。。。
ajax+json存List 不到Success函数
引用 38 楼  的回复:

如果都不行的话,楼主可能是你return null;这里出问题了,貌似我以前也出现过这样的问题,你改成不要返回值的试试。。。

如果不要return null 怎么写呢  用的struts1 exectute方法必须return个ActionForward

ajax+json存List 不到Success函数
2分
return null ;有问题吧,我这个和你很类似,就可以。你可以看看~~

public void findBranchorg() {
Company company = new Company();
List<Company> companyList = service.findBranchorg(company);
JSONArray json = JSONArray.fromObject( companyList);

HttpServletResponse response =ServletActionContext.getResponse();
response.setCharacterEncoding(“utf-8″);
try {

response.getWriter().print(json);

} catch (IOException e) {
e.printStackTrace();
}
}

       $.ajax({
type:”post”,
data:{idBranchorg:idBrachorg},
url:”../sVal.action”,
dataType:”json”,
success:function(sValJson ){
$(“#userCode”).val(sValJson[0].sVal);
        },
        error:function(){
            alert(“error!”);
        }
});

ajax+json存List 不到Success函数
引用 40 楼  的回复:

return null ;有问题吧,我这个和你很类似,就可以。你可以看看~~

public void findBranchorg() {
Company company = new Company();
List<Company> companyList = service.findBranchorg(company);
JSONArray json = JSONArray.fr……

那怎么到你自定义的方法呢 你url里没有写findBranchorg这方法吧 
那url改成”http://localhost:8080/FBTrack_PMO/transfer/getProj!findBranchorg.fb”,我试试能不能进自定义的方法

ajax+json存List 不到Success函数
引用 40 楼  的回复:

return null ;有问题吧,我这个和你很类似,就可以。你可以看看~~

public void findBranchorg() {
Company company = new Company();
List<Company> companyList = service.findBranchorg(company);
JSONArray json = JSONArray.fr……

你那个是struts2的写法 struts1没有ServletActionContext

ajax+json存List 不到Success函数
另外 我发觉这问题可能是我这项目的问题 ,我在另一项目里 用struts2 就没问题,能进success 但是这个死活进不去 除非改成text类型的  诡异啊诡异,text就能返回json就不行,在另一个项目里text json都没问题 
json里就写一简单的json格式的字段
ajax+json存List 不到Success函数
2分
text能返回,可能就是格式有问题吧。
以前我在做项目的时候也碰到过这个问题,因为当时赶的比较急,所以把一个json分开返回了、
ajax+json存List 不到Success函数
2分
引用 41 楼  的回复:

引用 40 楼  的回复:

return null ;有问题吧,我这个和你很类似,就可以。你可以看看~~

public void findBranchorg() {
Company company = new Company();
List<Company> companyList = service.findBranchorg(company);
JSONArray js……

 $(“#brachOrg”).change(function(){
      $(“#subOrg”).empty();
      $(“#Org”).empty();
      var str=”<option>全部</option>”;
      $(“#Org”).append(str);
var idBrachorg =$(“#brachOrg”).val();
findsuborg(idBrachorg);   
findsVal(idBrachorg);

});

类似这种!

ajax+json存List 不到Success函数
引用 44 楼  的回复:

text能返回,可能就是格式有问题吧。
以前我在做项目的时候也碰到过这个问题,因为当时赶的比较急,所以把一个json分开返回了、

那我用ajax的时候 到后台 把list放到request范围内 再在页面中把list的值遍历到下拉菜单 可以实现吗
也不用操作json数据了 既然到后台了放request里不行吗?
再页面用<s:property >获取那list 

ajax+json存List 不到Success函数
44分
毛都没长全就学人家用jquery ajax 大神来给你解决吧 让你这狗日的安心吃饭饭吧 犹豫你用的是$.ajax方法 异步请求进入服务端  服务端返回后要判断 返回后进入哪个方法 (是success方法或还是fail方法) 所以你才返回的时候 要写个boolean类型的变量 名字可以写成success 就这么写吧 定义:
  Map result = new HashMap();
  result.put(“success”, true);
  result.put(“list”, list);
  JSONObject json = JSONObject.fromObject(result); 
  response.getWriter().write(json);
拿去试试 有问题加我Q 632167558
ajax+json存List 不到Success函数
3分
看了 你用text返回的时候返回的不是有td标签的东西吗?说明你中间是不是用了拦截器等东西吧你返回的东西修改了,你在页面拿到的东西已经不是json的东西了,他按json去拿的话肯定就不对了的
ajax+json存List 不到Success函数
我用struts2的时候也是这样…ajax也执行了,但是就是到不了success…到现在还没找到原因= = 我在等你的答案…
ajax+json存List 不到Success函数
引用 48 楼  的回复:

看了 你用text返回的时候返回的不是有td标签的东西吗?说明你中间是不是用了拦截器等东西吧你返回的东西修改了,你在页面拿到的东西已经不是json的东西了,他按json去拿的话肯定就不对了的

嗯 你说的有理 我这中间确实有拦截器拦截的 因为用的struts1,我看看拦截里怎么处理的

ajax+json存List 不到Success函数
引用 47 楼  的回复:

毛都没长全就学人家用jquery ajax 大神来给你解决吧 让你这狗日的安心吃饭饭吧 犹豫你用的是$.ajax方法 异步请求进入服务端  服务端返回后要判断 返回后进入哪个方法 (是success方法或还是fail方法) 所以你才返回的时候 要写个boolean类型的变量 名字可以写成success 就这么写吧 定义:
  Map result = new HashMap();
  res……

我按照你说的 把“true”这字符串写进去 然后到success : function(data) {
alert(“fffff”);
},error: function(res, text,aa) {
alert(“错误信息:” + text +aa);
}
出来的信息是  错误信息:parsererrorSyntaxError: JSON.parse: unexpected character

ajax+json存List 不到Success函数
大家看看 是不是拦截器这里出了问题 代码如下: web.xml里
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>
com.opensymphony.module.sitemesh.filter.PageFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>*.fb</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.fb</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>GetEmployeePicture</servlet-name>
<servlet-class>
com.freeborders.psa.servlet.GetEmployeePicture
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetEmployeePicture</servlet-name>
<url-pattern>/individual/getEmployeePicture</url-pattern>
</servlet-mapping>
<filter>
<filter-name>clickstreamFilter</filter-name>
<filter-class>
com.opensymphony.clickstream.ClickstreamFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>clickstreamFilter</filter-name>
<url-pattern>/*</url-pattern>

大家看看 那个是拦截返回值是json格式的 导致json格式的里面增加html

ajax+json存List 不到Success函数
学习。。。不会。。。。
ajax+json存List 不到Success函数
引用 52 楼  的回复:

大家看看 是不是拦截器这里出了问题 代码如下: web.xml里
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>
com.opensymphony.module.sitemesh.filter.PageFilter
</filter-class>
</filter>
<filter-mapping>
<filt……

你这个只能看到你有几个过滤器,但是过滤器里做啥事情不知道啊

ajax+json存List 不到Success函数
你把PageFilter和ClickstreamFilter发出来看看
ajax+json存List 不到Success函数
引用 55 楼  的回复:

你把PageFilter和ClickstreamFilter发出来看看

那两个filter的class 是com.opensymphony.clickstream.ClickstreamFilter 
com.opensymphony.module.sitemesh.filter.PageFilter

ajax+json存List 不到Success函数
有可能就是m.opensymphony.module.sitemesh.filter.PageFilter的问题,你先把这个过滤器去掉看看你得到的结果对不对呢
ajax+json存List 不到Success函数
response.getWriter().write(array.toString()); 是你这个没关闭 和过滤器没关系的
response.getWriter().close(); 昨天不是给你写出来了么  
ajax+json存List 不到Success函数
引用 58 楼  的回复:

response.getWriter().write(array.toString()); 是你这个没关闭 和过滤器没关系的
response.getWriter().close(); 昨天不是给你写出来了么

是response里的东西,不需要自己显示的关闭的,response失效前会自动处理的

ajax+json存List 不到Success函数
2分
用firebug调试时,可以打开控制台,找到你的页面的代码,然后一步一步的跟踪,看传到后台的参数和返回到前台的参数是不是你想要的,
ajax+json存List 不到Success函数
请问楼主最后怎么解决的啊

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明ajax+json存List 不到Success函数
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!