【问题标题】:How do you minify/obfuscate JavaScript code in a JSP that has JSP/JSTL variables mixed into it?在混有 JSP/JSTL 变量的 JSP 中,如何缩小/混淆 JavaScript 代码?
【发布时间】:2011-05-14 00:29:11
【问题描述】:

arrays.jsp:

//...
var x = <c:out value="${x}"/>
<c:if test="${empty doExternal}">
processExternalArrays();
</c:if>
//...

我想缩小/混淆包含在一个大型 JSP 文件中的 JavaScript,其中许多 JSP/JSTL 变量混合到 JavaScript 代码中,例如上面的 sn-p。

代码依赖于使用服务器端逻辑填充的变量,然后传递给客户端代码,如上所述。

我已经在使用 YUI 压缩器缩小我的 JS 文件,但我不知道如何处理我的 JSP 中的 JavaScript 代码。

鉴于此代码是动态创建的,是否可以缩小/混淆它?

【问题讨论】:

  • 您必须拥有某种服务器设施才能即时执行此操作;但是,您的页面上真的有足够的代码来证明它的合理性吗?
  • 不确定在服务器上即时执行此操作是什么意思。 (是的。有很多代码。)
  • 好吧,与其将所有代码保留在页面上,不如尽可能多地提取到单独的 .js 文件中。您将保留在页面上的将是最少数量的 JSP 处理的变量声明。您单独的 .js 文件只会通过在每个页面上找到它们来访问它们。
  • 将 JS 分离到一个单独的文件中会很好......但似乎需要做很多工作和额外的测试......但是,不要继续编写生成动态 javascript 语句的代码。您应该转向使用数据的静态 js,而不是使用服务器端语言动态生成数据,将单独的部分放在不同的地方。
  • @Oscar:你找到解决方案了吗?

标签: java javascript jsp jstl obfuscation


【解决方案1】:

可能对您来说最好的解决方案是使用 Granule JSP 标签。 您可以在以下位置下载它 http://code.google.com/p/granule/

代码示例是:

<g:compress>
  <script type="text/javascript" src="common.js"/>
  <script type="text/javascript" src="closure/goog/base.js"/>
  <script>
       goog.require('goog.dom');
       goog.require('goog.date');
       goog.require('goog.ui.DatePicker');
  </script>
  <script type="text/javascript">
      var dp = new goog.ui.DatePicker();
      dp.render(document.getElementById('datepicker'));
  </script>
</g:compress>
...

【讨论】:

    【解决方案2】:

    你看过htmlcompressor吗?简而言之,它是一个:

    Java HTML/XML Compressor 是一个非常 小型、快速且易于使用的库 缩小给定的 HTML 或 XML 源 通过删除多余的空格, cmets 和其他不需要的字符 不破坏内容 结构。

    它的主要功能是压缩 HTML 和 XML,但它还带有 JSP 标签,可用于利用 YUI Compressor 压缩内联 JavaScript 块。查看 Google 代码页面,尤其是 Compressing selective content in JSP pages 部分。

    【讨论】:

    • YUI 压缩器无法处理嵌入在 Javascript 代码本身中的 JSP 标签。在 OP 描述的场景中,您的 HTML 页面包含内联 Javascript 片段,而这些片段又包含嵌入的 JSP 标记。当 htmlcompressor 调用 YUI 压缩 Javascript 片段时,YUI 将无法处理嵌入的 JSP 标签。
    • @Grodriguez 是的。这是我发布此答案时忽略的内容。不过,我认为 OP 可能能够使用 taglib,所以我认为仍然值得在这里保留这个答案。真正的解决方案是不动态生成一堆 JavaScript,而是将数据生成为 JavaScript 对象并将其传递给静态 JavaScript 代码,正如 Juan Mendes 在 OP cmets 中提到的那样。
    【解决方案3】:

    除了借助 Ajaxical 功能结合 Servlet 将工作完全委托给纯 JS 之外,我没有看到其他方法,该 Servlet 在 Ajax 请求中返回所需的信息(以 JSON 的形式?)。

    例如在 Servlet 中

    Map<String, Object> data = new HashMap<String, Object>();
    data.put("doExternal", doExternal);
    data.put("x", x);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(new Gson().toJson(data)); // Gson is a Java-JSON converter.
    

    在 JS 中(几乎没有 jQuery 的帮助,因为它使 Ajax 的工作不那么冗长)

    $.getJSON('servleturl', function(data) {
        var x = data.x;
        if (!data.doExternal) {
            processExternalArrays();
        }
    });
    

    这样你就可以得到干净的 JS,没有服务器端特定的混乱。

    【讨论】:

      【解决方案4】:

      确保您的输出是 gzip 编码的 (apache mod_deflate)。首先最小化 html/js 可能会使其更小,但不会太多。

      【讨论】:

        【解决方案5】:

        如果您不能或不想将 JavaScript 从 HTML 中移出,一种可能性是创建一个标签处理程序来包装您的 &lt;script&gt; 标签的内容:

        <script type="text/javascript"><js:compress>
            ...
        </js:compress></script>
        

        处理程序可能会扩展SimpleTagSupport。然后,您必须研究用于压缩器/压缩器的 Java API,例如 YUI Compressor 或 dojo ShrinkSafe,并使用它们来处理标签正文。

        编辑:对不起,我浏览了其他答案,似乎 Zack Mulgrew 可能引用了一个标签库,该标签库已经完全符合我的建议......

        Edit2:是的,JavaScriptCompressorTag。猜猜我必须对他的回答投赞成票;-)...

        【讨论】:

          猜你喜欢
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          • 2011-10-23
          • 1970-01-01
          • 2021-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多