在Java中创建可读Javascript以添加到html页面

时间:2018-01-25 13:13:33

标签: javascript java j2html

我正在使用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进行比较时则不然。这个lib确保我只能创建格式良好的代码,并且我可以利用Java来创建动态和基于数据的页面,这比模板更容易。

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

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

从模板生成的网页比纯Java慢得多,来自j2html网站您认为模板引擎太慢了。在i5-4670上,该索引页面在不到一秒的时间内呈现了10万次。这比Apache' Velocity'快了大约一千倍。 (哈!)

尝试Tipsy的回答

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

找不到包含路径的文件=' 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中没有额外的部署问题,如果实际部署为标准文件,则会有这些问题。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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")));
}

但是我仍然把它放在模板中,加载并填充,并将其发送给客户端。任何合理的模板引擎生成的代码最终都会以此为基础。