Java servlet能否从响应调用浏览器本机对话框?

Java servlet能否从响应调用浏览器本机对话框?,java,gwt,servlets,pdf,apache-poi,Java,Gwt,Servlets,Pdf,Apache Poi,我有+项目,可以产生一些图表 最近,我为Excel()和pdf()添加了一些导出按钮。 我想要的是: 从客户端代码进行简单且更高效的请求调用最好使用doPOST方法,因为在不久的将来,我应该发送超过1024KB的数据参数。我不确定我的请求,尤其是调用2方法(GET,在收到POST之后)时 确保我的Servlet方法也是有效的 每次打开浏览器的本机对话框。默认情况下,它仅为.xls文件打开。当我看到可以使用.pdf文件时,我问过 在客户端代码中,单击请求的侦听器,如下所示: **我应该更多地使用

我有+项目,可以产生一些图表

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

我想要的是:

  • 从客户端代码进行简单且更高效的请求调用最好使用doPOST方法,因为在不久的将来,我应该发送超过1024KB的数据参数。我不确定我的请求,尤其是调用2方法(GET,在收到POST之后)时
  • 确保我的Servlet方法也是有效的
  • 每次打开浏览器的本机对话框。默认情况下,它仅为.xls文件打开。当我看到可以使用.pdf文件时,我问过

  • 在客户端代码中,单击请求的侦听器,如下所示:
  • **我应该更多地使用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方法中发送了一些数据,以在空白处显示服务器生成的文件(若你们对如何组织这个有更好的想法,请分享)

  • 我的Servlet使用HttpSession在doGET和doPOST方法之间共享数据参数,并为同时调用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();
        }
    }
    
  • 多吉特法,做了很多工作:
  • **因为我再次使用window.open()方法从客户端调用servlet,感觉什么都没发生(这当然太糟糕了)*

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


    所以我的问题是:

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

  • 在不采取任何行动的情况下提高效率

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



  • “(大、重要、有趣)”是什么?这是个bug,我忘了删除。我找到了用浏览器显示对话发送文件的解决方案。
    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();
        }
    }