将jstl列表传递给onclick事件下的javascript函数

时间:2013-04-10 15:03:10

标签: javascript jsp jstl

正如标题所说。 我从Controller获得了一个对象,其中一个属性是List。 现在我想将此List传递给外部文件javascript函数。

这样的事情:

<a href="#" onClick="showAuthorityOverlay(<c:out value='${userDetail.grantedAuthorityList}'/>)">[SHOW AUTHORITY]</a>

现在传递给javascript的值是这样的:

[ADMIN_USER,COMMON_USER]

所以,当我点击该链接时,我收到一条javascript错误说:

未定义ADMIN_USER。

这里有什么问题?是将ADMIN_USER和COMMON_USER作为变量名吗?或者是什么?有点奇怪。

甚至尝试在我的jsp中创建一个内部脚本来获取这样的列表:

<script type="text/javascript>
    function showAuthorityOverlay() {
          var obj = "<c:out value='${userDetail.grantedAuthorityList}'/>";
          sendToExternalJSFile(obj);
    }
</script>

但仍然得到相同的结果。看起来这些值没有作为List参数正确传递。

1 个答案:

答案 0 :(得分:4)

JSTL代码在服务器端执行。在这种情况下,它不是用于生成HTML,而是用于生成JavaScript代码(完全有效)。

列表的toString()方法,<c:out>调用,返回列表中每个Java对象的toString表示形式,用逗号分隔它们,并用括号括起来。最终结果是

[ADMIN_USER, COMMON_USER]

然后,浏览器会下载生成HTML + JavaScript,解释JavaScript代码:

showAuthorityOverlay([ADMIN_USER, COMMON_USER]);

这种情况(偶然)发生在语法上正确的JavaScript代码中。这意味着:使用JavaScript数组作为参数调用函数showAuthorityOverlay()。该数组包含两个JavaScript变量ADMIN_USERCOMMON_USER的值。

我认为你实际上想要一个JavaScript数组字符串,应该写成['ADMIN_USER', 'COMMON_USER']

您应该做的是将Java数组转换为控制器中的JSON字符串,然后在JavaScript代码中使用此JSON字符串:

showAuthorityOverlay(${jsonString})