gpt4 book ai didi

java - 获取 Servlet 上下文的不同方法

转载 作者:IT老高 更新时间:2023-10-28 20:46:39 26 4
gpt4 key购买 nike

谁能解释一下这种获取 HttpServletServletContext 的方法有什么区别?

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

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

最佳答案

还有一个。

request.getServletContext();

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

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

如果您正在使用由 servlet 的 service() 调用的方法(如doGet()doPost()等),则使用继承的getServletContext()即可方法。其他方式只会在源代码中不必要地添加更多字符。

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

如果您使用 servlet 的 init(ServletConfig)方法,那么继承的 getServletContext() 还不可用,只要你没有调用 super.init(config)。您需要从 ServletConfig 获取它.

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

但更好的是覆盖init()反而。在一个体面的 servlet 中,您通常不需要覆盖 init(ServletConfig)

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

如果您不是坐在 servlet 中,而是在例如一个 filter它缺少继承的 getServletContext() 方法,您只有 ServletRequest手,然后你可以从那里捕获它。

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

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

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

但是,如果您担心创建不必要的 session ,这并不好。因此引入了 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 session listeners你可以在哪里听 a.o. session 销毁。除了通过 HttpSession#getServletContext() 之外,没有其他方法可以获取 servlet 上下文。 .

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

在这里,您无需担心不必要的 session 创建,因为此时 session 已经创建很久了。请注意,任何地方都没有 ServletRequest,因为在服务器端 session 超时期间不一定意味着 Activity 的 HTTP 请求。

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

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

但这已经需要当前的 ServletContext 开始,您现在应该已经知道使用哪种方式来获取它。

关于java - 获取 Servlet 上下文的不同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35837285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com