如何在servlet中使用JDBC?

时间:2013-01-31 05:44:56

标签: java jdbc

我尝试创建从我的数据库(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。

3 个答案:

答案 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下包装整个代码 而是为每一个陈述写它。