在 Java 中创建可读 Java 脚本以添加到 html 页面的最佳方式
Best way to create readable Javascript in Java for adding to html page
我正在使用 j2html 通过 Java 创建呈现 html 页面,如果 html 调用了任何 javascript 函数,我将 Java脚本到一个单独的.js文件中。但是,如果主应用程序 javascript 文件是多个页面使用的通用函数,那么只包含函数似乎是明智的。专门为一个页面编写的函数应该存储在其他地方,为每个页面创建单独的 .js 文件是一个管理上的噩梦,所以我想将它们放入调用代码附近的 html 本身。
我可以很容易地做到这一点,下面是一个通过直接从 .js 文件复制函数并包装在 j2htmls 脚本和 rawHtml 标签中创建的示例。我的问题是 Java 我的 Java 代码中的脚本代码不像在单独的 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" +
"}"));
}
在下面的评论中不断有人问我为什么不想使用模板,原因有很多:
我的网页目前不是使用模板创建的,所以如果我想要一个 html 页面,其中包含一些 javascript 并按照建议使用模板,我将不得不重做整个页面模板
因为我不想以多种不同的方式编写我的 html,所以我有责任重做模板中的所有页面
那我为什么不首先使用模板呢?
首先,模板的主要优点是将 Web 开发人员的工作与服务器开发人员的工作分开。我两者都在做,所以对我来说没有优势。我使用单独的样式表,所以如果以后我希望网页设计师通过修改样式来改善外观,那么他们可以这样做,模板没有帮助。
另一个优点是代码的可读性,这在将 jsps 与 servlet 代码进行比较时确实如此,但在与 j2html 进行比较时则不然。这个库确保我只能创建格式良好的代码,并且我可以利用 Java 比模板更容易地创建动态和基于数据的页面。
使用模板需要学习他们深奥的方式
使用模板会使构建和部署复杂化
从模板生成的网页比纯 Java 慢得多,来自 j2html 网站 您认为模板引擎太慢了。此索引页面在 i5-4670 上在不到一秒的时间内被渲染了 100 000 次。这比 Apache 'Velocity'(哈!)
快大约一千倍
尝试 Tipsy 的回答
当我尝试生成它抱怨的页面时
找不到路径为='javascript/artwork.js'
的文件
我的代码包含现有的外部文件初始化和主类路径中的一个位置(新添加)。两者都可以吗
staticFiles.externalLocation(Platform.getPlatformReportFolder().getPath());
staticFiles.location("");
scriptWithInlineFile_min("javascript/artwork.js"),
在包含清单的主 jar 文件 (songkong-4.13.jar) 中,javascript 文件位于 javascript 文件夹中,该文件夹是 jar 中的顶级文件夹。
我确实注意到清单 songkong-4.13.jar 本身并未列在 Class-路径中,这从来都不是问题,但现在会成为问题吗?
同样在我的 Intellij 项目本身中,javascript 文件夹位于 src/main/resources 中,这似乎是默认设置,但它在 IntelliJ 中 运行ning 也不起作用。
现在在 Dev 工作
问题是我使用的是相对路径
scriptWithInlineFile_min("javascript/artwork.js")
而不是
scriptWithInlineFile_min("/javascript/artwork.js")
所以它现在可以在开发中使用了。
但是当我在 dev 之外构建它并且 运行 它没有再次找到该文件,即使它直接作为 /javascript/artwork.js
存在于主 jar 文件中
进一步更新
这是 j2html https://github.com/tipsy/j2html/issues/84 中的一个错误,但在 1.2.1 中已修复,我使用的是 1.2.0,现在一切正常。
总结
我不知道你是否会调用这个模板,但对我来说非常有用。页面特定 javascript 可以写入文件,然后嵌入到呈现的 html 文件中,因为在主 jar 中没有额外的部署问题,如果实际部署为标准文件,您会遇到这些问题。
(我几乎不记得 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")));
}
但我仍会将其放入模板中,加载并填充,然后将其发送给客户。随便一个合理的模板引擎生成的代码,反正到头来差不多就是这个样子。
我认为您应该将 JavaScript 写入 .js
文件。通过 script().withScr("/path/to/file.js")
(如果文件托管)或通过 scriptWithInlineFile_min("/path/to/file.js")
(如果您想从 classpath/file-system 读取文件)包括它们。
我正在使用 j2html 通过 Java 创建呈现 html 页面,如果 html 调用了任何 javascript 函数,我将 Java脚本到一个单独的.js文件中。但是,如果主应用程序 javascript 文件是多个页面使用的通用函数,那么只包含函数似乎是明智的。专门为一个页面编写的函数应该存储在其他地方,为每个页面创建单独的 .js 文件是一个管理上的噩梦,所以我想将它们放入调用代码附近的 html 本身。
我可以很容易地做到这一点,下面是一个通过直接从 .js 文件复制函数并包装在 j2htmls 脚本和 rawHtml 标签中创建的示例。我的问题是 Java 我的 Java 代码中的脚本代码不像在单独的 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" +
"}"));
}
在下面的评论中不断有人问我为什么不想使用模板,原因有很多:
我的网页目前不是使用模板创建的,所以如果我想要一个 html 页面,其中包含一些 javascript 并按照建议使用模板,我将不得不重做整个页面模板
因为我不想以多种不同的方式编写我的 html,所以我有责任重做模板中的所有页面
那我为什么不首先使用模板呢?
首先,模板的主要优点是将 Web 开发人员的工作与服务器开发人员的工作分开。我两者都在做,所以对我来说没有优势。我使用单独的样式表,所以如果以后我希望网页设计师通过修改样式来改善外观,那么他们可以这样做,模板没有帮助。
另一个优点是代码的可读性,这在将 jsps 与 servlet 代码进行比较时确实如此,但在与 j2html 进行比较时则不然。这个库确保我只能创建格式良好的代码,并且我可以利用 Java 比模板更容易地创建动态和基于数据的页面。
使用模板需要学习他们深奥的方式
使用模板会使构建和部署复杂化
从模板生成的网页比纯 Java 慢得多,来自 j2html 网站 您认为模板引擎太慢了。此索引页面在 i5-4670 上在不到一秒的时间内被渲染了 100 000 次。这比 Apache 'Velocity'(哈!)
快大约一千倍尝试 Tipsy 的回答
当我尝试生成它抱怨的页面时
找不到路径为='javascript/artwork.js'
的文件我的代码包含现有的外部文件初始化和主类路径中的一个位置(新添加)。两者都可以吗
staticFiles.externalLocation(Platform.getPlatformReportFolder().getPath());
staticFiles.location("");
scriptWithInlineFile_min("javascript/artwork.js"),
在包含清单的主 jar 文件 (songkong-4.13.jar) 中,javascript 文件位于 javascript 文件夹中,该文件夹是 jar 中的顶级文件夹。
我确实注意到清单 songkong-4.13.jar 本身并未列在 Class-路径中,这从来都不是问题,但现在会成为问题吗?
同样在我的 Intellij 项目本身中,javascript 文件夹位于 src/main/resources 中,这似乎是默认设置,但它在 IntelliJ 中 运行ning 也不起作用。
现在在 Dev 工作
问题是我使用的是相对路径
scriptWithInlineFile_min("javascript/artwork.js")
而不是
scriptWithInlineFile_min("/javascript/artwork.js")
所以它现在可以在开发中使用了。
但是当我在 dev 之外构建它并且 运行 它没有再次找到该文件,即使它直接作为 /javascript/artwork.js
存在于主 jar 文件中进一步更新
这是 j2html https://github.com/tipsy/j2html/issues/84 中的一个错误,但在 1.2.1 中已修复,我使用的是 1.2.0,现在一切正常。
总结
我不知道你是否会调用这个模板,但对我来说非常有用。页面特定 javascript 可以写入文件,然后嵌入到呈现的 html 文件中,因为在主 jar 中没有额外的部署问题,如果实际部署为标准文件,您会遇到这些问题。
(我几乎不记得 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")));
}
但我仍会将其放入模板中,加载并填充,然后将其发送给客户。随便一个合理的模板引擎生成的代码,反正到头来差不多就是这个样子。
我认为您应该将 JavaScript 写入 .js
文件。通过 script().withScr("/path/to/file.js")
(如果文件托管)或通过 scriptWithInlineFile_min("/path/to/file.js")
(如果您想从 classpath/file-system 读取文件)包括它们。