如何将javascript注入Vaadin以支持插件

时间:2012-10-11 19:49:27

标签: vaadin

某些Vaadin插件,例如Invient Charts(https://vaadin.com/directory#addon/invient-charts),需要包含javascript库才能运行。

如何在不必为Vaadin应用程序创建自定义Servlet的情况下完成此操作?

3 个答案:

答案 0 :(得分:1)

使用Scaladin插件和Scala语言,这可以通过应用程序的init()方法中的以下代码来完成:

override def init() {
  super.init()

  // bring in javascript needed for addons
  val jqsrc = io.Source.fromInputStream(getClass.getResourceAsStream("/js/jquery-1.4.4.min.js"))
  val hcsrc = io.Source.fromInputStream(getClass.getResourceAsStream("/js/highcharts.js"))
  val xpsrc = io.Source.fromInputStream(getClass.getResourceAsStream("/js/modules/exporting.js"))
  mainWindow.executeJavaScript((jqsrc ++ hcsrc ++ xpsrc).mkString)
  jqsrc.close(); hcsrc.close(); xpsrc.close() }

请注意,作为InputStreams打开的javascript文件必须位于类路径中。要使用SBT执行此操作,请在src / main目录下创建资源目录,并将/ js目录和.js文件放在其中。这些将在构建war文件时放入WEB-INF / classes目录中。当你使用容器时,它们也会出现在类路径中:从xsbt web插件开始,所以相同的代码允许在制作.war文件之前进行测试。

这种方法应该可以在没有Scala的情况下工作(但是需要更多的Java代码),但那会有什么乐趣?

更有效的方法是将JavaScript代码加载到对象中保存的字符串中,以避免重复读取它:

object Script {
  val js = Seq("/js/jquery-1.4.4.min.js", "/js/highcharts.js", "/js/modules/exporting.js") map { f =>
    val in = io.Source.fromInputStream(getClass.getResourceAsStream(f))
    val s = in.mkString
    in.close()
    s
  }
}

然后在Vaadin申请中:

class MyApp extends Application(title = "My App", applicationTheme = "reindeer")  {
  override def init() {
    super.init()

    // bring in javascript needed for addons
    Script.js foreach mainWindow.executeJavaScript
  }
.
.
.

答案 1 :(得分:1)

没有扩展点可以向页面头部添加自定义资源。

无论如何,你可以添加内容模式CONTENT_RAW的标签和任何自定义内容,如JS / CSS。如果需要,您可以使用

将内容添加到头部

document.getElementsByTagName("head")[0].appendChild()

答案 2 :(得分:0)

在Vaadin 6中,您有两种选择:

  1. 您已经提到的选项:扩展Vaadin servlet

  2. 将文件包含在已编译的widgetset中:

  3. 在包含.gwt.xml文件和客户端目录的文件夹下创建一个名为public的directy。在此处将要包含的文件复制到widgetset中。这些文件很可能是js和css文件,也许还有一些图片。此directy下的所有文件都将复制到已编译的widgetset。

    如果你想在你的Vaadin应用程序中包含一个js文件,请将以下行添加到.gwt.xml文件中(src相对于公用文件夹):

    <script src="jquery/jquery.js" />