-1

我尝试制作从我的数据库(PostgreSQL)获取文件并将其发送到客户端的 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或其他我想用发送文件从 servlet 发送到客户端的东西。

4

3 回答 3

1

在 servlet 中做所有事情并不是一个好的编程习惯。尝试使用 3 层架构..

request---->Servlet--->Manager---->DAO--->Database

创建另一个 DAO (DatabaseAccessObject)。它只不过是另一个只执行数据库操作的类。您在这个 servlet 中编写的所有这些代码都将转到该类中的一个函数。

下一步是创建一个 Bean,您将在其中存储结果。

现在将 bean 从 The DAO 返回到这个 servlet。

现在问题来了?你打算对文件和文件名做什么?

如果要下载文件,只需将其推送到输出流中即可。确保设置了 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();
于 2013-01-31T05:48:44.827 回答
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 调用该类

于 2013-01-31T05:49:56.123 回答
1

没有错误。每当您访问数据库时,都会涉及许多步骤。

  • 注册驱动程序
  • 打开连接
  • 执行查询。
  • 获取数据
  • 关闭连接

这些步骤可能会抛出需要处理的异常。我建议将整个代码包装在一个 try/catch 下,而不是为每个语句编写它。

于 2013-01-31T05:54:28.250 回答