2014-10-28 36 views
0

我創建了一個servlet,其中包含10個隨機值,並對此值進行排序和打印。該值正在添加到LinkedList。當應用程序關閉時,如何將LinkedList的數據保存到file.txt中。我嘗試在servlet中創建文件並寫入一些內容,但是我的代碼沒有創建文件。如何從servlet寫入列表到.txt

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 SAVE_FILE嗎?或者我做了其他錯誤。 文件應創建時,我關閉重疊?

+0

有輕微你說什麼* servlet哪10個隨機值排序並打印這個值*和你顯示的代碼:*從一個'ServletContext'屬性獲取一個列表並顯示它*你想在每次請求後保存,或者當應用程序停止(假設你想保存'lista')? – 2014-10-28 17:47:55

+0

當應用程序停止時 – user3763588 2014-10-28 17:54:13

回答

0

好吧,我假設你計算web應用程序中的某個地方List<String>存儲爲名爲"lista"的servlet上下文屬性。您希望在應用程序停止到文本文件時保存它,每行一個字符串。您需要使用ContextLoaderListener。假設你使用servlet容器3.0+你可以用註釋註冊(如果沒有,你就必須在部署描述符web.xml註冊它您只需編寫的onDestroy方法的文件:

@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); 
     } 
    } 
}