0

RPCService、RPCServiceAsync、RPCServieImpl を実装しました。ボタンをクリックすると、サーバー側のサービスが呼び出され、DB からデータが取得され、ファイルが作成されます。ファイルが作成されたら、クライアント側でそのファイルを開く必要があり、開く/保存するオプションを含むダイアログ ボックスを表示する必要があります。このファイルを開く部分を実装するにはどうすればよいですか。plsはtを実装する方法を提案します..返信pls..前もって感謝します....

@Hambend:私はまだもう1つの説明があります!..別のサーブレットでこのdoGetメソッドを呼び出す方法、つまり私のonmoduleロードクラスで、私は別々のレイアウトで多くのウィジェットを持っています.そのようなウィジェットの1つは BUTTON ですか? このボタンをクリックすると、サービス RPCServiceImpl が呼び出され、すべての操作が完了し、serperate 関数 (public int GenerateFile(String name)() ) でファイルが作成されます。その関数を doGet メソッドを呼び出すようにする方法は? doGet はリクエスト、レスポンス パラメータを一緒に渡す必要があるため?? そのメソッドを呼び出す方法を教えてください。前もって感謝します

4

2 に答える 2

5

GWTのRPCサービスは、Javaオブジェクトをクライアントに送り返すことしかできません。ファイルをユーザーに送り返すには、GWT以外のJavaサーブレットを使用する必要があります。これは、リポジトリからjpeg画像を提供するために以前に使用したコードです。

public class ImageServlet extends HttpServlet {
    private final String repository = "/var/images/";

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        String filename = request.getParameter("file");

        // Security: '..' in the filename will let sneaky users access files
        // not in your repository.
        filename = filename.replace("..", "");

        File file = new File(repository + filename);
        if (!file.exists())
            throw new FileNotFoundException(file.getAbsolutePath());

        response.setHeader("Content-Type", "image/jpeg");
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-disposition", "attachment;filename=\"" + filename + "\"");

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
        byte[] buf = new byte[1024];
        while (true) {
            int length = bis.read(buf);
            if (length == -1)
                break;

            bos.write(buf, 0, length);
        }
        bos.flush();
        bos.close();
        bis.close();
    }
}

「Content-disposition:attachment」を使用すると、ほとんどのブラウザでファイルが表示されるのではなくダウンロードされ、ファイル名はデフォルトで指定されたものになります。このサーブレットを使用する方法は、ユーザーに既存のRPCServiceを呼び出させることです。これにより、ファイルがリポジトリフォルダーに保存されます。次に、http://your.domain.com/fileServlet? file = myFile.jpgなどのURLを使用して、それらをこのサーブレットにリンクまたはリダイレクトします。明らかに、この設定では、ユーザーがファイル名を推測できる場合に他の人のファイルをダウンロードできるというセキュリティリスクがあります。

あなたがしたいと思うかもしれないことはあなたのRPCサービスからこのサーブレットにデータベースコードをマージすることです。サーバー上のどこかにファイルを保存する必要はありません。データベースの結果を取得して、ファイルに書き込むのとまったく同じ方法でresponse.getOutputStream()またはresponse.getWriter()に書き込むことができますが、結果は次のようになります。ユーザーに直接。コンテンツヘッダーを正しく設定している限り、ユーザーは違いに気付くことはありません。

別のサーブレットからこのメソッドを呼び出すことはできません。ブラウザにファイルとしてダウンロードさせる唯一の方法は、通常のHTTPリクエストを介してアクセスすることです。まず、GWT RPCサービスと同じように、web.xmlファイルでサーブレットを宣言します。

<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>
        com.package.ImageServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/imageServlet</url-pattern>
</servlet-mapping>

これで、 http://your.tomcat.server/webapp/imageServletに送信されるHTTP GETリクエストは、ImageServlet.doGet()によって取得されます。次に、クライアント側で、ファイルへの通常のhtmlリンクを作成できます。

new HTML("<a href='" + GWT.getHostPageBaseURL() + "imageServlet?file=" + filename + "'>download</a>");

...または、これをClickHandlerに入れることができるはずです(私はテストしていません):

Window.Location.assign(GWT.getHostPageBaseURL() + "imageServlet?file=" + filename);
于 2010-06-16T23:00:27.753 に答える
0

ファイルがテキストの場合は、常に文字列の配列を持つオブジェクトを戻します。
バイナリの場合は、クラス内の単に byte[] で十分です。

于 2010-06-17T01:34:06.323 に答える