2011-10-10 60 views
0

我有一个用JSF2编写的使用Spring的Web应用程序。我需要创建一个作为JSF HTTP会话包装的bean并在内部使用它。对我来说,将HttpSession对象注入到该bean的定义中并将该bean的范围限定在会话中似乎是合乎逻辑的。但是我找不到在context.xml文件中定义注入的方法。是否有可能做到这一点,是否适得其反,有没有更好的办法?我想要的只是在该bean中拥有当前会话。如果有一个静态方法来获得会话(类似于ASP.NET中的HttpContext.Current.Session),它也会很有用。提前致谢。有没有在JSF应用程序中用Spring注入HttpSession的方法?

回答

1

我不知道的弹簧片(我不使用它,我只使用了标准的Java EE 6 API),但你可以通过ExternalContext#getSession()得到HttpSession在静态情况下JSF如下:

HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true); 

你可以在bean的(后)构造函数中做到这一点。

+0

谢谢,我想这是JSF替代ASP.NET的HttpContext.Current.Session。它对我来说工作得很好,甚至更好 - 我不需要将我的bean范围限定在会话中,因为它会始终静态获取它,这样我就可以拥有一个bean实例。当然,我不能在会话之外保留与当前会话内容相关的任何状态,以便该bean保持某种程度上的无状态。 –

+0

不客气。我必须承认,这个要求对我来说没有多大意义。我认为一个简单的会话范围的托管bean是绰绰有余的。将会话数据存储在那里,而不是试图包装'HttpSession'。 – BalusC

+0

我知道,但我的想法是强制到某个界面;换句话说,这个bean实现了一个接口,并且会被这个接口暴露出来,它不知道也不能依赖于Web技术和HTTP会话。 –

1

如果你是在一个Spring管理的处理方法,你可以简单地将HttpSession对象添加到您的处理的方法签名和Spring会自动注入,如下所示:

@RequestMapping("/myhandler.do") 
public String myHandler(HttpSession session) { 
    ...foo... 
} 
+0

谢谢,但我的目的是包装与会话的某些功能,而不明确使用它 - 在我的情况下,我正在写一个身份验证bean,将采取用户名和密码来加载用户并将其放入会话中,并公开如果它已登录,则使用它,而不公开实际会话对象。我认为下面提出的静态访问将更适用于我的情况。尽管如此,了解我可以通过'@RequestMapping'注释传递会话很有用。 –

相关问题