У меня есть веб-приложение 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);
из темы , Закройте ресурсы в funally block, используйте PreparedStatement в первом запросе. Используйте специальный метод для обновления 'executeUpdate'. Также я предлагаю вам прочитать условное обозначение кода –
Может быть, хороший старый прогон по строкам поможет вам найти, почему счетчик увеличивается на 2. Проверьте, выполняется ли SQL-запрос 2 раза или увеличивается на 2, что может помочь вы –
Я скомпилировал код по строкам, сервлет работает 2 раза. Но я не мог найти, какие команды запускают сервлет – mat