如何从控制器返回对象列表并使用JQuery(SpringMVC,ajax)显示它们

How to return list of objects from controller and display them using JQuery (Spring MVC, ajax)

本文关键字:SpringMVC ajax 显示 JQuery 控制器 返回 对象 列表      更新时间:2024-05-22

首先,这是我的控制器:

@Controller
public class MainController {
   @Autowired
   SqlSession sqlSession;
   @Autowired
   Message messageVO;

@RequestMapping(value="getMessages", method=RequestMethod.GET)
public @ResponseBody List<Message> getMessages(HttpSession session){
    JbuserDAO dao = sqlSession.getMapper(JbuserDAO.class);
    List<Message> inboxList = null;
    String logedinUserId = (String) session.getAttribute("loginId");
    inboxList = dao.getInboxList(logedinUserId);
    System.out.println(inboxList);       //I do get the list here so it's not sql problem. I think.
    return inboxList;
}

这是我的JQuery:

$(function(){
   viewingInbox();
   $("#viewInbox").on('click', function(){
        viewingInbox();
    });
  });

function viewingInbox(){
   $.ajax({
        url: "getMessages"
      , method: "GET"
      , dataType: "JSON"
      , contentType: "application/json; charset=UTF-8"
      , success: function(obj){
        alert(obj.inboxList);      //I get undefined here
        messageInbox(obj);
      }
  });
}

function messageInbox(obj){
   var list = '<div>';
   $(obj.inboxList).each(function(i, item){
       list = list + '<article class="media">'
                  + '<span class="pull-left"><input type="checkbox" class="checkboxes"></span>'
                  + '<span class="pull-left thumb-sm"><img src="resources/images/a2.png" alt="..."></span>'
                  + '<div class="media-body">'
                  + '<div class="pull-right media-xs text-center text-muted">'
                  + '<strong class="h4">12:18</strong><br></div>'
                  + '<a href="#" class="h4">123'+item.sendidjbuser+'</a>'
                  + '<small class="block m-t-sm">'+item.message+'</small></div></article>'
   });
      list = list + '</div>';
      alert(list);               //here I get only <div></div>
      $("#inboxDiv").html(list);
      alert("messageInbox end");
}

我想做的是从DB中获取保存的消息,并将它们作为我创建的MessageVO列表返回,然后在jsp上打印出来。我以为这是一种方法,但我不认为我从控制器那里得到了列表。我试着在每一句话中加上警告(信息),但没有奏效;没有警报消息。这意味着我没有从控制器那里得到列表。我是不是错过了什么?

我添加了json数据绑定依赖项,但这就是我所拥有的关于json的一切。

我只学习了一个月的Strut2,最近才开始使用Spring,所以我一定犯了一个我不知道的愚蠢错误。请告诉我那是什么。提前谢谢。

您可以使用ResponseEntity作为返回元素,也可以将列表转换为json列表,以便jquery可以将其解释为迭代元素。

    @RequestMapping(value="getMessages", method=RequestMethod.GET)
    public ResponseEntity<String> getMessages(HttpSession session){
        JbuserDAO dao = sqlSession.getMapper(JbuserDAO.class);
        List<Message> inboxList = null;
        String logedinUserId = (String) session.getAttribute("loginId");
        inboxList = dao.getInboxList(logedinUserId);

  com.google.gson.Gson gson = new GsonBuilder().disableHtmlEscaping().create();
        String jsonString = gson.toJson(inboxList);
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.add("Content-Type", "text/html; charset=utf-8");
        return new ResponseEntity<String>(jsonString, responseHeaders, HttpStatus.CREATED); 

    }

这样你一定会得到你想要的信息列表。P.S:我还没有看完你剩下的代码。但以下内容应该有效:

success: function(obj){
 $.each(obj, function(index) {
            alert(obj[index].sendidjbuser);
            alert(obj[index].message);
        });

      }

问题已解决。与Struts2不同,我不必这样做:

$(obj.inboxList).each(function(i, item){

我想在Struts2中,我必须放入obj.inboxList,因为在操作端有getter和setter。

在Spring中,没有getter和setter,所以可能,真的可能,因为我只是在猜测,这就是为什么只使用obj有效:

$(obj).each(function(i, item){

您可以将Jackson添加到类路径中,或者添加对maven的依赖项,Spring Mvc将您的列表转换为json。您只需要将参数添加到@RequestMapping products="application/json",在您的情况下,它看起来像@RequestMap(value="getMessages",method=RequestMethod.GET,products="applications/json"),也可以生成不必要但推荐的参数。并且您不需要在控制器中进行任何编辑。