2012-06-20 45 views
0

我已經做了一些php開發,並且這種語言的大趨勢是使用諸如smarty或其他模板引擎之類的東西。使用jsp/taglibs與模板引擎

它通常運行大致如下:

加載模板作爲一個普通字符串, 查找其{}標籤與 的一些代碼的結果替換每個{標籤}。 緩存頁面輸入參數 渲染結果頁面。 (有時也加一些OO原則,如模板成爲一個對象...)

當我看着jsp的,我看到scriplets的使用,標籤庫與複雜的事情像

<%@ taglib uri="/tags/struts-logic" prefix="logic" %> 
<%@ page import="ghhghjjgj"%> 

則:

<logic:if>some html </logic:if> 

或者更糟:

<%= if (blabal) {%> 
some html 
<%}else ...%> 

等等。

好,地磚讓我有些jsp頁面粘合起來,一起是非常方便的(如在PHP中包括那種)

這在我看來,PHP的辦法是在方式要好得多:

  • 它完全分開gui和模型處理。
    - 當您在處理背後部分時,更改頁面內容更容易, 您處於真正的java類中,沒有像%@ <%=這樣複雜的東西。 (誰說後面ALA C# 代碼;))

的C#approah是非常有趣的很好,但我只是想解決的模板部分中我的問題並沒有啓動任何C#和Java巨魔戰爭? 我也不想說php是更好的。

我只想知道爲什麼在java中沒有安裝好的模板引擎,爲什麼我們仍然使用scriplets/taglibs。

所以我想我一定會錯過一些東西。 某些Java EE Web專家可以告訴我我推理的缺陷嗎?

+0

看起來你有正確的想法縮進你的代碼4個空格。但是,您還需要在代碼和上面的段落之間留出空白行,以便將其正確識別爲代碼。 –

+0

好的,謝謝你的提示:) –

回答

3

J2EE很早以前就成爲了Java EE。放下「2」。

沒有人應該使用scriptlets。這是1999年的技術。如果你在書本上看到它,那是因爲書很舊。現在編寫另一個servlet/JSP書籍沒有太多好的理由。

定製標籤庫已經失寵。 JSTL是標準。你不太可能需要更多的東西。

模板很常見 - 看看Velocity。我正在處理的一個項目專門用於將HTML流式傳輸到瀏覽器。

+0

爲了清晰起見進行了編輯。我應該說「自定義」標籤庫。 – duffymo

+0

+1對於JSTL的澄清 – maksimov

0

例如,Java,Velocity有很多模板引擎。 JSP編譯爲Java字節碼。它允許非常快速的執行。這個因素是否對你很重要,取決於你的任務,對於大多數網站來說,模板處理不會是一個問題。

+0

尤其是因爲JSP可以被預編譯。無需支付首次使用的罰款。 – duffymo

0

我真的不明白的影響,爲什麼我們很高興地寫

{if blabal} some html{/if} 

並沒有那麼好寫

<logic:if test="blabal"> some html</logic:if> 

而且更糟糕的是寫

<% if (blabal) { %> some html <% } %> 

但很好寫

#if (blabal) 
    some html 
#end 

我個人喜歡在java中編寫我的邏輯。

  • 類型保存
  • 我知道的語法

但是,對我來說這不是語法的問題wheter混合模板代碼和邏輯是好事還是壞事。因此我更喜歡Snippetory。我從模板中獲取邏輯,同時保持模板中的一致性(ecaping東西等),外觀(formatting ...)和internationalization的責任。綁定邏輯可以測試,易於組織和重用。數據模型可以按原樣使用,不需要將其轉換爲足夠用於某種外來技術的模型。在這種情況下,模板是一種模式,您可以在其中複製必要的數據,而不是從上下文中自我服務的流程。

現在,在這種情況下,我們需要用軟件來表達同樣的東西,因爲它總是在使用separation of concerns的原理來使軟件更易維護。

模板:

<t:named-region> some html with a {v:value} </t:named-region> 

邏輯:

if (blabal) { 
    template.get("named-region").set("value", value).render(); 
} 

現在,我們看看這個,這是相當多的代碼。這也是典型的關注問題。但是,快速查看步驟可能有意義:

  1. 訪問該區域已獲得。
  2. 數據綁定到模板。這種情況發生的很好,就像填寫一張。
  3. 完成的表單綁定到輸出。

最後一步似乎有點dispenseable的。我向它填充數據,所以很明顯我想使用它。但是你必須知道,render()render(template, "named-region")的捷徑。所以這是一個詳細描述它是如何使用。由於這種機制,您可以輕鬆地將一個文件或甚至多個文件的構建塊組合到您的選擇輸出中。這導致這些塊的重複使用非常方便。

而且它獲得我重點:當我激烈戰鬥來獲得HTML,CSS和我沒有處理用JavaScript權「是如何訪問數據的準確路徑?'或'該按鈕顯示的確切情況是什麼?'。這只是'有邏輯,所以它有一個名字'。非常簡單,很乾淨。

當然,還有一些其他的引擎支持模板和邏輯的分離,比如jByte(我用了一段時間)或JTPL來命名視圖。然而,他們都似乎缺乏一些功能,但我決定編寫Snippetory。