2009-12-24 115 views
2

假設我們有Spring bean UserController,其範圍爲singletonJSF中的線程安全

我所有的進一步推理都基於我的假設,即「單例」範圍與應用範圍幾乎相似,即對於所有用戶我們只有一個實例。如果這是錯誤的假設,請告訴我。

因此,我們有一個網絡形式與幾個領域。兩名用戶同時填寫此表格。他們同時按提交按鈕。我們的UserController是這種形式的支持bean。

我的問題:是否有可能UserController中的部分字段包含來自第一個用戶的值,其餘字段將包含來自第二個用戶的值?

回答

2
  1. 你是對的singleton = application。 Spring的WebApplicationContext存儲在ServletContext中,所以它是一個應用程序。

  2. 您的控制器不應該是singleton範圍。它們應該是requestsession範圍。您的服務層應包括singleton小號

  3. 如果控制器singleton這是很肯定的是,整個事情會搞砸;)

+0

感謝您的回答。也許你還知道這些東西描述的一些文章?附:這不是'我的管理員',我只是在調查現有項目。 – Roman 2009-12-24 11:49:05

+0

這是一個很棒的how-to + spring + jsf + hibernate http://thelabdude.blogspot.com/2009/04/user-authentication-registration-with.html – Bozho 2009-12-24 11:52:41

+0

不錯的文章,有很多有用的東西。 – Roman 2009-12-24 12:46:54

0

你不應該使用範圍的單身/應用bean來處理每個請求/用戶輸入。

您可能需要一個請求作用域bean,您可以將該表單參數綁定到,然後可能將單例bean注入到該請求bean中,如果您需要單例bean中的某些內容(比如EntityManager)。

4

在MVC範例可以完美具有在應用範圍的控制器(如一個Servlet已經默認是)時,代表類只應該含有與請求相關聯的字段範圍的變量。你應該在方法塊中聲明它們。

因此不例如

public class Controller { 
    private SomeObject field; // Not threadsafe as this will be shared among all requests! 

    public void control(Request request, Response response) { 
     this.field = request.getSomething(); 
    } 
} 

但越是這樣

public class Controller { 
    public void control(Request request, Response response) { 
     SomeObject field = request.getSomething(); // Threadsafe. 
    } 
} 

View和相關聯的Action應處理的ThreadLocal,即聲明在方法塊中。例如。

public class Controller { 
    public void control(Request request, Response response) { 
     View view = new View(request, response); 
     Action action = ActionFactory.getAction(request); 
     action.execute(view); 
     view.navigate(); 
    } 
} 

Model的是在Action類進行處理,同樣在ThreadLocal的範圍。

public class SomeAction implements Action { 
    public void execute(View view) { 
     Model model = new Model(); 
     // ... 
    } 
} 

在你事實上JSF上下文只擁有Model類,這是在本質上沒有什麼比一個支持bean更多。ControllerView零件已由JSF處理,並且幫助FacesServlet控制請求/響應/生命週期/操作以及從JSF頁面構建的UIViewRoot。因此,對於請求作用域數據,您的JSF bean應該是請求作用域。

+0

看起來很明智。在描述的項目中,我看到了你的第一塊代碼的情況。 – Roman 2009-12-24 11:57:08