2015-01-15 38 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