【问题标题】:What is the best practice to manage dynamic JavaScript from Java?从 Java 管理动态 JavaScript 的最佳实践是什么?
【发布时间】:2013-09-25 12:01:23
【问题描述】:

我正在用 JSP 开发一个网页,它使用大量来自 Java 后端类的动态生成的 JavaScript 代码。它是关于谷歌地图和一个名为 MarkerClusterer 的 JS 库。

目前这个类是通过在 Java 中处理 String 并将其直接打印到 JSP 页面来生成 JavaScript 代码,但是在 Java String 中编写 JS 并对其进行维护变得有点复杂。

JavaScript 一直需要大量修改,因为这个类被用于不同的项目。理想情况下,我想以一种可以用作库的方式打包它,而不需要进一步修改,所以这就是问题,最好的方法是什么?

这是部分代码:

public class JavascriptGenerator {

    public String gerarPorRegiao(String contextPath, List<Endereco> lista, boolean infoWindowEnabled) {
        String saida = "";

        saida += "<script type=\"text/javascript\" src=\"http://maps.google.com/maps/api/js?sensor=false\"></script>"
                + "<script type=\"text/javascript\" src=\""
                + contextPath
                + "/js/markerclusterer.js\"></script>"
                + "<script type=\"text/javascript\">"
                + "var map;";
        for(Estado e: Estado.values()) {
            saida += "var mc" + e.toString() + ";";
        }
                saida += "var selecionado;"
                + "var center = new google.maps.LatLng(-11.0, -51.9);"
                + "var geocoder = new google.maps.Geocoder();"
                + "var infowindow = new google.maps.InfoWindow();"
                + "var markerContent = new Array();"
                + "function geocoderInit() {"
...

【问题讨论】:

  • 从来没有一种最好的方式来做某事。只有最适合的方式。

标签: java javascript jsp markerclusterer


【解决方案1】:

我会说:不要。

不要动态生成 javascript。维护将是一场噩梦。将您的 js 保存在一个静态文件中,并使用 ajax 来获取您的数据。您的数据可以是 JSON 格式。 JSON 可以使用您可以下载的许多 JSON 库之一从对象层次结构中自动生成。

【讨论】:

  • 这在理论上似乎是一个不错且优雅的选择 - 除非您尝试在实践中实现它:) 如果您的页面上有几个 jQuery UI 元素中等复杂度(几个 jQuery 数据表和 Select2 , 和 ..),他们都开始使用 AJAX 下载数据,结果是你看到一个“逐渐”出现的页面——首先是这个数据表,然后是那个,然后选择“找到”它的选项,然后..“用户体验”受到影响,整个页面加载缓慢..
  • 我不同意,众所周知,如果页面上发生了某些事情,页面会更快地出现在人类面前。但我回答的核心是使用 json lib 来呈现数据。如果您愿意,可以将 json blob 放入脚本标记中。不会再难维护了。
  • "如果你希望你可以在脚本标签中放置一个 json blob" - 你可以(在 jsp 中)创建一个自定义标签,在 部分采用 javascript 格式。这是您的建议,还是您正在考虑更简单的方法?
【解决方案2】:

您可以做的一件事是,使用字符串缓冲区并将所有 java 脚本内容添加到其中。 然后将其写入一个以 .js 作为扩展名的文件。因此,这使您的脚本可维护

【讨论】:

    【解决方案3】:

    您可以编写一个单独的 JSP 文件来创建 javascript。然后 Javascript 的所有静态部分都将照常进行:

    var map;
    
    <% for(Estado e: Eastado.values()) { %>
    var mc<%=e.toString()%>;
    <% } %>
    
    var selecionado;
    ...
    

    这个 JSP 然后可以由您的其他 JSP 创建的 HTML 页面加载:

    <script type="text/JavaScript" src="path/to/jsp/file.jsp"></script>
    

    如果您的脚本需要访问数据,您可以通过 URL 传递参数:

    <script type="text/JavaScript" src="path/to/jsp/file.jsp?id=15"></script>
    

    然后,在脚本、过滤器或任何类似的东西中,您可以直接使用这些参数或使用它们从数据库加载数据等。

    【讨论】:

    • 我也在考虑这样的事情,但是如何将方法所需的变量传递给页面?也许我可以改用SESSIONPOST
    • 不知道你所说的 SESSION 和 POST 是什么意思。我认为行不通。您可以将 URL 参数传递给 JSP:path/to/jsp/file.jsp?id=17
    • 我按照你说的做了,只是我用了SESSION,因为它支持传递对象。您提到的 URL 参数称为GET,与SESSIONPOST 一起,它是Web 编程中将数据从一个页面传递到另一个页面的三种方式之一。如果您想了解更多信息,请阅读此处,这是一篇 PHP 文章,但每种网络语言都有:link
    • 将数据放在会话中意味着将其保存在服务器端。这意味着如果用户打开多个浏览器选项卡,因为所有选项卡共享一个会话,您可能会遇到问题。 POST 超出范围,因为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多