0

我有一个成功设置了一堆会话变量的 Java servlet,说:

会话变量 1 会话变量 2 会话变量 3

现在,在 Java Script 中,我可以使用类似于以下的代码读取和打印会话变量:

var name = '<%= session.getAttribute( "SessionVar1" ) %>';      
var name = '<%= session.getAttribute( "SessionVar2" ) %>';      
var name = '<%= session.getAttribute( "SessionVar3" ) %>';      

然后我调用 document.write 打印 name1、name2 和 name3。

同样,这没有问题。但是,我没有 3 个会话变量,而是 100 个。我不想编写 100 个对 session.getAttribute 的调用,所以我想使用“FOR”循环并将循环计数器附加到要检索的会话变量的名称中。类似于以下内容:

int i=100;
for (i=1; i<=100; i++)
{
   var VariableName = "SessionVar" + i;
   var name = '<%= session.getAttribute( VariableName ) %>';      
   document.write(name);
}

我尝试了很多组合,但无法将参数传递给 session.getAttribute。我知道服务器上下文中不存在 Javascript 参数,但我想知道是否有任何方法可以避免调用 session.getAttribute 100 次。

先感谢您。

问候,

盖伊

4

1 回答 1

1

当然不是——scriptlet (boooo) 在客户端有机会运行任何 JavaScript 之前运行。

规范的解决方案是在 Java 中生成 JS(最好使用标签),非常粗略:

<% for (int i = 0; i < 100; i++) { %>
    var name<%= i %> = '<%= session.getAttribute("SessionVar" + i) %>';
<% } %>

需要注意的是 (a) ew 和 (b) 您应该对属性进行 JavaScript 转义以确保安全。

这仍然调用getAttribute了 100 次——你需要 100 个会话变量(已经开始成为代码异味),你调用它 100 次。您的另一个选择是将这一切都放入一个数组中,因为这nameNNN也有点奇怪——集合的存在是有原因的。

于 2012-04-20T02:34:06.757 回答