有 Java 编程相关的问题?

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

java通过JSP获取JSON到JS

我在从servlet中获取JSON字符串时遇到了一些问题,将JSP页面转换为JavaScript并导入到Vakata/JStree中

这就是我当前代码的样子

Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("Du är nu i DoGet MarketDataServlet");

    TreeBranchStringBuilder tbsb = new TreeBranchStringBuilder();       
    request.setAttribute("marketgrouplistJSONString", tbsb.getTreeBranchString(mm.getAllMarketgroups(), im.getAllItems()));
    request.getRequestDispatcher("/marketdata.jsp").forward(request, response);
}

JSP/HTML:

<div id="market_tree_branches">
</div>

<div id="hidden"><%= request.getAttribute("marketgrouplistJSONString") %></div>

JavaScript:

var marketnitemsString = $("#hidden").text();
console.log(marketnitemsString)
$('#market_tree_branches').jstree({
    'core' : {
        'data' : marketnitemsString
    }
});

从我的JSP生成的字符串如下所示:

[{"id":2,"text":"Blueprints","parent":"#"},{"id":204,"text":"Ships","parent":"2"},{"id":209,"text":"Ship Equipment","parent":"2"},{"id":211,"text":"Ammunition \u0026 Charges","parent":"2"},{"id":357,"text":"Drones","parent":"2"},{"id":943,"text":"Ship Modifications","parent":"2"},{"id":1041,"text":"Manufacture \u0026 Research","parent":"2"},{"id":1338,"text":"Structures","parent":"2"},{"id":9,"text":"Ship Equipment","parent":"#"},{"id":10,"text":"Turrets \u0026 Bays","parent":"9"}]

这是我在Chrome控制台日志中遇到的错误:

Uncaught Error: Syntax error, unrecognized expression: 
[{"id":2,"text":"Blueprints","parent":"#"},{"id":204,"text":"Ships","parent":"2"},{"id":209,"text":"Ship Equipment","parent":"2"},{"id":211,"text":"Ammunition \u0026 Charges","parent":"2"}, ........

因为我不能从JSP/JSP中猜出什么是错误的变量,所以我不能从JSP/JSP中猜出什么是错误的。但是,如果我将HTML中的整个字符串复制/粘贴到“数据”中,效果很好


共 (2) 个答案

  1. # 1 楼答案

    最好的选择是使用从JavasScript代码直接到servlet的AJAX调用。绝对没有理由让JSP在中间。你可以这样做:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Du är nu i DoGet MarketDataServlet");
    
        TreeBranchStringBuilder tbsb = new TreeBranchStringBuilder();       
        String json = bsb.getTreeBranchString(mm.getAllMarketgroups(), im.getAllItems());
        response.setContentType("application/json");
        response.getWriter().println(json);
    }
    

    对于JavaScript方面,这完全取决于您想要使用什么JavaScript框架JQuery is the easiest starting point为了这个

  2. # 2 楼答案

    我不知道你为什么要穿过一个隐藏的元素:

    var marketnitemsString = <%= request.getAttribute("marketgrouplistJSONString") %>;
    $('#market_tree_branches').jstree({
        'core' : {
            'data' : marketnitemsString
        }
    });
    

    由于<% %>是在解析js之前执行的,因此它生成的文本随后会被客户机解释为标准js,只要语义正确,它就会执行应该执行的操作(在变量中存储一个数组)

    这与我实际使用的代码非常相似,所以我相当确定它可以工作,即使我目前无法测试它

    另外,如果你的数据是一个数组,我不确定核心是什么。数据元素可以以字符串的形式接受它:

    http://www.jstree.com/api/#/?f=$.jstree.defaults.core.data

    所以这可能是代码问题的根源