0

我有GWT + Ext GWT项目,可以生成一些图表。

最近,我为 Excel ( ApachePOI ) 和 pdf ( wkhtmltopdf ) 添加了一些导出按钮。

我想要的是:

  1. 来自客户端代码的简单和更有效的请求调用在 doPOST 方法中的TODO更可取,因为在不久的将来我应该发送超过 1024kBytes 的数据参数。我不确定我的请求,尤其是调用 2 方法(GET,在收到 POST 后),这从这里得到启发
  2. 确保我的 Servlet 方法也很有效。
  3. 每次打开浏览器的原生对话框。默认情况下,它仅针对.xls文件打开。正如我看到的.pdf文件是可能的,我问.

  1. 从客户端代码单击请求侦听器如下所示:

**我应该更多地使用 MIME 类型吗?*

String fileExtension ="application/x-www-form-urlencoded";
if (extension.equals("pdf"))
{
    sURLforRequest = GWT.getHostPageBaseURL() + "requiredPDF";
    fileExtension = "application/pdf";
}
else if (extension.equals("xls"))
{
    sURLforRequest = GWT.getHostPageBaseURL() + "requiredXLS";
    fileExtension = "application/x-www-form-urlencoded";
}

RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, sURLforRequest);
//this is important
builder.setHeader("Content-type", fileExtension);
//builder.setHeader("Content-type", "application/x-www-form-urlencoded");
//builder.setHeader("Content-type", "application/octet-stream");

builder.sendRequest(sData, new RequestCallback() {
    @Override
    public void onResponseReceived(Request request, Response response) {
        //TODO: replace with servleet link
        Window.open(sURLforRequest, "_parent", "location=no");

    }
    @Override
    public void onError(Request request, Throwable exception) {
        MessageBox.alert("Request error","The page doesn't open", null);
    }
});

如您所见,我在 POST 请求中发送了一些数据并调用 GET 方法以空白显示服务器生成的文件(如果您有更好的想法如何组织这个,请分享)。

  1. 我的 Servlet 使用HttpSession在doGETdoPOST方法之间共享数据参数,并为同时调用 Servlet 的多个用户提供可能的适当答案:

**暂时没有什么特别的*

@Override
public void doPost(HttpServletRequest request, HttpServletResponse resp)
        throws javax.servlet.ServletException, java.io.IOException
{
    try {
        request.setCharacterEncoding("utf-8");
        session = request.getSession();

        //global
        session.setAttribute("vDateFrom",request.getParameter("vDateFrom"));
        ...
        session.setAttribute("vChartType",request.getParameter("vChartType"));

        //doPost(request,resp);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
  1. doGet 方法做了很多工作:

**因为我从客户端再次使用 window.open() 方法调用 servlet,感觉就像什么都没发生(这当然太糟糕了)*

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
{
    try {

        //CreateHtmlFile();
        request.setCharacterEncoding("utf-8");

        lDateFrom = Long.parseLong(request.getSession().getAttribute("vDateFrom").toString());
        ...

        CreateHtmlFile(...);

        ConvertHTMLtoPDF(servletContext.getRealPath("wkhtmltopdf/wkhtmltopdf.exe"),
                servletContext.getRealPath("PDFtemplate/requiredPDF.html"),
                servletContext.getRealPath("PDFtemplate/Report.pdf"));

        //Now I have required .pdf-files, 
        //BUT HOW TO SEND IT TO CLIENT SIDE WITH BROWSER ASK WHAT TODO

        //I used to call this before, but it seems not so correct
        //response.sendRedirect(servletContext.getRealPath("PDFtemplate/Report.pdf"));

        //What is I'm thinking about
        BufferedReader reader = new BufferedReader(
                new FileReader(servletContext.getRealPath("XLStemplate/reportXLS.xlsx")));

        response.setContentType("application/pdf; charset=UTF-8");
        PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF8"), true);

        char[] buf = new char[4 * 1024]; // 4Kchar buffer
        int len;
        while ((len = reader.read(buf, 0, buf.length)) != -1) {
            out.write(buf, 0, len);
        }
        out.flush();

    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

我为 pdf 使用了一个 servlet,在我有问题或不确定的地方写了一些评论。


所以我的烦恼是:

  1. 使用来自客户端的一个请求

  2. 在没有任何行为的情况下更有效地做事

  3. 将文件发送到浏览器显示待办事项对话框的客户端(打开或保存,确定或取消)?


4

0 回答 0