3

ダウンロードサーブレットを備えた gwt Web アプリケーションがあり、データベース内のすべてのファイルのダウンロードをカウントしています。ユーザーがダウンロード要求をサーバーに送信すると、ダウンロード サーブレットが 2 回実行され、ダウンロード カウンターが毎回 2 カウントされます。ただし、ユーザーが要求を送信したファイルは、一度ダウンロードされています。サーブレットが 1 回のリクエストで 2 回実行される理由がわかりません。

私のダウンロードサーブレット:

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);
4

2 に答える 2

2

2 つの要求を行います。1 つは呼び出しbuilder.sendRequest(null, new RequestCallback() で、もう 1 つはステータス 200 のコールバックでWindow.Location.replace(link)

ところで、これが展開されるコードではないことを願っています。

  • 処理されない例外
  • データベース操作は独自のレイヤーで行う必要があります
  • コード規則が見当たりません
  • 本当に必要な列だけを選択する必要があります
  • 不要な申告

他にもポイントはたくさんありますが、まずはここを直してから自分でエラーを見つけてメンテできるようにしましょう

于 2013-07-29T07:31:26.193 に答える