最近,我为 Excel ( ApachePOI ) 和 pdf ( wkhtmltopdf ) 添加了一些导出按钮。
我想要的是:
- 来自客户端代码的简单和更有效的请求调用在 doPOST 方法中的TODO更可取,因为在不久的将来我应该发送超过 1024kBytes 的数据参数。我不确定我的请求,尤其是调用 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();
}
}
- 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,在我有问题或不确定的地方写了一些评论。
所以我的烦恼是:
使用来自客户端的一个请求
在没有任何行为的情况下更有效地做事
将文件发送到浏览器显示待办事项对话框的客户端(打开或保存,确定或取消)?