有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重构大型JSON多个调用

我正在编写java/spring webapp,其中每个用户都可以有自己的单词列表。每当用户添加/删除一个单词时,就会有一个ajax调用,它会发送一个带有这个单词的JSON来添加/删除,当服务器端完成时,JSON对象中的当前单词列表就会返回给jQuery

一切正常。对于较小的JSON单词列表,添加和删除速度非常快,但当单词列表变大时,ajax调用会变慢。而且增加/删除通话会非常频繁

JSON单词列表[波兰语单词]示例:

 [{"word":"abrys","wordId":646},{"word":"acpan","wordId":647},
 {"word":"akrania","wordId":457},{"word":"akwawita","wordId":648},
 {"word":"amalgamat","wordId":399},{"word":"amurski","wordId":465},
 {"word":"amurskie","wordId":1030},{"word":"ananke","wordId":649},
 {"word":"androlog","wordId":650}]

jQuery[或多或少]:

$("#add_word_submit").live("click", function(e) {
    e.preventDefault();
    var word = $('#add_word').serializeObject();
    $.postJSON("word.html", word, function(words) {
        showDividedAccountWords(words);     
    });
});

$(".delete_button").live("click", function(e) {
    e.preventDefault();
    if(confirm(Main.confirmWordDelete)) {
        var wordId = $(this).attr("id").substring("delete_".length);
        wordName["word"] = $(this).children("img").attr("alt");
        $.ajax({
            type: "DELETE",
            url: "word/" + wordId + ".html",
            success: function(words) {
                showDividedAccountWords(words);
            }
        }); 
    }
});

Java/Spring:

@RequestMapping(value="/word", method = RequestMethod.POST)
public @ResponseBody List<Word> addNewWord(@RequestBody Word word, Principal principal) {
    wordService.addNewWord(word, principal.getName());
    return getCurrentWords(principal.getName());
}

@RequestMapping(value="/word/{wordId}", method = RequestMethod.DELETE)
public @ResponseBody List<Word> deleteWord(@PathVariable Long wordId, Principal principal) {
    wordService.deleteWord(wordId, principal.getName());
    return getCurrentWords(principal.getName());
}

public List<Word> getCurrentWords(String username) {
    List<Word> accountWords = new ArrayList<Word>();
    accountWords.addAll(wordService.listUserWords(username));
    return accountWords;
}

你能给我一些重构的提示吗?也许我不应该每次用户添加/删除单词时都返回当前单词列表


共 (2) 个答案

  1. # 1 楼答案

    要以增量方式将word对象添加到列表中,请将新词传递给服务器,并使其仅返回单个(word:wordid)对象。然后,您可以将其添加到现有列表中,并按如下方式进行排序:

    var words=[{"word":"abrys","wordId":646},{"word":"acpan","wordId":647},
     {"word":"akrania","wordId":457},{"word":"akwawita","wordId":648},
     {"word":"amalgamat","wordId":399},{"word":"amurski","wordId":465},
     {"word":"amurskie","wordId":1030},{"word":"ananke","wordId":649},
     { "word": "androlog", "wordId": 650}];
    
    
    var result = { "word": "aklina", "wordid": "702" }; // returned by server from AJAX call
    words.push(result); 
    
    words.sort(
      function(a, b) {
        return a.word.localeCompare(b.word);
      }
     );
    
  2. # 2 楼答案

    我会让java/spring处理信息,但只返回一个小字符串,以查看数据传输中是否存在延迟。如果java/spring对数据的处理没有实质性差异,那么它要么在传输中,要么在jquery处理中。您可以通过让jQuery在传输完成时向控制台发送警报来测试这一点。如果速度很快,那么必须是jQuery处理较长的数据