3

我正在使用 j2html 通过 Java 创建呈现 html 页面,如果 html 调用任何 javascript 函数,我将 Javascript 放入单独的 .js 文件中。但是,如果函数是多个页面使用的通用函数,则仅包含函数是主要应用程序 javascript 文件似乎是明智的。专门为一个页面编写的函数应该存储在其他地方,为每个页面创建单独的 .js 文件是一场管理噩梦,所以我想将它们放入调用代码附近的 html 本身。

我可以很容易地做到这一点,下面是通过直接从 .js 文件复制函数并包装在 j2htmls 脚本和 rawHtml 标记中创建的示例。我的问题是我的 Java 代码中的 Javascript 代码不像在单独的 js 文件中那样可读。

有什么方法可以让我以更简洁、更易读的方式编写它吗?

private Tag artwork()
{
  return script(rawHtml("function artwork() {\n" +
          "    \n" +
          "    select   = document.getElementById('fsArtwork');\n" +
          "    selected = select.options[select.selectedIndex].value;\n" +
          "    if(selected==0)\n" +
          "    {\n" +
          "    \tdocument.getElementById('saveArtworkFilename').disabled = true;\n" +
          "    }\n" +
          "    else\n" +
          "    {\n" +
          "    \tdocument.getElementById('saveArtworkFilename').disabled = false;\n" +
          "    }\n" +
          "}"));
}

在下面的评论中,我不断被问到为什么我不想使用模板,原因有很多:

我的网页目前没有使用模板创建,所以如果我想要一个包含一些 javascript 的 html 页面并按照建议使用模板,我将不得不使用模板重做整个页面

因为我不想以多种不同的方式编写我的 html,所以我有责任在模板中重做我的所有页面

那么为什么我一开始不使用模板呢?

首先,模板的主要优点是将 Web 开发人员的工作与服务器开发人员分开。我两者都做,所以对我来说没有优势。我使用单独的样式表,所以如果以后我希望网页设计师通过修改样式来改善外观,那么他们可以这样做,模板没有帮助。

另一个优点是代码可读性,这在将 jsps 与 servlet 代码进行比较时确实如此,但在与 j2html 相比时则不然。这个库确保我只能创建格式正确的代码,并且我可以利用 Java 来创建动态和基于数据的页面比模板更容易。

使用模板需要学习他们深奥的方法

使用模板会使构建和部署复杂化

从模板生成的网页比纯Java慢很多,从j2html网站你认为模板引擎太慢了。在 i5-4670 上,该索引页在不到一秒的时间内被渲染了 100 000 次。这比 Apache 'Velocity' 快一千倍(哈哈!)

尝试 Tipsy 的回答

当我尝试生成它抱怨的页面时

找不到 path='javascript/artwork.js' 的文件

我的代码包含现有的外部文件初始化和主类路径中的位置(新添加)。两者兼得好不好。

    staticFiles.externalLocation(Platform.getPlatformReportFolder().getPath());
staticFiles.location("");

scriptWithInlineFile_min("javascript/artwork.js"),

在包含清单的主 jar 文件 (songkong-4.13.jar) 中,javascript 文件位于 jar 中的顶级文件夹 javascript 文件夹中。

我确实注意到清单中的 songkong-4.13.jar 本身没有在类路径中列出,这从来都不是问题,但现在可能是问题吗?

同样在我的 Intellij 项目本身中,javascript 文件夹位于 src/main/resources 中,这似乎是默认设置,但它也无法在 IntelliJ 中运行。

现在在 Dev 工作

问题是我使用的是相对路径

scriptWithInlineFile_min("javascript/artwork.js")

代替

   scriptWithInlineFile_min("/javascript/artwork.js")

所以它现在可以在开发中使用。

但是当我构建它并在 dev 之外运行时,它不会再次找到该文件,即使它在主 jar 文件中直接作为 /javascript/artwork.js

进一步更新

这是 j2html https://github.com/tipsy/j2html/issues/84中的一个错误,但在 1.2.1 中已修复,我使用的是 1.2.0,现在一切正常。

总之

我不知道你是否会称之为模板,但对我来说非常有效。页面特定的 javascript 可以写在文件中,然后嵌入到呈现的 html 文件中,并且因为在主 jar 中,如果实际部署为标准文件,则不会出现额外的部署问题。

4

2 回答 2

3

我认为您应该在.js文件中编写 JavaScript。通过script().withScr("/path/to/file.js")(如果文件是托管的)或通过scriptWithInlineFile_min("/path/to/file.js")(如果您想从类路径/文件系统读取文件)包含它们。

于 2018-01-29T18:19:04.777 回答
0

(Delta 我几乎不记得 Java,而且我知道您不再需要某种 StringUtils 来加入。)

private Tag artwork() {
  String[] js = [
    "function artwork() {",
    "  select   = document.getElementById('fsArtwork');",
    "  selected = select.options[select.selectedIndex].value;",
    "  if (selected === 0) {",
    "    document.getElementById('saveArtworkFilename').disabled = true;",
    "  } else {",
    "    tdocument.getElementById('saveArtworkFilename').disabled = false;",
    "  }",
    "}"
  ];

  return script(rawHtml(StringUtils.join(js, "\n")));
}

但我仍然会将其放入模板中,加载并填充,然后将其发送给客户。任何合理的模板引擎生成的代码最终都会是这样。

于 2018-01-26T17:01:39.783 回答