获取Servlet Context的不同方法

有人能解释一下这种获取HttpServletServletContext的方法之间的区别是什么?

 doGet( HttpServletRequest request, ... ){ getServletConfig( ).getServletContext( ); request.getSession( ).getServletContext( ); getServletContext( ); } 

性能或上下文本身有什么不同吗? 如果是这样,哪种方式最好? 有没有其他方法来检索上下文?

还有一个。

 request.getServletContext(); 

从技术上讲,性能没有区别,只有request.getSession()会隐式创建HTTP会话对象(如果尚未创建)。 因此,如果尚未完成此操作,那么如果尚未创建会话,则通过会话获取servlet上下文可能需要几纳秒的时间。

返回的上下文也没有区别。 这些方法都只是为了方便起见,获取上下文的方法取决于您当前所处的上下文;)

如果您正坐在servlet的service()调用的方法中(例如doGet()doPost()等),那么只需使用inheritance的getServletContext()方法。 其他方式只是不必要地在源代码中添加更多字符。

 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { ServletContext context = getServletContext(); // ... } 

如果您正坐在servlet的init(ServletConfig)方法中,那么只要您没有调用super.init(config) ,inheritance的getServletContext()就不可用了。 你需要从ServletConfig获取它。

 @Override public void init(ServletConfig config) { ServletContext context = config.getServletContext(); // ... } 

但更好的是重写init() 。 在一个像样的servlet中,你通常永远不需要重写init(ServletConfig)

 @Override public void init() { ServletContext context = getServletContext(); // ... } 

如果您不是坐在servlet中,而是在例如缺少inheritance的getServletContext()方法的filter中 ,并且您手头只有ServletRequest ,那么您可以从那里获取它。

 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { ServletContext context = request.getServletContext(); // ... } 

请注意,这是自Servlet 3.0以来的新function。 以前,您必须从会话中获取它。

 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { ServletContext context = request.getSession().getServletContext(); // ... } 

但是,如果您担心不必要的会话创建,这不是很好。 因此引入了ServletRequest#getServletContext() – 虽然你也可以简单地从FilterConfig提取它(嘿,还有另外一种方法!)。

 private FilterConfig config; @Override public void init(FilterConfig config) { this.config = config; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { ServletContext context = config.getServletContext(); // ... } 

然后有HTTP会话侦听器 ,您可以在其中侦听ao会话销毁。 除了通过HttpSession#getServletContext()之外,没有其他方法可以获得servlet上下文。

 @Override public void sessionDestroyed(HttpSessionEvent event) { ServletContext context = event.getSession().getServletContext(); // ... } 

在这里,您无需担心不必要的会话创建,因为它已经预先创建了很长时间。 请注意,在任何地方都没有ServletRequest ,因为在服务器端会话超时期间不一定存在活动HTTP请求。

最后,还有ServletContext#getContext() ,它返回部署到同一服务器的不同Web应用程序的ServletContext (仅当服务器配置为在目标webapp上启用跨上下文访问时才有效)。

 ServletContext otherContext = context.getContext("/otherContextPath"); 

但是这已经要求当前的ServletContext开始了,为此您应该已经知道使用哪种方式来获取它。