我尝试创建从我的数据库(PostgreSQL)获取文件并将其发送到cliet的servlet。我说:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try
{
Connection ce = ConnectionManager.createConnection();
} catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Statement sta = null;
sta = ce.createStatement();
String fileName="";
byte[] file=null;
int bufferSize = 8192;
String sql=("SELECT files,filename FROM filestock WHERE num =(SELECT filestock_id FROM parcels_temp WHERE num="+num+")");
ResultSet rs=sta.executeQuery(sql);
while(rs.next()){
file = rs.getBytes("files");
fileName=rs.getString("filename");
}
}
所以我只是创建了连接,eclipse告诉我,我将围绕Try/catch
中的每一行。怎么了?它的坏主意在servlet中使用JDBC,我必须在另一个类中与数据库进行任何交易吗?
在这种情况下如何将文件发送到servlet?我将它发送为File
或其他我希望使用this从servlet发送文件到cliet。
答案 0 :(得分:1)
在servlet中执行所有操作并不是一个好的编程习惯。尝试使用3层架构..
request---->Servlet--->Manager---->DAO--->Database
创建另一个DAO(DatabaseAccessObject)。它只是另一个只进行数据库操作的类。您在此servlet中编写的所有这些代码都将转到该类中的函数。
下一步是创建一个Bean,您可以在其中存储结果。
现在将来自DAO的bean返回到此servlet。
现在问题来了吗?你打算怎么处理文件和fileName?
如果要下载文件,只需将其推入输出流即可。确保设置contentType。
编辑: 样本文件下载
OutputStream out = response.getOutputStream();
FileInputStream in = new FileInputStream(my_file);
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0){
out.write(buffer, 0, length);
}
in.close();
out.flush();
答案 1 :(得分:1)
问题的一部分至少是你没有关闭你打开的连接。这将在一段时间内导致连接泄漏,您的应用程序最终会崩溃。 使用此类资源的一般模式是
Connection conn;
try {
conn = ...
//do stuff with your connection
return result;
} catch (Exceptions ...) {
///handle exceptions
} finally {
conn.close(); //will always be executed
}
另外,如其他地方所述,JSP被认为是“表示层” - 这意味着它们主要处理很好地显示源自其他地方的数据。其他地方通常被称为“业务层”,这就是数据库访问通常所属的地方。所以将代码移到实用程序类,并从JSP调用该类
答案 2 :(得分:1)
没有错。无论何时访问数据库,都涉及许多步骤。
这些步骤可能会抛出需要处理的异常。 我建议在一次try / catch下包装整个代码 而是为每一个陈述写它。