获取Servlet Context的不同方法
有人能解释一下这种获取HttpServlet
的ServletContext
的方法之间的区别是什么?
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
开始了,为此您应该已经知道使用哪种方式来获取它。