我正在使用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中没有额外的部署问题,如果实际部署为标准文件,则会有这些问题。
答案 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")));
}
但是我仍然把它放在模板中,加载并填充,并将其发送给客户端。任何合理的模板引擎生成的代码最终都会以此为基础。