Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多个独立post请求期间保持servlet中的对象活动_Java_Servlets_Post_Request - Fatal编程技术网

Java 在多个独立post请求期间保持servlet中的对象活动

Java 在多个独立post请求期间保持servlet中的对象活动,java,servlets,post,request,Java,Servlets,Post,Request,我目前正在使用Tomcat7中的Javaservlet构建一个web应用程序。 这个webapp使用Jupload作为客户端applet,以提供一种更舒适的方式将多个文件上传到服务器。 但是,当前此小程序会为每个post请求发送一个文件。我实现的Servlet从输入流读取数据并将其存储在本地。这很好,而且很有效。 但另外,我必须在数据库中存储文件名和路径等内容。这就是为什么我想将这些信息存储在一个对象中,并将它们保存在一个列表中,并在小程序的传入请求期间收集这些信息。 列表当前实现为类变量 pu

我目前正在使用Tomcat7中的Javaservlet构建一个web应用程序。 这个webapp使用Jupload作为客户端applet,以提供一种更舒适的方式将多个文件上传到服务器。 但是,当前此小程序会为每个post请求发送一个文件。我实现的Servlet从输入流读取数据并将其存储在本地。这很好,而且很有效。 但另外,我必须在数据库中存储文件名和路径等内容。这就是为什么我想将这些信息存储在一个对象中,并将它们保存在一个列表中,并在小程序的传入请求期间收集这些信息。 列表当前实现为类变量

public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private ArrayList<ImageUploadInformation> uploadInfos;  //I know, thats bad.


     public UploadServlet() {
        super();
        uploadInfos = new ArrayList<>();
     }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // not relevant stuff...
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //accessing data stream directly
         //jUpload sends file information and file binary data in one stream, so we have to deal with mixed data in streams
         InputStream inputStream = request.getInputStream();
         DataInputStream dataInputStream = new DataInputStream(inputStream);

         //some other stuff, not relevant

         byte[] b = IOUtils.toByteArray(inputStream);
         File file = null; 
         if (finalFilename != null) {
             file = new File(finalFilename);
         }
         if (file != null) {
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            bos.write(b);
            bos.close();
            fos.close();
         }
         else 
            throw new IOException("File Creation on Server failed!");

         //adding Meta informations about file in list 
         uploadInfos.add(new ImageUploadInformation(filename, relativeDir,"1"));
    }
}
但是,我不能使用它,因为它是一个全新的post请求,来自applet,这就是为什么我不能在另一个请求中访问此列表。 我读了一些关于在ServletContext中绑定对象的内容,但我认为这也是一种不好的做法,但我找不到任何证据证明这一点。我如何才能实现,我可以存储在多个独立的请求这个列表。 如果所有文件都只在一个post请求中发送到servlet,我可以在doPost()方法中创建列表,这会更好吗? 我认为这在Jupload中是可配置的,但实际上文件可能非常大。 在一个请求中发送大量文件是常见的做法吗? 感谢您提供的任何帮助和有关此类内容的其他文献的链接

@编辑:附加内容 我也试过这个

        if (request.getSession().getAttribute("uploadInfos") != null) {     
            uploadInfos = (ArrayList<ImageUploadInformation>)request.getSession().getAttribute("uploadInfos");
            uploadInfos.add(new ImageUploadInformation(filename, relativeDir,"1"));
            System.out.println("UploadInfos found in Session, current size: " +uploadInfos.size());
            request.getSession().setAttribute("uploadInfos", uploadInfos);
        }
        else {
            System.out.println("No UploadInfos found, creating new List...");
            uploadInfos = new ArrayList<>();
            uploadInfos.add(new ImageUploadInformation(filename, relativeDir,"1"));
            request.getSession().setAttribute("uploadInfos", uploadInfos);
        }

你快到了。会话是在服务器上存储要跨请求保留的状态的位置

可以从多个线程和不同的客户端调用servlet;容器还可以随意创建或销毁实例,因此servlet本身不应该持有状态。“uploadInfos”字段需要删除。该列表应该是线程安全的集合,例如CopyOnWriteArrayList,并存储在会话中。首先从会话中获取属性,如果该属性为null,则创建一个新列表并将其存储在会话中。然后像以前一样将您的条目添加到列表中


还值得一提的是,在服务器上存储请求之间的状态有时是不可取的,因为这会使系统更难扩展。另一种方法是使用JavaScript将状态存储在客户机上。不过,在您的情况下,我不必为此费心,只需将其存储在会话中即可。更容易。

如果您想在会话间共享数据,您可能需要考虑使用ServLeLoice。我已经阅读了这个线程:当我理解这一点时,如果所有的用户同时上传文件,我的列表将是可用的。还是我错了?是的,这是跨用户的。这个答案是由一位J2EE专家写的。您是否试图跨所有用户存储信息?还是按用户?我想按用户存储它们,。。不适用于所有用户。处理客户端A的Servlet应该只能访问存储其文件信息的列表,处理客户端B请求的同一个Servlet应该有另一个列表,存储其文件信息并只能访问该列表。我编辑了我的问题,我已经尝试过了,正如你提到的。。但它不起作用。目前它仍然是一个数组列表,但我无法访问它,正如您在输出中看到的,您需要调用
request.getSession(true)
来创建会话。也许这就是问题所在?您可能还需要在您的客户端上启用cookies。我会尝试一下。谢谢你的帮助。。我会评论它是否有效。很抱歉,它在参数为true时不起作用。仍然是相同的输出。
        if (request.getSession().getAttribute("uploadInfos") != null) {     
            uploadInfos = (ArrayList<ImageUploadInformation>)request.getSession().getAttribute("uploadInfos");
            uploadInfos.add(new ImageUploadInformation(filename, relativeDir,"1"));
            System.out.println("UploadInfos found in Session, current size: " +uploadInfos.size());
            request.getSession().setAttribute("uploadInfos", uploadInfos);
        }
        else {
            System.out.println("No UploadInfos found, creating new List...");
            uploadInfos = new ArrayList<>();
            uploadInfos.add(new ImageUploadInformation(filename, relativeDir,"1"));
            request.getSession().setAttribute("uploadInfos", uploadInfos);
        }
Incoming post request
No UploadInfos found, creating new List...
Incoming post request
No UploadInfos found, creating new List...
Incoming post request
No UploadInfos found, creating new List...