我有一个带有单个按钮的页面(为简单起见)。该按钮要求服务器生成文件并将其返回。这没有任何障碍。当服务器生成文件时出于问题(无论出于何种原因),那么没有任何反应,而不是返回一个空文件。这会导致页面为空白(就像以前一样,这是我上传文件的最后一页)。
如何从该功能将错误消息发送回上一页(暂时不使用AJAX)?带有错误消息的空白页面不是我正在寻找的。 p>
controller.java
@ResourceMapping
public void getFile(ResourceRequest request, ResourceResponse response) {
String zipName = "myfile.zip";
try {
//Do something that might throw an error
response.setProperty("Content-Disposition", "attachment; filename=" + zipName);
response.setContentType("application/zip");
//Write to output stream here
} catch(Exception e) {
myLogger.error("Error from throwable: " + e.getMessage());
//Send error message to user on the last page without getting a blank screen
}
view.jsp的
${lastError}
<form method="post" action="<portlet:resourceURL/>">
<input type="checkbox" name="Modify File" value="true" />
<input type="submit" value="Get File" />
</form>
答案 0 :(得分:2)
你得到空白页面,因为你没有做任何回应。
在创建ResourceRequest时,您的响应始终只是您放入ResorceResponse的内容, 您永远不会将门户页面作为响应(甚至不是其中的一部分)。
所以你想要做的就像现在一样,是不可能的。你必须改变你的方法。
最简单(不是最好的)解决方法是
<form method="post" action="<portlet:resourceURL/>" target="_blank">
<input type="checkbox" name="Modify File" value="true" />
<input type="submit" value="Get File" />
</form>
注意target="_blank"
。
你的控制器......
@ResourceMapping
public void getFile(ResourceRequest request, ResourceResponse response) {
String zipName = "myfile.zip";
try {
response.setProperty("Content-Disposition", "attachment; filename=" + zipName);
response.setContentType("application/zip");
//Write to output stream here
} catch(Exception e) {
myLogger.error("Error from throwable: " + e.getMessage());
// write the error message to the response stream here.
response.setContentType("text/plain");
response.getWriter().print("last error");
}
}
这样您就可以在新窗口中获取文件或错误,使门户网站保持原样。
其他选项:AJAX或您的回复可能是带有javascript的html,它向您的门户页面发出请求,并附带错误参数,...
答案 1 :(得分:0)
你真的需要一张表格吗?你不能只使用href
设置为<portlet:resourceURL/>
的链接吗?
另外,为什么在发送zip文件时将内容类型设置为纯文本?我希望它只适用于错误情况。
我认为您可以根据try / catch的结果拆分响应生成逻辑。
@ResourceMapping
public void getFile(ResourceRequest request, ResourceResponse response) {
String zipName = "myfile.zip";
try {
response.setProperty("Content-Disposition", "attachment; filename=" + zipName);
response.setContentType("application/zip");
//Write to output stream here
} catch(Exception e) {
myLogger.error("Error from throwable: " + e.getMessage());
// write the error message to the response stream here.
response.setContentType("text/plain");
}
}