2010-09-22 39 views
1

這是我遇到的一類問題的例子。生成網頁時使用多態嗎?

當用戶有兩種可能涉及到我的應用程序的主頁,他/她是:登錄

  • 沒有登錄

    1. 如果用戶登錄我想在右上角顯示用戶名和一個說「註銷」的鏈接。如果用戶沒有登錄,我想顯示「登錄或註冊」鏈接。

      此前我會從JSP中調用一些代碼,它會返回一段適當的HTML代碼,我會將其粘貼到頁面中。但這可能不是最好的做法,雖然它很簡單。

      現在我相信我應該將首頁的初始請求發送給一個servlet(而不是jsp),它將實例化一些類型爲「HomePage」的對象,它具有子類「LoggedInHomePage」和「NotLoggedInHomePage」,具體取決於用戶id在會話變量中可用。我將不得不用if或case語句來確定正確的構造函數。

      到目前爲止看起來整潔。但是在這一點上它又變得混亂了,因爲我現在需要知道我的「Request對象」中是否提供了userId,我需要使用一些if語句,或者我使用了不同的jsp模板,這意味着有兩個幾乎相同的jsps坐在服務器上爲每一頁。

      既不顯得優雅。最受讚賞的幫助。如果你對這個問題有一個很好的解決方案,請忽略我的描述,並且說出來,我不介意把我在這裏提出的任何想法扔掉。

    回答

    1

    一種可能的解決方案:

    添加方法原型HomePage。叫它getNavigationArea()getNavigationLinks()(說)。該方法將返回一組可用合適的HTML呈現的一組Link對象。

    LoggedInHomePageNotLoggedInHomePage都會覆蓋此方法。前者的實現將提供一個Link實例,該實例表示「註銷」,而後者將提供一個表示「註冊/註冊」的實例。

    JSP將呈現導航區域而不知道其內容是什麼。這樣,您將只有一個JSP頁面,而不考慮用戶狀態。你也可以添加其他類型的用戶,比如說RegularUser,AdminUser等,不同的導航選項無需添加新的JSP頁面。

    +0

    感謝我將做的一個改變是我將返回一個鏈接對象列表,因爲問題是在一種情況下我有一個單一的鏈接(註冊),在另一種情況下,我有兩個鏈接(用戶名,註銷)。謝謝。 – Ankur 2010-09-22 10:05:54

    3

    我會簡單地創建一個主頁,一個登錄組件,其職責是顯示當前狀態,並在登錄時進行必要的身份驗證。

    這是一個「有」關係,而不是'是'

    +0

    是的,我同意它是「有」不是「是」..會使事物屬性而不是子類。 – Ankur 2010-09-22 10:08:14

    +0

    這是類似於有一個頁眉/頁腳/左/右區域本身是一個jsp,然後使其處理登錄邏輯。所有的頁面都是由這個登錄JSP組成的? – 2010-09-23 10:24:13

    +0

    這是我所提供的最佳選擇。簡單而優雅。 – EricBoersma 2010-09-23 19:31:51