2014-04-07 37 views
3

我正在使用Vaadin和maven應用程序。我想要的是更改默認的HTML模板。 當我運行應用程序,生成的HTML看起來像這樣:如何更改Vaadin中的默認HTML模板

<html><head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<meta http-equiv="X-UA-Compatible" content="IE=10;chrome=1"> 
<style type="text/css">html, body {height:100%;margin:0;}</style> 
<link rel="shortcut icon" type="image/vnd.microsoft.icon" href="./VAADIN/themes/customBootstrap/favicon.ico"> 
<link rel="icon" type="image/vnd.microsoft.icon" href="./VAADIN/themes/customBootstrap/favicon.ico"> 
<link rel="stylesheet" type="text/css" href="./VAADIN/themes/customBootstrap/styles.css"><script type="text/javascript" 
... 

我想改變「元」屬性,添加「鏈接」,也可以添加一些其他的組件,如:

<!--[if lt IE 9]> 
    <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> 
    <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script> 
<![endif]--> 

Vaadin有沒有辦法做到這一點? 謝謝!

回答

4

創建擴展VaadinServlet一個特定的Servlet:

public class BootstrapServlet extends VaadinServlet { 

private static final long serialVersionUID = 1L; 

@Override 
protected void servletInitialized() throws ServletException { 
    super.servletInitialized(); 
    getService().addSessionInitListener(new SessionInitListener() { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public void sessionInit(SessionInitEvent event) { 
      event.getSession().addBootstrapListener(new BootstrapListener() { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public void modifyBootstrapFragment(
         BootstrapFragmentResponse response) { 

       } 

       @Override 
       public void modifyBootstrapPage(BootstrapPageResponse response) { 


        if(response.getRequest().getHeader("User-Agent").contains("MSIE 8.0")){ 

         response.getDocument().head().appendElement("script").attr("type", "text/javascript").attr("src", "https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"); 
         response.getDocument().head().appendElement("script").attr("type", "text/javascript").attr("src", "https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"); 

        } 
       }} 
      ); 
     } 
    }); 
    } 
} 

然後在web.xml從

<servlet> 
<servlet-name>myappname</servlet-name> 
<servlet-class>com.vaadin.server.VaadinServlet</servlet-class> 
... 

<servlet> 
<servlet-name>myappnam</servlet-name> 
<servlet-class>your.package.name.BootstrapServlet</servlet-class> 
... 

這不會更改添加默認的servlet

<!--[if lt IE 9]> 

但是,它會基於UserAgent是否爲IE 8而有條件地添加腳本。

僅供參考,我實際上試圖做同樣的事情,因爲我在我的項目中使用twitters Bootstrap,媒體查詢。這些腳本是否與Vaadin 7一起工作尚待觀察。

2

您是否試過@Theme("yourtheme")註解? -​​
這非常簡單,您只需將新主題複製到WEB-INF/VAADIN目錄。

您還可以使用@JavaScript("http://host.com/file1.js", "file2.js")}註釋將自定義JavaScript添加到您的元數據中。 Vaadin+Javascript

+0

是的,我做到了。問題是我不希望加載js文件,除非瀏覽器是IE8。所以我想控制整個HTML模板,這樣我就可以在頁面的「頭部」添加或修改任何東西。 – deltascience

0

我找到了一個臨時的解決辦法,但我認爲這不是一個好的做法:

首先創建一個js文件。 file.js:

$(document).ready(function() { 
$('head').append('<!--[if lt IE 9]>' 
      +'<script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"> </script>' 
      +'<script src=\"https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js\"></script>' 
      +'<![endif]-->'); 
}); 

在你Vaadin應用程序,你可以添加:

@JavaScript({ "vaadin://themes/YourTheme/js/file.js"}) 

它的工作,但並不如我所料。它可以在某些情況下幫助您,但如果您想在vaadin生成HTML之前檢測瀏覽器,則不會。