2016-09-14 123 views
1

我是JSP編程新手,正在爲家庭成員編寫Web應用程序。在我學習的過程中,我聽到很多關於JSP如何用於表示和Servlet是用於業務邏輯的信息。我的問題基本上是關於多遠,當我使用JSTL將是不好的做法。下面是一個例子:我有一個我的應用程序的登錄頁面,並且我正在使用c:if的自定義函數連接到我的java類來處理表單。這會被認爲是不好的MVC實踐,或者,因爲我只是從EL引用我的邏輯代碼,這是JSP的合法用法嗎?JSP和MVC最佳實踐

+1

JSP是一種較老的技術,是對Microsoft Active Server Pages的20世紀90年代的迴應。更現代的方法是使用HTML5,CSS3和JavaScript查看網頁; REST服務; HTTP servlets /控制器與客戶端進行交互。 – duffymo

+0

所以你會建議不要使用它們? –

+1

請不要接受這個建議。 HTML5,CSS3和JavaScript都很棒,但對於動態Java Web應用程序根本無法幫到你。聽起來就像你建立一個Java Web應用程序。使用JSP。否則,你會限制你可以做的事情。 – Shaggy

回答

4

你的問題包含了很多什麼是最佳實踐,它引發了很多意見和辯論,這在本論壇中通常會被忽視。一般來說,JSP是MVC中的「V」視圖,應該用來呈現由「M」odel提供的數據,這將是您的Java代碼。 「C」型推車經常分散在M和V之間(邀請更多的辯論,抱歉)。

您在JSP中放置的任何邏輯都無法查看給定的數據並決定如何呈現它,並將其移至模型。您的登錄頁面應僅收集憑證並將其呈現給模型,模型將依次以「無效」作出響應並重新申請憑據(或完全失敗),或者如果有效,則轉到下一頁。在實踐中,恕我直言,你不應該放置很多操作數據的代碼(除了格式化之外) - 創建表格條目,包裝鏈接等。不應該(恕我直言)查詢數據庫,執行計算等,在JSP中 - 讓模型做到這一點。

正如duffymo所言,JSP是舊的,但它們仍然有效。我建議你也考慮AngularJs(ng)(在閱讀關於V1 v。V2的爭議之後)。

4

JSP是一種過時的技術,只有很少的軟件仍在使用它。但如果你想使用它,我建議你使用Oracle Coding Standards。這個頁面應該給你一個你應該做什麼和不應該做什麼的清晰概念。

0

JSP的最佳實踐是完全不使用JSP。我會試着解釋爲什麼並且要清楚。

首先,我必須解釋一些根本就沒有JSP連接的東西,但它可以幫助您理解JSP技術的確切問題。

在函數式編程中有一個術語 - 純函數。這意味着它沒有副作用。另外,這樣的功能確保了對於每次使用相同輸入的調用,它總是返回相同的輸出總是。 在OOP函數中不純。它可能有副作用。它使我們的生活更加複雜。但重要的是,這些副作用只能發生在您的功能WITHIN。你可以調試它。或多或少是根據您的控制

讓我們想象一下我們寫在JSP作爲一個函數f與輸入功能,我和輸出端0:

O f(I) 
  1. 與JSP的第一個問題是,它有副作用,這種副作用會發生不僅在你的功能f裏面,還可以從外面影響它。一個簡單的例子:您使用tiles技術,您的jsp頁面被用作tile模板中的組件。此模板的另一個組件使用getOutputstream()方法並寫入此輸出流。但是應用程序可以在任何給定的響應中調用getOutputStream或getWriter,但不允許這兩者都執行。 JSP引擎使用getWriter,所以你不能調用getOutputStream。而你在你的JSP頁面工作得很好,當它是孤獨的:

    java.lang.IllegalStateException:getOutputStream方法()已經被調用,這種響應

getOutputStream() has already been called for this response

  • 使用函數可以顯式輸入參數。輸入始終清晰。此外,您可以使用常量,或者,如果您的功能有副作用,則可以使用其他服務來獲取要處理的數據。但它總是在你的功能之內,並且或多或少處於控制之下。使用JSP頁面,您根本沒有這種控制。輸入數據可以與不同的servlet/web組件進行會話,輸入的數據可以通過servlet和很多if語句放入請求範圍。您必須首先調查此servlet的邏輯。當您創建「Hello World!」程序時,這種額外的複雜性並不明顯,但是當您維護這些頁面時,這會讓您發瘋,這是幾年前寫的。
  • 我想你已經讀過混合輸出和邏輯不是一個好主意。 JSP允許人們這樣做。因爲它「非常方便」。
  • 你不能在你的jsp頁面中測試邏輯。或者這會讓它變得更加困難。
  • 您可以說正確使用jsp技術和應用最佳實踐可解決大部分問題。是。同意。但它永遠不會擺脫它的內部缺陷和複雜性。你總是必須檢查,真的開發者是否遵循最佳實踐?我們的日子裏有更好,更好的技術。

    注意:唯一的例外或用例,當我親自使用它:用於本地化。您沒有從服務器獲取所有消息。您不想讓服務器逐一獲取本地化的字符串。例如,您希望獲得一批值,這些值將用於您的Web表單。使用JSP + JS,您可以非常輕鬆地進行解析。