2009-10-27 59 views
0

我在servlet中創建靜態類,這些類是Web頁面的控制器。通過控制器URL將請求重定向到控制器,這些控制器URL位於包含所有控制器的靜態HashMap中。用戶/會話實現的東西是否有可能與其他用戶會話混淆的可能性?當然,我會將所有與會話相關的數據保存到HttpSession中,並在調用控制器請求處理程序時向控制器發送請求,響應和HttpSession對象。Servlet中的靜態類

UPDATE:

這裏是例子:

public class MainControllerServlet extends HttpServlet { 
static HashMap<String, ControllerAbstract> controllers = new HashMap<String, ControllerAbstract>(); 

    public MainControllerServlet() 
    { 
     controllers.put("url", new Controller()); 
    } 

} 

ControllerAbstract:

public abstract class ControllerAbstract { 
    private String url; 
    private HashMap<String, ControllerAbstract> children = new HashMap<String, ControllerAbstract>(); 

    public abstract void handleRequest(HttpServletRequest request, HttpServletResponse response, SessionBean session, String type) throws Exception; 

} 
+0

你應該只是發佈代碼,所以我們可以看看 – 2009-10-27 12:41:20

+0

它不是完整的代碼,但只是你需要看到的部分... – newbie 2009-10-27 12:54:22

+1

有點你的話題...但你看看春天(http://springsource.org),因爲它似乎是在嘗試像Spring MVC一樣寫東西。只是一個建議。 – cjstehno 2009-10-27 12:59:47

回答

1

它從你的代碼看起來像你使用靜態哈希表,而不是靜態類,所以你在所有用戶之間共享地圖。我看到有幾個問題 -

  • 您的地圖不是線程安全的,這可能是對象創建和檢索之間的衝突問題。考慮到潛在的共享/線程問題,您還將其他地方放入地圖?
  • 您的ControllerAbstract對象具有狀態,並且您可能會遇到多個請求將使用同一控制器的情況。例如,是否將任何請求添加到其自己的ControllerAbstract對象中的子哈希映射?您可以使用相同的ControllerAbstract進行多個請求 - 例如如果請求1想要添加或刪除它的ControllerAbstract.children映射,而請求2引用相同的對象則決定需要迭代子對象,您將得到ConcurrentModificationException。
  • Servlet構造由容器管理。如果您將必須對url進行硬編碼以使其存在於servlet的構造函數中,它是否只是一個常量字符串?如果是這樣,將ControllerAbstract對象中的常量聲明爲不是更容易?如果不是,它從哪裏來?無論如何,只要容器決定需要創建一個新的servlet,你所做的就是改變控制器的映射。
+0

什麼可能是線程安全的控制器存儲選擇?或者我應該通過Url的呼叫控制器?例如/ site_url/controller_url/=> controller_urlController(Class name)並通過類名創建一個新的類? – newbie 2009-10-27 13:48:49

1

據我記得一個靜態類無非是一個嵌套類的更多。所以我不明白爲什麼它應該比正常的公開課不同。

2

你的意思是靜態引用?沒有像靜態類這樣的東西,除非它們是內部類,但它們沒有靜態行爲。 如果您使用靜態引用作爲控制器,則需要關心這些控制器中的所有屬性。

+0

你似乎已經知道它,但寫「沒有像靜態類這樣的事情」是有點不幸... – 2009-10-27 12:42:26

1

靜態內部類的行爲與正常類完全相同,它們只是有一個額外的範圍。也就是說,如果通過在外部類中使用靜態變量來共享類之間的狀態,那麼這可能會導致問題。假設你已經說過你只會使用HttpSession對象在調用之間傳遞數據,那麼這對你來說不會有問題。

2

靜態內部類是另一個包中正常類的替代方法。所以你不必擔心它們會與你的servlet類混淆。

因爲你調用.handleRequest()方法爲servlet調用的結果,必須確保你的控制器的實現是重入。即他們的執行不應該使用棧以外的變量存儲和作爲參數傳遞的對象。

也就是說,我會選擇將控制器放在包含servlet的包之外的包中。然後,您可以添加一個擁有並初始化映射的管理器類,並處理來自servlet的調用(抽象實現細節)。

+0

所有的控制器都是在servlet的構造函數中創建的,稍後將不會更新或修改這些控制器 – newbie 2009-10-27 13:39:46

1

你在做什麼對我來說看起來好。只要確保在Controller實現中不存儲任何成員變量。我還假設你只是在Servlet實例化時將對象放入控制器映射中。