获取Servlet上下文的不同方法

获取Servlet上下文的不同方法,第1张

获取Servlet上下文的不同方法

还有一个。

request.getServletContext();

从技术上讲,性能没有区别,只有

request.getSession()
会隐式创建HTTP会话对象(如果尚未创建)。因此,如果尚未完成,那么如果尚未创建会话,则通过会话获取servlet上下文可能要花费几纳秒的时间。

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

如果你坐在一个方法调用由servlet的

service()
(如
doGet()
doPost()
等),那么就使用继承的
getServletContext()
方法。其他方式只是不必要地在源代码中添加了更多字符。

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

如果您使用的是servlet的

init(ServletConfig)
方法,那么
getServletContext()
只要您尚未调用,继承的方法就不可用
super.init(config)
。您需要从中获取它
ServletConfig

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

但是更好的是改写

init()
。在一个体面的servlet中,通常不需要重写
init(ServletConfig)

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

如果您不是坐在servlet中,而是在一个缺少继承方法的过滤器中,

getServletContext()
而只有一个
ServletRequest
手头,那么您可以从那里获取它。

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

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

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

但是,如果您担心不必要的会话创建,那么这不是很好。因此,引入了

ServletRequest#getServletContext()
-尽管您也可以简单地从中提取它
FilterConfig
(嘿,还有另一种方法!)。

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

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

HttpSession#getServletContext()

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

在这里,您不必担心不必要的会话创建,因为它已经预先创建了很长时间。请注意,没有

ServletRequest
任何地方,因为在服务器端会话超时期间不一定存在活动的HTTP请求。

最后,还有

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

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

但这已经需要电流

ServletContext
开始,您现在应该已经知道了使用哪种方法来获取电流。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5475459.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存