gpt4 book ai didi

java - 我的下载 Servlet 运行两次

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:37 25 4
gpt4 key购买 nike

我有一个带有下载 servlet 的 gwt web 应用程序,我计算了我的数据库中每个文件的下载量。当用户向服务器发送下载请求时,我的下载 servlet 运行两次,我的下载计数器每次都计数 2。但是用户发送请求的文件已经下载了一次。我不知道为什么我的 servlet 会针对 1 个请求运行 2 次。

我的下载 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);

最佳答案

您提出了两个请求。一个通过调用 builder.sendRequest(null, new RequestCallback()另一个在回调中,状态为 200 Window.Location.replace(link)

顺便说一句,我希望这不是将要部署的代码。

  • 未处理异常
  • 数据库操作应该在自己的层完成
  • 我看不到任何代码约定
  • 您应该只选择您真正需要的列
  • 不必要的声明

还有很多其他的地方,但是你应该先解决这个问题,然后你就可以自己发现错误并维护代码

关于java - 我的下载 Servlet 运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17895368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com