有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将列表从servlet写入。文本

我创建了一个servlet,它滚动10个随机值,排序并打印这个值。此值正在添加到LinkedList。如何将数据从LinkedList保存到文件。txt时,应用程序将关闭。我尝试在servlet中创建文件并编写一些东西,但我的代码没有创建文件

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        /* TODO output your page here. You may use following sample code. */
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet NewServlet</title>");            
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet NewServlet at " + request.getContextPath() + "</h1>");
        List<Integer> lista=(List<Integer>) this.getServletContext().getAttribute("lista");
        out.println("<ul>");
        for(Integer l:lista){
            out.println("<li>"+l+"</li>");
        }
        out.println("</ul>");
        out.println("<form action=\"NewServlet1\">");
        out.println("<input type=\"text\" name=\"liczba\">");
        out.println("<input type=\"submit\" value=\"ADD\">");
        out.println("</form>");
        out.println("</body>");
        out.println("</html>");
    } finally {            
        out.close();
    }

        PrintWriter zapis = null;
        zapis = new PrintWriter("test.txt");
        zapis.println("type type type ");
        zapis.close();


}

public class NewServletListener implements ServletContextListener {

static final public String defFileName = "file.txt";
String fileName;

@Override
public void contextInitialized(ServletContextEvent sce) {
    List<Integer> lista=new LinkedList<Integer>();
    Random rand=new Random();
    int rozmiar=Integer.parseInt(sce.getServletContext().getInitParameter("rozmiar"));
    for(int i=0;i<rozmiar;i++){
        lista.add(rand.nextInt(100));
    }
    sce.getServletContext().setAttribute("lista", lista);

    fileName = sce.getServletContext().getInitParameter("SAVE_FILE");
    if (fileName == null) {
        fileName = defFileName;
    }
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
//        throw new UnsupportedOperationException("Not supported yet.");
        List<Integer> lista=(List<Integer>) sce.getServletContext().getAttribute("lista");

    File file = new File(fileName);
    try (PrintWriter printWriter = new PrintWriter(file)) {
        for (Integer l:lista) {
            printWriter.println(l);
        }
    } catch (FileNotFoundException e) {
        throw new RuntimeException(e);
    }

}
}

这很奇怪,但文件无法创建。我应该添加到web吗。xml保存文件?或者我做错了什么。 关闭重叠时应创建的文件


共 (1) 个答案

  1. # 1 楼答案

    好的,我假设您在web应用程序的某个地方计算了一个List<String>,它存储为一个名为"lista"的servlet上下文属性。您希望在应用程序停止时将其保存到文本文件,每行一个字符串

    您必须使用ContextLoaderListener。假设您使用servlet 3.0+容器,您可以使用注释注册它(如果没有,您必须在部署描述符web.xml中注册它

    @WebListener
    public class SaveListener implements ServletContextListener {
        static final public String defFileName = "file.txt";
        String fileName;
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            // allow to find the name of the file in init parameters
            fileName = sce.getServletContext().getInitParameter("SAVE_FILE");
            if (fileName == null) {
                fileName = defFileName;
            }
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            List<String> lista = (List<String>) sce.getServletContext()
                    .getAttribute("lista");
            File file = new File(fileName);
            try (PrintWriter printWriter = new PrintWriter(file)) {
                for (String string : lista) {
                    printWriter.println(string);
                }
            } catch (FileNotFoundException e) {
                throw new RuntimeException(e);
            }
        }
    }