我有一个类中的方法,它没有获取任何可用于获取实际servlet上下文的东西。实际上,就像这样:
public String getSomething() { ... }
但是为了计算结果,我需要实际的、特定于线程的servlet结构。
我认为,在应用程序上下文的深处,应该存在一些类似于特定于线程的存储,可以通过调用某个系统类的静态方法来访问它。
我正在使用tomcat6 servlet容器,但如果需要的话,也可以使用Spring。
在你的web.xml
中添加一个ServletContextListener
。这将在你的Web应用程序被加载时调用。在contextInitialized()
方法中,你可以将ServletContext
存储在一个静态变量中以供以后使用。然后,你将能够以静态方式访问ServletContext
:
class MyListener implements ServletContextListener {
public static ServletContext context;
@Override
public void contextInitialized(ServletContextEvent sce) {
context = sce.getServletContext();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
context = null;
}
}
将其添加到 web-xml
中,方法如下:
<web-app>
<listener>
<listener-class>
com.something.MyListener
</listener-class>
</listener>
</web-app>
你可以像这样从任何地方访问它:
public String getSomething() {
// Here you have the context:
ServletContext c = MyListener.context;
}
注意:
你可能希望将其存储为private
,并提供一个getter
方法,在使用它之前还要检查null
值。
如果您没有指向有用内容的指针,我所知道的唯一方法是在包含当前ServletContext的类中具有静态属性。使用ServletContextListener
非常简单:
@WebListener
public class ServletContextHolder implements ServletContextListener {
private static ServletContext servletContext;
public static ServletContext getServletContext() {
return servletContext;
}
@Override
public void contextInitialized(ServletContextEvent sce) {
servletContext = sce.getServletContext();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
servletContext = null;
}
}
然后,您可以从任何地方使用
ServletContextHolder.getServletContext();
RequestContextHolder
来访问当前请求(以及您所需的任何内容)。HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
@Autowired
ServletContext servletContext;
ThreadLocal
吗?据我所知,ServletContext
在VM中只定义一次。 - epoch