当前位置: 首页 > 面试题库 >

获取Servlet上下文的不同方法

云伯寅
2023-03-14
问题内容

可能有人给我解释一下什么是获得这种方式的区别ServletContextHttpServlet

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

性能或上下文本身是否有差异?如果是这样,那是最好的方法?还有其他检索上下文的方法吗?


问题答案:

还有一个。

request.getServletContext();

从技术上讲,性能没有区别,只有request.getSession()会隐式创建HTTP会话对象(如果尚未创建)。因此,如果尚未完成,那么如果尚未创建会话,则通过会话获取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中,而是在一个缺少继承方法的过滤器中,getServletContext()而只有一个ServletRequest手头,那么您可以从那里获取它。

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

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

@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
html" target="_blank">public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    ServletContext context = config.getServletContext();
    // ...
}

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

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

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

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

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

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



 类似资料:
  • 据我所知,基于Spring的web应用程序初始化如下: 步骤1:定位的实现,即。 步骤2:< code > SpringServletContainerInitializer 创建< code>DispatcherServlet和< code > context loader listener 第3步:创建。创建。 步骤 1 由 Servlet 3.0 规范定义。步骤2,3完全由Spring定义。

  • 要查看此问题的完整代码,请参阅此github https://github.com/mobiusinversion/web-application 我正在使用Jersey 2.15开发。这是一个嵌入式的Jetty应用程序,它被遮蔽到一个单独的罐子中。 在防波堤起动器(主类)中: 我有一个通过提供程序包含的过滤器 则在筛选器中:

  • 设置如下--我有一个定时任务,它将发送验证电子邮件,以便用户: 如果我可以在这里设置thymeleaf模板解析器来处理这些链接,也会有所帮助,但为此我需要,它需要的实例。

  • 问题内容: 我有一个带有applicationContext.xml和dispatcher-servlet.xml配置的Spring Web应用程序。我已经在applicationContext.xml中定义了,但是当我运行我的应用程序时,除非同时添加到dispatcher-servlet.xml中,否则找不到控制器。我在两个中都使用了相同的基本软件包,所以这不是问题。 我很困惑,因为我认为 ap

  • 我有一个带有applicationcontext.xml和dispatcher-servlet.xml配置的Spring web应用程序。我已经在applicationcontext.xml中定义了,但是当我运行应用程序时,没有找到控制器,除非我还将添加到dispatcher-servlet.xml。我在两个软件包中使用了相同的基包,所以这不是问题所在。 我感到困惑,因为我以为applicatio

  • 本文向大家介绍php获取文章上一页与下一页的方法,包括了php获取文章上一页与下一页的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php获取文章上一页与下一页的方法。分享给大家供大家参考。具体方法如下: 今天发现一个站的上一页与下一页出现问题,上一页没有问题但是在下一页是直接到了本频道最新发布的文章了,按原理应该是文章本身ID的前与后的ID才是上下页吧,下面我来与大家详细讲述一下.