从java调用javascript函数

时间:2012-07-20 06:42:58

标签: java javascript vaadin jsni jsobject

我试图用我的Vaadin Portlet调用javascript函数。

假设我的项目中有一个HTML文件;

homepage.html

<html>  
   ...  
   <script type="text/javascript">  
   ...  
   function foo(String msg)   
   {  
      alert(msg);  
   }  
   ...  
  </script>  
   ...  
</html>  

通过Vaadin Embedded Browser

在我的Portlet中嵌入的页面

如何从我的java应用程序中调用函数foo(String msg)

我是否需要导入/阅读homepage.html文件并调用它,或者我需要做些什么?

3 个答案:

答案 0 :(得分:1)

首先你需要获得脚本体; 然后您可以使用javax.script.ScriptEngineManager来解决您的问题javax.script.*
伪代码

import javax.script.*;
ScriptEngine engine = 
            new ScriptEngineManager().getEngineByName("javascript");
String script = getScript(path_to_html);
            engine.eval(script);

答案 1 :(得分:1)

将外部javascript文件包含到Vaadin应用程序中的最简单方法是覆盖Application#writeAjaxPageHtmlVaadinScripts方法。

要从Vaadin服务器端代码调用javascript函数,请调用Window#executeJavascript

@Override
protected void writeAjaxPageHtmlVaadinScripts(Window window,
                                              String themeName, Application application, BufferedWriter page,
                                              String appUrl, String themeUri, String appId,
                                              HttpServletRequest request) throws ServletException, IOException {
  page.write("<script type=\"text/javascript\">\n");
  page.write("//<![CDATA[\n");
  page.write("document.write(\"<script language='javascript' src='" + appUrl + "/VAADIN/scripts/example.js'><\\/script>\");\n");
  page.write("//]]>\n</script>\n");
  super.writeAjaxPageHtmlVaadinScripts(window, themeName, application,
      page, appUrl, themeUri, appId, request);
}

注意:我从未使用Vaadin作为Portlet,但快速浏览表明这应该可行。

然而,这种方法相当简陋,只适用于快速破解/概念验证:如果你想要更复杂的东西,那么开发你自己的Vaadin小部件就是正确的方法。它为您提供GWT和JSNI的强大功能,并为您提供更精细的控制:有关更多详细信息,请参阅The Book Of Vaadin

答案 2 :(得分:0)