【问题标题】:accessing session variables in javascript inside jsp在jsp内部的javascript中访问会话变量
【发布时间】:2011-08-30 19:55:57
【问题描述】:

我需要为 google APIs 表提供数据...所以我会将它从 servlet 发送到 JSP

但是如何在“googles”javascript 中访问这些数据?

我将提供另一个 JS 的示例 - 非常简单 - 只是为了让我学习如何制作主题所说的内容

    <script>
        function showTable()
        {
            <%
                Object obj = session.getAttribute("list");
                List<String> list = new ArrayList<String>();
                int size = 0; 

                if (obj != null) {
                    list = (ArrayList<String>) obj;
                    size = (Integer) session.getAttribute("size");
                }

                for (int i = 0 ; i < size ; i++) {
                    String value = list.get(i);

            %>
                    alert('<%= i %> = <%= value %> ');
            <%
                }

            %>                
        }
    </script>

它必须打印给定列表的元素...但现在它只是一个带有警报的大脚本...重构它?我不喜欢在 JSP 中使用太多 java,因为 servlet 是应该放置的地方

编辑:总结一下——我更喜欢这里的“普通”JS for loop……一般来说,我更喜欢最小化java代码,最大化JS

【问题讨论】:

    标签: javascript jsp session-variables


    【解决方案1】:

    在预处理 servlet 的 doGet() 中将其转换为 JSON。您可以为此使用Google Gson。假设你有一个List&lt;Person&gt;

    List<Person> persons = createItSomehow();
    String personsJson = new Gson().toJson(persons);
    request.setAttribute("personsJson", personsJson);
    request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response);
    

    (请注意,我将其设置为请求属性而不是会话属性,您可以随意更改它,但我相信它不一定需要是会话属性,因为它不代表会话范围的数据)

    在JSP中赋值给一个JS变量如下:

    <script>
        var persons = ${personsJson};
        // ...
    </script>
    

    这样它就可以作为一个完整的 JS 对象使用。您可以将其直接提供给 Google API。

    现在调用 servlet 的 URL 而不是 JSP。例如,当它映射到 /persons 的 URL 模式时,通过 http://localhost:8080/contextname/persons 调用它。

    【讨论】:

    • 哇,谢谢巴鲁斯。看起来不错。而且......它甚至可以工作:) 我使用了其他一些 JSON 实现,但代码看起来很相似。可读性很棒:)
    • 但是顺便说一句。我发现,我将 List 对象而不是 jsonarray 传递给请求,它工作正常。那么使用json有什么好处呢?仅用于转义特殊字符?
    • 当您使用List&lt;String&gt; 时,它确实有效。 List#toString() 巧合的是它匹配 JS 数组语法。但你不应该依赖它。当你有一个List&lt;SomeComplexObject&gt; 时绝对不会,其中每个项目都由SomeComplexObject#toString() 表示。是的,JSON 格式在处理特殊字符时也更加健壮。
    • 这对我来说是值得的,因为我无法访问 SessionScope 变量,因为它是 java 对象。有了 Gson,现在我可以治疗了。
    【解决方案2】:

    JavaScript 在客户端执行,scriptlet、EL 和 JSP 标签在服务器端执行。从服务器端代码的角度来看,JavaScript 只是生成的文本,就像 HTML 标记一样。

    所以,如果你想在生成的 HTML 页面中创建一个循环遍历 JavaScript 数组的 JavaScript 循环,你需要生成初始化数组的 JavaScript 代码和 JavaScript 循环。

    这是 JSP 代码

    var theArray = [<c:forEach items="${sessionScope.list}" var="item" varStatus="loopStatus">'${item}' <c:if ${!loopStatus.last}>, </c:if></c:forEach>];
    for (var i = 0; i < theArray.length; i++) {
        alert(theArray[i]);
    }
    

    此 JSP 代码将生成以下 JavaScript 代码,假设 session 属性中的列表包含“banana”、“apple”和“orange”:

    var theArray = ['banana', 'apple', 'orange', ];
    for (var i = 0; i < theArray.length; i++) {
        alert(theArray[i]);
    }
    

    不过,请确保正确转义列表的值以生成有效的 JavaScript 代码。例如,如果其中一个值是 "I'm cool",则生成的 JavaScript 将是

    var theArray = ['I'm cool', 'apple', 'orange', ];
    

    这不再有效。使用 commons-lang StringEscapeUtils.escapeEcmaScript 转义值。

    【讨论】:

    • 请注意 ['banana',] 数组将有 2 个值,最后一个未定义
    • @Liviu:感谢这个有用的说明。我在 Firefox 上测试过,它只包含 3 种水果。但是,在 IE 上,它包含 3 个水果 + 未定义。无论如何,我只是想展示生成 JavaScript 数组的想法。我会修复它以避免最后一个逗号。
    • error: missing = in XML attribute var theArray = [&lt;c:forEach items="[1, 2222, 3333]" var="item" varStatus="loopStatus"&gt;'' &lt;c:if true&gt;, &lt;/c:if&gt;&lt;/c:forEach&gt;]; 有什么问题,我可以解决这个问题吗?列表由以下方式创建: ` List list = new ArrayList(); list.add("1"); list.add("2222"); list.add("3333"); session.setAttribute("list", list);`
    【解决方案3】:

    由于 ArrayList 具有字符串对象,因此您可以简单地对数组列表的值使用 split() 方法。如下所示;

    function showTable() {  
      <%
           Object obj = session.getAttribute("list");
           List list = null;
           if (obj != null) {
               list = (ArrayList<String>) obj;
           } else list = new ArrayList<String>();  %>
    var jsList = <%=list.toString()%>
    
    //remove [] from content
    jsList = jsList.replace("[","");
    jsList = jsList.replace("]","");
    

    //split the contents var splitContent = jsList.split(","); //an array of element

    for(var i=0;i<splitContent.length;++i) {
      alert(splitContent[i]);
    }
    

    }

    我希望这能帮助你解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2011-12-29
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多