我的ExportServlet正在生成XLSX文件(Excel),我的用户将通过单击导出按钮从我的GWT应用程序请求。
如果我使用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, "", "");
并提示用户下载该文件。好的,这就是我想要的东西:)。
但是我想在请求中附加大量数据,而afaik,你可以在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("");
}
});
这在我的servlet中:
@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方法并且servlet接收数据,但我是否应该从GWT应用程序中收到的响应中提取XLSX文件?我怎么想这样做?
感谢任何帮助或评论:)
答案 0 :(得分:7)
好的,所以我在链接的SO问题中使用了第3种方法。
创建一个FormPanel,将您的数据放入隐藏字段,设置您的servlet的URL,在表单上以编程方式调用submit方法,并解决此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”的隐藏字段,其中数据被放入并提交给servlet。希望这会有所帮助:)
答案 1 :(得分:1)
您好我有完全相同的问题,并通过使用直接调用servlet来解决它
Window.Location.replace(URL.encode(servletUrl));
同时检查此链接related Issue