Java 将HttpServletRequest对象作为参数传递

Java 将HttpServletRequest对象作为参数传递,java,multithreading,servlets,Java,Multithreading,Servlets,通常,我需要通过一个调用servlet的html表单上传一个大文件,然后使用一个繁重的算法处理该文件,并返回一个xml文档作为响应。 整个过程需要很多时间,因此为了避免浏览器超时连接,我决定创建一个对象(扩展线程),该对象将在不同的线程中执行耗时的过程(上载文件并对其进行操作),并能够指示过程的进度。为此,我需要将HttpServletRequest请求作为参数传递给对象。 当我试图解析请求参数(我使用的是apache commons FileUpload)时,出现了以下异常: "the req

通常,我需要通过一个调用servlet的html表单上传一个大文件,然后使用一个繁重的算法处理该文件,并返回一个xml文档作为响应。 整个过程需要很多时间,因此为了避免浏览器超时连接,我决定创建一个对象(扩展
线程
),该对象将在不同的线程中执行耗时的过程(上载文件并对其进行操作),并能够指示过程的进度。为此,我需要将
HttpServletRequest
请求作为参数传递给对象。 当我试图解析请求参数(我使用的是apache commons FileUpload)时,出现了以下异常:

"the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null" .

是否可以将
HttpServletRequest
对象传递给对象扩展线程?如果是这样,安全操作的正确做法是什么?

你不应该这样做。当请求对象在线程中使用时,请求可能不再有效,Tomcat可能已经清除了它(因此是例外)(当然,假设您的表单确实是
enctype=“multipart/form data”

因此,为了正确处理这个问题,从请求中提取数据并将其传递给新线程。因此,您将不依赖于请求对象,而只依赖于其内容


请注意,Servlet 3.0为异步服务器端处理添加了一个选项,这对您来说似乎是一个不错的选项-。

您收到的错误表明客户端的表单可能未正确设置。请确保您的表单定义如下:

   <FORM action="YOUR_SERVLET"
   enctype="multipart/form-data"
   method="post">


您的html表单是否包含具有值的enctype属性
多部分/表单数据
?是。我可以用doPost方法轻松地完成,问题是当我将请求作为参数传递时。感谢您指出异步服务器端处理,我将研究它。我想防止浏览器等到我从请求中提取完文件后再运行(就像我现在在doPost方法中所做的那样),所以我想在另一个线程中运行它。那么,不可能将请求作为参数传递吗?简单地从请求中获取数据不应该很昂贵,因此,获取数据并将其传递给线程。您能再解释一下“请求可能不再有效”吗?当当,这个答案已经有好几年了,可能没人会看到这个评论。它确实是。我在doPost方法中很容易做到这一点,问题是当我将请求作为参数传递时。