9

ユーザーがエクスポート ボタンをクリックして GWT アプリケーションから要求する XLSX ファイル (Excel) を生成する ExportServlet があります。

GET アプローチを使用すると、ユーザーはファイルをダウンロードするように求められます。コードは次のようになります。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
{
    try
    {
        byte[] xlsx = createTest("");
        sendXLSX(resp, xlsx, "test.xlsx");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
 }

void sendXLSX(HttpServletResponse response, byte[] bytes, String name)
        throws IOException
{
    ServletOutputStream stream = null;

    stream = response.getOutputStream();
    response.setContentType(CONTENT_TYPE_XLSX);
    response.addHeader("Content-Type", CONTENT_TYPE_XLSX);
    response.addHeader("Content-Disposition", "inline; filename=" + name);
    response.setContentLength((int) bytes.length);
    stream.write(bytes);
    stream.close();
}

これは、GWT クライアントによって次の方法で呼び出されます。

String url = GWT.getModuleBaseURL() + "ExportServlet";
Window.open(url, "", "");

ユーザーはファイルをダウンロードするように求められます。良い、それが私が欲しいものです:)

しかし、リクエストにたくさんのデータを添付したいのですが、URLパラメーターに入れることができるデータの量には制限があるので(「ExportServlet?data = ...」)、ラップしたいと思います代わりに POST リクエストでそれを行います。

GWT から次のことを試しました。

String url = GWT.getModuleBaseURL() + "ExportServlet";
RequestBuilder builder = new RequestBuilder(
                            RequestBuilder.POST, url);
Request response = builder.sendRequest("test data", new RequestCallback() 
{
    @Override
    public void onResponseReceived(Request request, Response response)
    {
        System.out.println("");
    }

    @Override
    public void onError(Request request, Throwable exception)
    {
        System.out.println("");
    }
});

そしてこれは私のサーブレットで:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
{
    try
    {
        String data = req.getReader().readLine();
        byte[] xlsx = createTest(data);
        sendXLSX(resp, xlsx, "test.xlsx");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

ただし、ユーザーはファイルをダウンロードするように求められません。doPost メソッドが呼び出され、データがサーブレットによって受信されますが、GWT アプリで受信した応答から XLSX ファイルを抽出する必要がありますか? そして、どうすればそれを行うことができますか?

ヘルプやコメントに感謝します:)

4

2 に答える 2

8

わかりましたので、リンクされた SO の質問で 3 番目のアプローチを使用しました。

FormPanel を作成し、非表示フィールドにデータを配置し、URL をサーブレットに設定し、フォームでプログラムによって送信メソッドを呼び出すと、この SO の質問で説明されている問題が解決されます。

隠しフィールドからデータを抽出する方法の詳細:

したがって、私の doPost は次のようになります。

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) { 
    ServletFileUpload upload = new ServletFileUpload();
    FileItemIterator iterator = upload.getItemIterator(req);

    while (iterator.hasNext()) {
        FileItemStream item = iterator.next();
        if (item.isFormField()) {
            String name = item.getFieldName();
            if (name.equalsIgnoreCase("fieldName")) {
                data = Streams.asString(item.openStream(), ENCODING_UTF8);
            }
        }
    }
    ...

フォームに「fieldName」という名前の非表示フィールドがあり、そこにデータが配置されてサーブレットに送信されます。お役に立てれば :)

于 2012-08-03T19:44:47.107 に答える
0

こんにちは、私はまったく同じ問題を抱えており、使用してサーブレットを直接呼び出して解決します Window.Location.replace(URL.encode(servletUrl));

このリンクと関連する問題を確認してください

于 2013-12-05T08:28:50.997 に答える