是否可以从ServletContext获取HttpServletRequest?
是否可以从ServletContext获取HttpServletRequest?
没有。
该ServletContext
代表的应用程序。该应用程序可以涵盖许多会话和请求。但是您无法通过来获取“当前正在运行”的请求或会话ServletContext
。有关servlet和作用域如何工作的详细信息,可以在以下相关答案中找到:servlet如何工作?实例化,会话,共享变量和多线程。
不幸的是,您不清楚在何处需要此解决方案的具体功能要求。您显然可以ServletContext
在感兴趣的类的实例上以某种方式获得帮助,但没有HttpServletRequest
。HttpServletRequest
无论如何,很难提出一个正确的方法来说明如何在此类实例中进行抓取的答案。像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