-1

DB(PostgreSQL)からファイルを取得してclietに送信するサーブレットを作成しようとしています。私は言う:

    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");
    }
}

だから私は接続を作成するだけで、日食は私が各行をで囲むつもりだと私に言いますTry/catch。どうしたの?サーブレットでJDBCを使用するのは悪い考えであり、別のクラスのデータベースを処理する必要がありますか?
この場合、ファイルをサーブレットに送信する方法は?サーブレットからclietにファイルを送信するためにこれFileを使用したいものとして送信します。

4

3 に答える 3

1

サーブレットですべてを行うことは、適切なプログラミング方法ではありません。3層アーキテクチャを使用してみてください..

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

別の DAO(DatabaseAccessObject) を作成します。データベース操作のみを行う別のクラスに他なりません。このサーブレットに記述したこれらすべてのコードは、そのクラスの関数に送られます。

次のステップは、結果を格納する Bean を作成することです。

ここで、Bean を DAO からこのサーブレットに戻します。

さて、質問は来ますか?ファイルとファイル名で何をするつもりですか?

ファイルをダウンロードする場合は、出力ストリームにプッシュするだけです。必ず 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

何も問題はありません。データベースにアクセスするときはいつでも、多くの手順が必要です。

  • ドライバーの登録
  • 接続を開く
  • クエリを実行しています。
  • データの取得
  • 接続を閉じる

これらの手順では、処理が必要な例外がスローされる場合があります。ステートメントごとに記述するのではなく、コード全体を 1 つの try/catch の下にラップすることをお勧めします。

于 2013-01-31T05:54:28.250 に答える