使用@ResourceMapping时显示包含错误消息的最后一页

时间:2012-03-06 21:50:25

标签: spring jsp liferay

我有一个带有单个按钮的页面(为简单起见)。该按钮要求服务器生成文件并将其返回。这没有任何障碍。当服务器生成文件时出于问题(无论出于何种原因),那么没有任何反应,而不是返回一个空文件。这会导致页面为空白(就像以前一样,这是我上传文件的最后一页)。

如何从该功能将错误消息发送回上一页(暂时不使用AJAX)?带有错误消息的空白页面不是我正在寻找的。

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>

2 个答案:

答案 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");
    }
}