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

如何从ServletContext获取HttpServletRequest?

明财
2023-03-14
问题内容

是否可以从ServletContext获取HttpServletRequest?


问题答案:

是否可以从ServletContext获取HttpServletRequest?

没有。

ServletContext代表的应用程序。该应用程序可以涵盖许多会话和请求。但是您无法通过来获取“当前正在运行”的请求或会话ServletContext。有关servlet和作用域如何工作的详细信息,可以在以下相关答案中找到:servlet如何工作?实例化,会话,共享变量和多线程。

不幸的是,您不清楚在何处需要此解决方案的具体功能要求。您显然可以ServletContext在感兴趣的类的实例上以某种方式获得帮助,但没有HttpServletRequestHttpServletRequest无论如何,很难提出一个正确的方法来说明如何在此类实例中进行抓取的答案。像JSF和Spring
MVC这样的体面MVC框架可以通过各种方式来获取HttpServletRequest与您想要的任何类中的当前线程相关联的内容。

如果您不使用MVC框架,从而无法使用其功能,则可以ThreadLocal<T>通过Servlet过滤器将请求(和响应)存储为当前线程中的值来手动实现。

这是一个启动示例,这种线程本地上下文类的外观如下:

public final class YourContext implements AutoCloseable {

    private static ThreadLocal<YourContext> instance = new ThreadLocal<>();

    private HttpServletRequest request;
    private HttpServletResponse response;

    private YourContext(HttpServletRequest request, HttpServletResponse response) {
        this.request = request;
        this.response = response;
    }

    public static YourContext create(HttpServletRequest request, HttpServletResponse response) {
        YourContext context = new YourContext(request, response);
        instance.set(context);
        return context;
    }

    public static YourContext getCurrentInstance() {
        return instance.get();
    }

    @Override    
    public void close() {
        instance.remove();
    }

    // ... (add methods here which return/delegate the request/response).    
}

您可以在servlet过滤器中创建(并关闭!!),如下所示。

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    try (YourContext context = YourContext.create(request, response)) {
        chain.doFilter(request, response);
    }
}

请注意,关闭非常重要。否则,线程在完成其工作后将被污染,并将被回收以用于不同的请求甚至是完全不同的目的。如果您还没有使用Java7,因此不能使用上述try-with-resources语句,请使用一个try- finally块。

然后,在由相同线程/请求调用的任何工件(即,其他过滤器,任何servlet,由这些工件直接调用的任何bean
/类(间接)等)中,您都可以获取HttpServletRequest与当前线程的关联,如下所示:

YourContext context = YourContext.getCurrentInstance();
HttpServletRequest request = context.getRequest();
// ...

或者,最好根据您要对当前请求执行的操作来创建委托方法,例如获取请求语言环境:

YourContext context = YourContext.getCurrentInstance();
Locale requestLocale = context.getRequestLocale();
// ...

作为一个真实的例子,JavaEE的MVC框架JSF)通过提供了这种可能性FacesContext

FacesContext context = FacesContext.getCurrentInstance();
Locale requestLocale = context.getExternalContext().getRequestLocale();
// ...


 类似资料:
  • 主要内容:1. ServletActionContext,2. ServletContextAware,参考在Struts2中,可以使用以下两种方法来获取ServletContext对象。 1. ServletActionContext 直接从 org.apache.struts2.ServletActionContext 获取 ServletContext 对象。 2. ServletContextAware 让你的类实现了org.apache.struts2.util.ServletCont

  • 问题内容: 您能否解释一下如何在我的子类中获取实例?可能吗?我已尝试按照以下代码片段的方式进行操作,但它似乎不起作用- 未设置: web.xml: 问题是我需要从中获取上下文参数。如果有其他方法,请给我一个提示,我将不胜感激。 我了解注记可能并非为此目的。实际上,我不需要自己。如果只有我可以从web.xml中获取上下文参数,我将非常高兴。 这是我真正需要的一个例子: 谢谢。 问题答案: 从Jers

  • 如何从(在清单中)使用java?

  • 问题内容: 我正在使用蜡染来处理SVG图像。有什么办法可以从SVG文件中获取java.awt.image.BufferedImage吗? 我知道有一些转码器,我可以使用它们将SVG转码为PNG,然后使用ImageIO.read()加载该PNG,但是我不想拥有临时文件。 问题答案: 使用蜡染,如下所示:

  • 问题内容: 我正在使用HttpClient 4.1.2 那么,如何获取Cookie值? 问题答案: 请注意:第一个链接指向曾经在HttpClient V3中工作的内容。在下面找到与V4相关的信息。 这应该回答你的问题 http://www.java2s.com/Code/Java/Apache- Common/GetCookievalueandsetcookievalue.htm 以下与V4有关:

  • 问题内容: 如何从BufferedImage对象获取InputStream?我尝试了这个,但是ImageIO.createImageInputStream()总是返回NULL 图片缩略图已正确生成,因为我可以成功将 bigImage绘制 到 JPanel 。 谢谢。 问题答案: 如果您尝试将图像保存到文件,请尝试: 如果您只想读取字节,请尝试执行写调用,但将其传递给ByteArrayOutputS