2015-01-15 36 views
0

我想了解春季Web範圍內的範圍。 我有我下面的配置文件中定義的bean稱爲球員:春季單身職業範圍不適用於網絡應用程序

<bean id="playerBean" class="com.anvesh.model.Player" scope="singleton"/> 

然後我的servlet充當RequestController(從JSP中所有提交的請求將通過這個servlet路線)。在這個servlet,我初始化如下所述彈簧配置文件:

XmlWebApplicationContext ctx = new XmlWebApplicationContext(); 
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml"); 
ctx.setServletContext(getServletContext()); 
ctx.refresh(); 

這個servlet處理兩種類型的請求 1)loginValidate 2)getFutureMatches

當「loginValidate」被調用我建立玩家豆和控制會去PlayerHomePage.jsp(如下)

player = ctx.getBean("playerBean",Player.class); 
player.setName("Anveshan"); 
player.setExp(10); 
player.setId(3175); 
player.setQualification("B.Tech"); 
System.out.println("In the validate Login :"+player); 
response.sendRedirect("/SpringRefernce_Scope/Jsp/PlayerHomePage.jsp"); 

在PlayerHomePage.jsp,我援引「getFutureMatches」行動。所以再次控制將來到RequestController,並在這裏,我試圖訪問像下面的球員豆

player = ctx.getBean("playerBean",Player.class); 

但我越來越玩家爲空。

因爲我已經將playerBean定義爲singleton,所以一旦它被實例化,當它在其他地方被調用時應該返回相同的bean。這發生在我使用ApplicationContext時正確地發生,但是當我使用XmlWebApplicationContext時,單身bea不被維護。

---當我使用範圍作爲會話/應用程序,那麼即使在「getFutureMatches」操作中我的播放器bean也不是NULLIFIED。我能夠獲得在提前請求中初始化的Player對象。但我不明白爲什麼singletion不這樣做。請幫幫我。

請注意,我沒有使用spring-mvc。我的web.xml條目如下:

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 

    <servlet> 
    <servlet-name>requestController</servlet-name> 
    <servlet-class>com.anvesh.servlet.RequestController</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>requestController</servlet-name> 
    <url-pattern>/RequestController</url-pattern> 
    </servlet-mapping> 
+0

如果你正在創建一個新的'Context',你將得到一個新的bean。只有使用相同的上下文時,纔會返回原始bean。 – Rohit

回答

0

因爲我一直的配置文件中的代碼初始化的POST方法,XmlWebApplicationContext初始化每次交的方法被調用。由於每次調用refresh()時,單例對象都會丟失。我將下面的初始化代碼移到了servlet的init()方法中。現在每次調用post()時都不會調用refresh(),因此singleton對象被保留。

XmlWebApplicationContext ctx = new XmlWebApplicationContext(); 
ctx.setConfigLocation("/WEB-INF/WebAppContext.xml"); 
ctx.setServletContext(getServletContext()); 
ctx.refresh(); 

我仍然不明白會話對象是如何維護的,即使每次都有ctx.refresh()。

+1

實際上,bean並沒有被破壞,每次創建新的上下文時都會得到新的bean。所以每次你會得到所有新的豆子。我不建議自己加載,而是建議刪除這些代碼,並在加載配置的web.xml中註冊一個'ContextLoaderListener'。在你的代碼中,你可以簡單地查詢上下文。另外你的代碼似乎有缺陷,因爲'Player'是一個單身人士,你網站的所有用戶都共享同一個實例。我不認爲這是你的預期用法。 –

+0

感謝Deinum,我將使用ContextLoaderListener,正如你所提到的那樣....上面的代碼只是我寫的測試單例請求和會話範圍的示例代碼,也是爲什麼我讓玩家成爲單身人士。它不是一個生產代碼。 – Anveshan