在jsp里面的javascript中访问会话变量

时间:2011-08-30 09:53:39

标签: javascript jsp session-variables

我需要为google API表提供数据...所以我将它从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循环...通常我更喜欢最小化java代码,并最大化JS

3 个答案:

答案 0 :(得分:21)

将其转换为预处理servlet的doGet()中的JSON。您可以使用其他Google Gson来实现此目的。假设你有List<Person>

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的网址格式时,请按http://localhost:8080/contextname/persons调用它。

答案 1 :(得分:4)

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来逃避值。

答案 2 :(得分:1)

由于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]);
}

}

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