2013-07-27 4 views
3

У меня есть веб-приложение gwt с загрузочным сервлетом, и я подсчитываю загрузку каждого файла в моем db. Когда пользователь отправляет запрос на загрузку на сервер, мой сервлет загрузки запускается дважды, а счетчик загрузки - 2 раза каждый раз. но файл, который пользователь отправил на него запрос, был загружен один раз. Я не знаю, что мой сервлет работает 2 раза за 1 запрос.My Download Servlet работает дважды

моя скачать сервлет:

public class DownloadServlet extends HttpServlet { 

private static final String UPLOAD_DIRECTORY = "c:\\update\\"; 
private Connection con; 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 

    Statement select=null; 
    ResultSet result=null; 

    try{ 

     Class.forName("com.mysql.jdbc.Driver"); 
     con = DriverManager.getConnection("jdbc:mysql://localhost:3306/laplasdb?useUnicode=true&characterEncoding=UTF-8","gwt","root"); 
     }catch(Exception ex){ 

     } 
    String query = "SELECT * FROM TBL_Drive_Files WHERE id = '"+req.getParameter("fileid")+"'", filename=""; 
    InputStream filecontent=null; 

    int filesize=0; 
    try { 
     select = con.createStatement(); 
     result = select.executeQuery(query); 
     while (result.next()) { 
      filename = result.getString(2); 
      filesize = result.getInt(4); 
      filecontent = result.getBinaryStream(5); 
     } 

     result.close(); 

    } catch(SQLException e) { 
    } 


    BufferedOutputStream output = null; 
    try { 

     resp.reset(); 
     resp.setContentType("application/octet-stream"); 
     resp.setContentLength(filesize); 
     resp.setHeader("Content-disposition", "attachment; filename=\"" + filename + "\""); 
     output = new BufferedOutputStream(resp.getOutputStream()); 
     for(int data; (data=filecontent.read()) != -1;) { 
      output.write(data); 
     } 
     output.flush(); 

     query = "Update TBL_Drive_Files SET count = count + 1 WHERE id = '"+req.getParameter("fileid")+"'"; 
     try { 
      select = con.createStatement(); 
      select.execute(query);    

      select.close(); 
      con.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 
    catch (IOException e) { 

     e.printStackTrace(); 
    } 
    finally { 
    } 
}  

}

и в стороне клиента:

Button bd = new Button("Download", new ClickHandler(){ 
      public void onClick(ClickEvent event){ 
       final String link = GWT.getModuleBaseURL() + "download?fileid=3"; 

       RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,link); 

       try { 
        builder.sendRequest(null, new RequestCallback() { 
        public void onError(Request request, Throwable t) { 
         Window.alert("Error bei getExcel"); 
        } 
        public void onResponseReceived(Request request,Response response){ 
          int statuscode = response.getStatusCode(); 
          if(statuscode == 200) { 
            Window.Location.replace(link); 
         } else if(statuscode == 404) { 
         Window.alert("Service not available."); 
         } 
        } 
        }); 
        } catch (RequestException re) { 
         Window.alert(re.toString()); 
        } 
      } 
    });    
    RootPanel.get().add(bd); 
+3

из темы , Закройте ресурсы в funally block, используйте PreparedStatement в первом запросе. Используйте специальный метод для обновления 'executeUpdate'. Также я предлагаю вам прочитать условное обозначение кода –

+0

Может быть, хороший старый прогон по строкам поможет вам найти, почему счетчик увеличивается на 2. Проверьте, выполняется ли SQL-запрос 2 раза или увеличивается на 2, что может помочь вы –

+0

Я скомпилировал код по строкам, сервлет работает 2 раза. Но я не мог найти, какие команды запускают сервлет – mat

ответ

2

Вы делаете два запроса. Один по телефону builder.sendRequest(null, new RequestCallback() , а другой в обратном вызове со статусом 200 Window.Location.replace(link)

Btw я надеюсь, что это не будет код, который будет развернут.

  • Не обрабатываемые исключения
  • операции базы данных должно быть сделано в отдельном слое
  • Я не могу видеть любой код конвенции
  • Вы должны только выбрать столбцы, у действительно нужно
  • Ненужные деклараций

Есть много других моментов, но сначала вы должны исправить это, а затем вы сможете найти ошибки и сохранить код на сами

+0

когда я удаляю Window.Location.replace (link) из моего кода, сервлет запускается один раз, но действие загрузки не работает должным образом. делать? – mat

+0

Я не знаю ваших требований, но если это достаточно, вы можете избавиться от requestBuilder и просто использовать 'Window.location.replace (...)' См. Руководство (в соответствии с вашей ошибкой, я думаю, что немецкая ссылка ok) http://de.selfhtml.org/javascript/objekte/location.htm#replace – deterministicFail

0

Взятые из моего ответа на: Download file using Jersey and RestyGWT

In general(*) you cannot use ajax to download files, so you have to use a Window.open() or an iframe to ask the user to save the file as.

Так что не использовать RequestBuilder, чтобы получить файл, и как я сказал: Window.open in GWT not open correctly with in a call back function

The best solution, is to open the file in an iframe, but you have to set the appropriate content-disposition header in server side which causes the browser to show the "Save" dialog.

Смежные вопросы