2012-07-20 86 views
0

我試圖從我的Vaadin Portlet中調用一個javascript函數。從java中調用javascript函數

可以說我有一個HTML文件女巫位於我的項目;

homepage.html

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

在通過Vaadin Embedded Browser

我怎麼調用函數foo(絃樂味精)我的Java應用程序的

做我嵌在我的Portlet頁面需要導入/閱讀homepage.html文件,只需調用它或是我必須做的其他事情?

+0

您的Java應用程序在同一頁上是一個小程序嗎? – Thilo 2012-07-20 06:45:27

+0

@Thilo它更多一點,它是一個具有嵌入式瀏覽器的Portlet,瀏覽器實際上加載了HTML頁面 – Kiesa 2012-07-20 06:59:54

+0

帶嵌入式瀏覽器的portlet?你的意思是一個iframe(由訪問該portlet的瀏覽器加載)? – Thilo 2012-07-20 07:06:01

回答

1

首先您需要拿到劇本體; 那麼你可以用戶javax.script.ScriptEngineManager解決您的問題javax.script.*
僞代碼

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

然後,當腳本嘗試與它認爲是託管嵌入它的HTML的網絡瀏覽器進行交互時,會出現什麼問題。請注意,示例腳本顯示了alert()。在這種情況下應該做什麼? – Thilo 2012-07-20 07:07:44

+0

如果您的應用程序是applet,則可以在當前上下文中解析腳本和eval,如果您的應用程序是桌面應用程序,則可能需要嵌入webbrowser,如果您的應用程序是web項目,只需包含頁面或獲取腳本,然後寫入頁面 – ifree 2012-07-20 07:12:48

+0

顯然它是一個Vaadin portlet使用他們的WebEmbed組件:http://demo.vaadin.com/sampler#WebEmbed(我猜是一個iframe)。 – Thilo 2012-07-20 07:18:12

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瞭解更多詳情。