Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java创建可读Javascript以添加到html页面的最佳方法_Javascript_Java_J2html - Fatal编程技术网

用Java创建可读Javascript以添加到html页面的最佳方法

用Java创建可读Javascript以添加到html页面的最佳方法,javascript,java,j2html,Javascript,Java,J2html,我正在使用j2html通过Java创建呈现html页面,如果html调用了任何javascript函数,我会将javascript放入一个单独的.js文件中。但是,如果函数是由多个页面使用的通用函数,那么在主应用程序javascript文件中只包含函数似乎是明智的。专门为一个页面编写的函数应该存储在其他地方,为每个页面创建单独的.js文件是一个管理噩梦,因此我想将它们放在调用代码附近的html中 我可以很容易地做到这一点,下面是一个直接从.js文件复制函数并包装在j2htmls脚本和rawHtm

我正在使用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开发人员的工作与服务器开发人员的工作分开。我两者都在做,所以对我来说没有优势。我使用一个单独的样式表,所以如果以后我想让网页设计师通过修改样式来改善外观,那么他们可以这样做,模板没有帮助

另一个优点是代码可读性,这在将JSP与servlet代码进行比较时肯定是正确的,但在与j2html进行比较时则不是正确的。这个库确保我只能创建格式良好的代码,并且我可以利用Java来创建动态和基于数据的页面,这比创建模板要容易得多

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

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

从模板生成的网页要比纯Java慢得多,从j2html网站生成的网页你们认为模板引擎太慢了。在i5-4670上,此索引页在不到一秒钟的时间内呈现了100000次。这大约比Apache的“速度”快一千倍(哈!)

尝试酒鬼的答案

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

找不到路径为class='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中运行也不起作用

现在正在开发中工作

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

scriptWithInlineFile_min("javascript/artwork.js")
而不是

   scriptWithInlineFile_min("/javascript/artwork.js")
所以它现在在dev中工作

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

进一步更新

这在j2html中是一个bug,但在1.2.1中得到了修复,我使用的是1.2.0,现在一切都正常了

总之

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

(增量我几乎不记得Java,我知道您不再需要某种StringUtil来加入。)


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

我认为您应该在
.js
文件中编写JavaScript。通过
script().withScr(“/path/to/file.js”)
(如果文件是托管的),或者通过
scriptWithInlineFile\u min(“/path/to/file.js”)
(如果要从类路径/文件系统读取文件)。

是的,不要用Java编写HTML。把它放在一个模板中。Html不是问题,j2html工作得很好,比模板解决方案好得多,问题是特定于HtmlRelevant中的javascript;它仍然会进入浏览器,不管它是哪一个。你把它放在模板里。关于h2html是否“比模板化解决方案好得多”,这是一个观点,我不同意:我宁愿在一个HTML感知编辑器中编写HTML,并带有HTML属性补全等。无论是在这里还是在那里——任何时候,当你试图用另一种语言编写一种语言时,你最终都会遇到阻抗不匹配。将JS放在一个文件中,并发送文件内容.Html编辑器,对于基本静态网页来说很好,但是当您创建动态页面时,j2html比我尝试过的任何模板解决方案都要好,您应该尝试一下。无论如何,不相关的是使用html,因为我的答案是关于Javascript的,仍然属于一个文件。我制作的每个页面都是动态的,但有更简单的解决方案。¯_(ツ)_/因此,如果我理解正确,只要你的.js在主jar中,并且它的路径在该jar中相对于staticFiles.location()是有效的,那么生成的html页面将包含javascrip的内容
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")));
}