2013-10-20 17 views
2

我知道JSP符合這個描述,但我正在尋找更現代的選擇。哪些web框架,html模板語言,其他的JSP提供編譯時綁定?

不幸的是,似乎大多數現代語言和框架都是動態類型的,甚至是基於Java的語言和框架。

相關問題(JSP是這裏唯一的答案):Are there any web frameworks for JVM with data binding checked at compilation time?

+0

如何處理python/php/groovy還是隻需要java? – Papasmile

+0

這3個都不會在編譯時給你靜態類型的綁定,因爲它們是動態解釋語言。或者我錯過了什麼? –

+0

對不起,現在重新閱讀「鍵入的綁定」... ... – Papasmile

回答

2

這是一個相當古老的問題,但我有一個答案,因爲我已經實現static-mustache library以提供基於鬍子句法的類型安全模板引擎。

它在編譯時檢查語法錯誤和類型錯誤(如缺少屬性)。它需要零構建配置,因爲它是標準的註釋處理器。

模板保持純粹的鬍鬚模板,其中包含從用於渲染的普通Java類中提取的所有類型信息。

+0

3年來令人驚歎的第一個正確答案!謝謝 –

+0

在發佈我的問題3年後,PHP代碼已經在Spring MVC中用Thymeleaf重寫了。 Thymeleaf是非常好的(瀏覽器中的無服務器測試對UI實現來說是一個巨大的生產力提升),但編譯時綁定的缺乏仍然困擾着我。現在,如果有人可以創建一個Static-Thymeleaf ......那太棒了! –

1

首先,JSP是Java企業版中的2.1版本;換句話說,大多數語言都是現代化的。

現在,如果想要獲得高科技,那麼在編譯時如何使用java.lang.instrument檢查所有bean的類型?掃描你的映射和(你選擇的任何語言)模板,並檢查字段名稱=這樣和那樣的類型,一個接一個。 http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/package-summary.html

+0

我可以用PHP做到這一點,使用內置的標記器掃描模板,以查找數據類中未定義的符號。但是,這是一個重寫,我想讓事情變得更簡單,不會比現在更糟糕。編寫源代碼掃描程序肯定比它需要的更復雜。你是對的JSP自從我上次使用它以來已經有了一點變化,謝謝指出。 –

1

我必須提前道歉,因爲我不太明白這個問題,但是......我把我用過並喜歡的2個模板引擎名稱扔掉了,也許他們會做你所需要的。

Dust

Mustache

1

這是一個有趣的問題。我假定靜態類型檢查對於從數據庫中存儲和檢索的數據是必需的,因爲任何非數據都將在運行時生成,而不是編譯時生成。 SQL(和大多數其他關係數據庫)提供了什麼語言編寫者調用靜態類型檢查,對存儲的數據進行細粒度控制,因此似乎需要一個Web框架來確保存儲的數據類型和檢索方式之間的嚴格映射進入框架。

我有一些使用Hibernate與Spring框架,Spring Web MVC用於呈現模板和將數據存儲在MySQL數據庫中的經驗。

用於休眠的實體定義可以類似於以下內容:(有很多的變化)

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
@Table(name = "layoutItem", schema = "ivb") 
public abstract class LayoutItem implements Serializable, DisplayItemInf { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private long id; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="LayoutSize") 
    private LayoutSize size; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="LayoutPosition") 
    private LayoutPosition position; 

    @Column(name = "display") 
    private int display; 

    @Column(name = "styleItem") 
    private String styleItem; 

    private String CSSclass = ""; 

    public void addClass(String CSSclass) { 
    this.CSSclass = CSSclass+" "; 
    } 

    ...other getter and setter definitions... 

} 

所有字段中給出的靜態數據類型,休眠然後映射這些到對應類型中的字段MySql表。使用Spring的優點是它們提供了一個名爲The Spring Tool Suite的Eclipse版本,每次保存文件時都會重新編譯相關的類並重新部署到本地運行的服務器。如果在到數據庫的實體映射中發生任何問題,這將會引發Type錯誤。 Hibernate提供了許多控制類型的註釋,並且與SQL提供的一樣細緻。

在框架內創建了幾個不同的層,數據訪問層位於堆棧的底部,業務邏輯和網站表示層次更高。這種創建框架的更分層的方法意味着在執行業務邏輯之前,數據被嚴格地鍵入堆棧的底部,然後傳遞到更鬆散類型的MVC部分以呈現給模板(例如JSP)並顯示爲一個網頁。

這種方法對於您的情況是否正確,我想是需要仔細評估的。與Django相比,恕我直言,Spring是一個相當重的解決方案(它也有實體,雖然沒有嚴格映射),或Ruby On Rails(沒有經驗:)。可能還有其他一些方法將Hibernate與靜態類型和JSP模板結合起來,儘管使用STS的好處對於Spring來說絕對是一個優點。Lift使用嚴格類型的Scala語言,並且也運行在JVM上,它不像Spring那麼重,所以可能會更快部署。

0

如果您想要在JVM之外創業,您可以使用帶有Razor視圖的Asp.Net MVC,所有編譯時檢查您可以請求的強類型視圖。作爲獎勵,您可以獲得極大的智能感知和重構能力。

相關問題