第3.7式. 动态产生JavaScript
问题
你想要根据从应用模型获得的数据动态产生JavaScript。
动作要领
使用Struts 标签在你想要包含在HTML中的JavaScript 代码中渲染数据:
<script language="JavaScript">
function showMessage( ) {
alert( "Hello, <bean:write name='myForm' property='name'/>!" );
}
</script>
动作变化
上述方案产生了一个JavaScript 函数,弹出一个消息框,消息文本为"Hello, name!" name的值是使用bean:write标签产生的。此方案展示了使用Struts 标签创建JavaScript 和它们创建HTML一样的容易。
JSTL也可以按这种方式使用。
虽然这种方法很明显,但是很奇怪很多人都在问这个问题。通常问题还可能是:"我如何才能从Struts中调用HTML中的JavaScript 函数?" 技术上讲,你并不能从Struts调用一个HTML页面中的JavaScript 函数。Struts 和JSP 技术都运行在服务器端。相反,JavaScript确是在客户端的浏览器中处理的。但是,通过这里所述的动态产生JS的能力,基本上还是相当于所需的这个行为。
这个方法的一个重要基础是JSP的转换过程。JSP 页面由JSP 声明,标准JSP 标签 (比如jsp:useBean), 定制JSP 标签(比如Struts 和JSTP 标签), 运行是表达式,以及脚本小程序(scriptlets)组成。除此之外的其他东西都是模板文本(template text)。模板文本可以是任何不会被JSP转换处理的内容。人们通常会认为模板文本就是HTML 标记,但是它其实是JavaScript 或者其他非JSP 处理的文本。JSP 翻译器并不关心模板文本采用何种形式。因此,你可以象在HTML元素中产生文本一样容易地在JavaScript 函数中产生文本。
如果你使用JSP 来产生良构的(well-formed)XHTML, 那么动态JavaScript 模版文本必须使用jsp:text元素和CDATA section的方式结合来指定。具体信息参见Hans Bergsten的ONJava 文章:http://www.onjava.com/pub/a/onjava/2004/04/21/JSP2part3.html。
这里的例子仅仅列出了很简单的使用场景。如果要访问的模型数据需要使用复杂的JavaScript数据结构,比如,数组,你可以使用迭代标签,比如logic:iterate和c:forEach来组装这些结构。
相关动作
下一动3.8或会使用迭代标签来产生客户端的JavaScript 数组。