//js端代码
$(".accept").click(function(){ 
alert("i was clicked");
$.ajax({
type: "POST",
url: "question/questionAction_changeAccept",
dataType: "json",
success: function(json){ alert("right:"+json.result); },
error: function(json){ alert("error:"+json.result); }
});
});//问题
后台action能够获得请求,并且生成json格式数据(后台能打印出来),问题是前台无法获得返回的值,error弹出的值是 undefinedstrutsajaxjson

解决方案 »

  1.   

    在后台把json打印出来看看!
    是否是json格式的问题!
      

  2.   


    不是json格式的问题:
    [{"acceptnumber":0,"accountstatus":0,"address":"上海合胜","area":{"areaname":"上海客服","id":1,"number":"KF100","status":0,"version":0},"company":{"address":"","id":2,"name":"上海合胜","number":"","re":"","tel":"","version":0},"email":"","id":23,"messages":[],"password":"123441","phonenumber":"1234","realname":"诱导","re":"","status":0,"username":"user","version":0}]
      

  3.   

    是否对<result>标签进行了配置(指定返回类型)?
    正确的配置信息如下:
    <result name="success" type="json"></result>
      

  4.   


    这是我的配置:
    <package name="question" extends="json-default" namespace="/question">
    <action name="questionAction_*" class="com.mvs.action.QuestionAction" method="{1}">
    <result name="success">${pagecontext.request.contextpath}/background/question.jsp</result>
    <result name="json" type="json"></result>
    </action>
    </package>
      

  5.   

    你json数据里面木有result,json.result肿么不会是undefined。还有json验证的网站http://jsonlint.com/可以去看看json格式是否错误
      

  6.   


    result是后台存放json的,前台通过struts2就能自动取出。还有json格式也是正确的,本来就是list通过工具转换成json格式的。
      

  7.   

    -------配置------
    <package name="user" namespace="/user"  extends="json-default">
    <action name="checkUserName" class="com.up.action.CheckUserNameAction">
    <result name="success" type="json"></result>
    </action>
    <action name="ook">
    <result>/index.jsp</result>
    </action>
    </package>
    ------------------后台------------------------
    private String userName;
    private boolean ok; public boolean isOk() {
    return ok;
    } public void setOk(boolean ok) {
    this.ok = ok;
    } public String getUserName() {
    return userName;
    } public void setUserName(String userName) {
    this.userName = userName;
    }
    public String execute(){
    System.out.println(userName);
    if(userName.equals("oop")){
    ok=true;
    }else{
    ok=false;
    }
    return "success";
    }
    -------------前台-------------------------
    $.ajax({
         "url":"/JQueryTest/user/checkUserName.action?userName="+userName,
         "type":"GET",
         "dateType":"json",
         "success":function(date){
         if(date.ok){
         $("#nameSpan").html("ok!");
         }else{
         $("#nameSpan").html("error!");
         }
         }
         });
    --------------------------------------------------
    你看看是否能够帮到你吧 . . .
      

  8.   

    <result name="success">${pagecontext.request.contextpath}/background/question.jsp</result>
    应该不行,没有跳转的。还是在之前的页面,这就是ajax
      

  9.   


    这个是我另一个方法的result ,ajax方法的result在下面
      

  10.   

    把后台贴出一点来看看,之前传json都是用response直接out的..不行你就直接弹出data看看他是什么东西.也可以用IE的工具。看你的数据,应该是这样的{"result":[{"acceptnumber":0,"accountstatus":0,"address":"上海合胜","area":{"areaname":"上海客服","id":1,"number":"KF100","status":0,"version":0},"company":{"address":"","id":2,"name":"上海合胜","number":"","re":"","tel":"","version":0},"email":"","id":23,"messages":[],"password":"123441","phonenumber":"1234","realname":"诱导","re":"","status":0,"username":"user","version":0}]}
      

  11.   


    5楼已经讲过了!
    你alert("right:"+json.result);必须undefined的!
    因为你返回的json数据中没有result这个属性!
    你这个格式得这样访问!
    如果你想取得address这个属性:
    json[0].address
    如果你想取得company属性里面的name属性:
    json[0].company.name而不是你这样json.resultjson格式、遇到[]就是数组、就得用[下标]去访问
    {}就是对象、可以直接用".属性"去访问
      

  12.   


    已经解决了,不是那个result的问题,因为,虽然result不是存放在json里的对象 ,但是struts2可以根据getter方法取出来。
    问题出在一个地方,
    public Map<String, Object> getRequest() {
    return request;
    }
    把这个getter方法去掉就可以了,虽然不知道原理是什么,但是问题就出在这里。
      

  13.   

    //我后台的action
    package com.mvs.action;import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;import org.apache.struts2.interceptor.RequestAware;
    import org.apache.struts2.json.annotations.JSON;import com.mvs.model.Message;
    import com.mvs.model.User;
    import com.mvs.service.MessageService;
    import com.mvs.service.RoleService;
    import com.mvs.util.JsonUtil;
    import com.opensymphony.xwork2.ActionSupport;public class QuestionAction extends ActionSupport implements RequestAware{ private Message message;
    private Map<String, Object> request;
    private MessageService messageService;
    private RoleService roleService;
    private String result;
    @JSON(serialize=false)
    public Message getMessage() {
    return message;
    }
    public void setMessage(Message message) {
    this.message = message;
    }

    //不要添加getRequest方法 否则会出现ajax无法回传的问题。
    public void setRequest(Map<String, Object> request) {
    this.request = request;
    }
    @JSON(serialize=false)
    public MessageService getMessageService() {
    return messageService;
    }
    public void setMessageService(MessageService messageService) {
    this.messageService = messageService;
    }
    @JSON(serialize=false)
    public RoleService getRoleService() {
    return roleService;
    }
    public void setRoleService(RoleService roleService) {
    this.roleService = roleService;
    }

    public String getResult() {
    return result;
    }
    public void setResult(String result) {
    this.result = result;
    }
    /**
     * 从后台获取问题列表,并输出到页面
     */
    @Override
    public String execute() throws Exception {
    List<Message> list = messageService.getAll();
    if(list == null){
    System.out.println("list为空");
    return "success";
    }

    //输出问题列表
    for (Message message : list) {
    System.out.println(message.getNumber());
    }
    request.put("questionList", list);
    return "success";
    }

    /**
     * 转移受理人的方法
     * @return
     * 
     */ public String changeAccept() throws Exception{
    Set<User> set = roleService.getUserSet(new Long(3));
    List<User> list = new ArrayList(set);
    System.out.println(list.size());
    result = JsonUtil.ListToJSON(list,"roles");
    System.out.println(result);
    return "json";
    }
    }
      

  14.   


    用response的out肯定是可以的,现在是和struts2框架结合,使用另一种方式处理。问题我已经找到了,不知道各位知不知道其中的原理?
      

  15.   

    不明..一个get方法肿么会影响。可能strut干了点啥,先,看楼下。
      

  16.   

    照你现在上传得的代码来看,应该没有写全,后台处理了相关的数据,也执行了相关的页面跳转控制,可是没有一个是传值的.在前台你用了document.write()函数,但是取不到值,所以会出现undfine错误.在jsp里面,后台传值是通过response对象,在这里貌似也应该用这个对象,先试一下再说。方法具体参照一下http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html里面的方法2
      

  17.   

    楼主还没明白Struts2的json-plugin的用法。如果你没在getter方法上加@JSON(serialize=false)或者没有在配置文件里面的返回json的result下指定<param name="excludeProperties"></param>(排除输出的属性)
    struts2默认会把所有带getter的属性都输出的,所以这就是为什么你把getRequest去掉就可以了,你在这个方法上也加入@JSON(serialize=false)或者在配置文件里的result里加入<param name="excludeProperties">request</param>一样能达到效果
      

  18.   


    传值做什么 本来就是ajax啊 再说 为result添加了get方法不就可以获取值了么
      

  19.   

    http://struts.apache.org/2.2.1.1/docs/json-plugin.html即使带上request输出也没有理由要影响result的获得。
    可以重点查下request属性是如何影响result的。