2011-09-02 66 views
1

使用自定義操作而不是scriptlet有什麼優勢(如果有的話)?標記庫與JSP中的scriptlet

例如,哪個在性能上更好?

<c:if test="${param.Clear}"> 
    <font color="#ff0000" size="+2"><strong> 
    You just cleared your shopping cart! 
    </strong><br>&nbsp;<br></font> 
</c:if> 

<%if (param.Clear){%> 
     <font color="#ff0000" size="+2"><strong> 
     You just cleared your shopping cart! 
     </strong><br>&nbsp;<br></font> 
<%}%> 

我有一個很大的JSP項目,我想知道是否需要使用標籤庫,或者如果我能保持我的Java小腳本。

此外,我想實現一些自定義標籤,這些標籤現在是使用Java,JavaScript,CSS和HTML代碼的單獨JSP文件。

+1

[如何避免JSP文件中的Java代碼?](http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files) – BalusC

回答

0

這就是爲什麼我認爲JSTL是更好的選擇。

  1. 使用JSTL更易於閱讀。
  2. 如果您在JSP中創建了一個方法,那麼只有該JSP可以使用它。所以可重用性也是其中之一。
  3. pageScoperequestScope對象使用${foo}和已經讀不request.getAttribute('foo')

缺點 - 有出頭你不能在JSTL做。

+0

它可能是重複的因爲您可以獲得有效的XML,所以更容易 – Hurda

2

就性能而言,它們都被編譯爲servlet,所以它們的性能應該不錯。

似乎有沒有多大推薦JSTL在你給的例子,但發生了什麼項目,我所看到的是如下代碼:

<%if (param1.Clear() && param2.isSomeFlagSet() && !param3.isSomeOtherFlagSet()){%> 
     <font color="#ff0000" size="+2"><strong> 
     You just cleared your shopping cart! 
     </strong><br>&nbsp;<br></font> 
<%}%> 

,它被複制全部結束。 > _ <如果你用機械方式替換JSTL,顯然你可以得到一些不錯的東西,但它給了你一個更好地組織事物的機會。

請遵循BalusC的建議,並儘可能地從JSP中刪除內聯Java代碼。

0

我寧可擺脫JSP ... 我已經使用JSP現在6至8年,它根本不值得使用。模板引擎可以讓您更好地轉身。

2

我喜歡JSP。我認爲它是Java頁面服務標記語言中最好的。它的主要缺點是,它不適用於諸如電子郵件之類的東西,因爲你不能只是將字符串和地圖傳遞給評估者,並像Velocity那樣獲得結果。

但是超出這個用例,JSP很棒。

要回答你的問題,你仍然可以保留你的scriptlet代碼。因爲「if」只是一個if,而c:if是一個方法調用,並且在調用標記時會加上一些環境參數,所以類似於scriptlet「if」和c:if標籤肯定會更快。

也就是說,這與速度差異造成的影響有多大是不同的問題。

大部分的代碼不應該在JSP中,顯然,邏輯應該主要在Servlet中,或者你在後端使用的任何東西,而JSP只包含渲染代碼(這當然可以涉及到IF和FOR等)

針對scriptlet的主要參數是JSP標記文件。標記文件是將JSP與其他JSP分開的東西。 JSP標籤文件使JSP可以重構,並且可以輕鬆添加新標籤。但缺點是,使用標籤文件時,您創建的任何標籤都不能在其邊界內包含scriptlet代碼。例如,如果您創建了「TABLE」標籤,則t:table和/ t:table元素之間的任何內容都不能包含scriptlet元素。然而,你當然可以在標籤文件實現中使用scriptlet代碼,所以我只需要包裝我需要的任何scriptlet。

您可以在這裏:JSP tricks to make templating easier?瞭解標籤文件的概述。但是我們遠遠超過了這裏。我們使用標籤文件定義表單和表格和組件以及各種東西。

0

您提出的兩個選項之間可能存在一些可忽略的性能差異,但我不認爲運行時性能實際上是Tag庫旨在解決的問題。

恕我直言,有效論據針對 scriptlets幾乎都是關於編碼,調試和維護的問題。 JSP被嘲笑了這麼久的主要原因之一不是關於JSP,而是關於人們如何使用它的更多。沒有什麼比在您的IDE中打開一個JSP(別人寫的)並且看到這個意大利麪代碼混雜了scriptlet和HTML更糟糕的了。如果你想在所有地方混合使用服務器端代碼和HTML,那麼你也可以用PHP編寫代碼! :)

使用Taglibs將使您的JSP方法更容易開始開發,更快速地調試和維護,從長遠來看。

我覺得小腳本是這樣一個糟糕的選擇,我總是喜歡開始一個新項目時,類似這樣的小片段的東西添加到我的web.xml文件:

<jsp-config> 
    <jsp-property-group> 
    <url-pattern>*.jsp</url-pattern> 
    <scripting-invalid>true</scripting-invalid> 
    </jsp-property-group> 
</jsp-config> 

這將關閉小腳本評估Web應用程序內部的JSP,迫使開發人員找到更好的選擇。

Taglibs的另一個重要論點是您將以更嚴格的方式進行編碼。例如,當您編寫Taglib時,您將不得不處理代碼中拋出的任何異常(這種或那種方式)。如果您在scriptlet中編寫相同的代碼,IDE或JSP編譯器將不會提示您將代碼包裝在try-catch塊中。懶惰/不專業的程序員可能會喜歡避免編寫幾行錯誤處理代碼。真正的程序員從經驗中得知,捕捉異常並在Java中正確處理它們比在JSP運行時拋出異常更容易,更乾淨和更健壯。同樣,如果你進入JUnit等,那麼單元測試taglib就非常簡單 - 根據定義,你可能不能真正單元測試一個JSP,最好你可以做一些集成測試。

另外,正如有人也提到,使用Taglibs有一個建築上的好處。代碼設計和重用因子有利於Taglibs。沒有簡單的方法來共享嵌入在JSP文件中的scriptlet代碼。所以你最終會在整個地方進行復制粘貼編碼。