将服务器端数据传递给JavaScript——Scripplet或AJAX调用——这更好

Passing server side data to JavaScript - Scriplet or AJAX call - which is better?

本文关键字:Scripplet AJAX 调用 更好 JavaScript 数据 服务器端      更新时间:2023-09-26

在服务器端的属性文件中,我维护一个逗号分隔的单词列表。

words.for.js=some,comma,separated,words

我想用这些单词创建一个JavaScript数组。

var words = [some,comma,separated,words];

我想到了两个选项

1.使用JSP脚本,创建一个全局变量

<%  
    out.print("<script> var words = [");
    out.print( PropertyLoader.getAsCommaSeparated("words.for.js") );
    out.print(" ] </script>");
%>

2.公开一个服务/操作(即/getWords.do),并使用AJAX调用它并构造数组。

我不确定两者中哪一个更好,很感激你在这里的想法。或者有更好的方法吗?

谢谢。

编辑:

这也是全局JS变量(在选项1的情况下)与额外http请求(在选项2的情况下,哪一个更糟)的比较。我也想从这个角度了解你的想法。

我更喜欢在JSP的标记#1中嵌入服务器端数据。它速度更快,不需要回调。

对我来说,这一切都与数据的性质有关。在您的情况下,如果不重新启动服务器,该属性文件中的数据似乎不太可能更改。因此,保存一个额外的网络回调并将其嵌入到标记中对于全局变量来说是合适的。

如果您正在处理某种动态数据,那么ajax回调onload会更好。

通过http请求进行公开将是最优雅的选项,并允许刷新。无论如何,你已经指望浏览器有javascript了。

此外,如果值不是动态的,为什么不首先提供一个带有数组的静态javascript文件呢?

为什么不使用JSON?因为您只需要向前端发送一些字符串。类似这样的东西:

String [] s = {"test","test1"};
JSONArray array = new JSONArray();
array.put(s);
request.setAttribute("test", array);

JSP

<script>
  var array='${test}'
</script>

更新

您应该将您的配置放在servlet上下文中,因为它在整个web应用程序中都被访问,包括在jsp文件&在重新启动应用程序之前,也不会更改。

ServletContext context = getServletContext();
Properties prop= new Properties();
prop.load(context.getResourceAsStream("/WEB-INF/filename.properties"));
String[]configArray= prop.get("words.for.js").toString().split(",");
context.setAttribute("configArray", myConfigArray);

或者如果您使用ServletContextListener

ServletContext ctx = servletContextEvent.getServletContext();
ctx.setAttribute("configArray", myConfigArray);