Forward on committed response错误

原来用struts1.1使用如下注释掉的代码一切正常,

 


if (target.equals("messageSuccess")) {

/*// changed Struts version from 1.1 to 1.2.9, this will generate error: Forward on committed response

PrintWriter out;

response.setContentType("text/html;charset=utf-8");

out = response.getWriter();

out.println(

"<script language=\"JavaScript\" type=\"text/javascript\">");

out.println("alert(\"感谢您对本站提出的宝贵意见和建议!回复见公告牌中的'回复网友留言集'。\")");

out.println("</script>");

out.flush();

*/

request.setAttribute("isMessage", "true");

}

换为struts1.2.9后就出现:Forward on committed response错误(Tomcat5.0控制台debug);在网站上运行resin2.1.12在页面上报错:

500 Servlet Exception

java.lang.IllegalStateException: forward() not allowed after buffer has

committed.

at com.caucho.server.http.QRequestDispatcher.forward(QRequestDispatcher.java:131)

at com.caucho.server.http.QRequestDispatcher.forward(QRequestDispatcher.java:103)

at com.caucho.server.http.QRequestDispatcher.forward(QRequestDispatcher.java:80)

at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)

at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:165)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)

at com.caucho.server.http.FilterChainServlet.doFilter(FilterChainServlet.java:96)

at com.learndiary.website.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:102)

at com.caucho.server.http.FilterChainFilter.doFilter(FilterChainFilter.java:88)

at com.caucho.server.http.Invocation.service(Invocation.java:315)

at com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:346)

at com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:274)

at com.caucho.server.TcpConnection.run(TcpConnection.java:139)

at java.lang.Thread.run(Thread.java:595)

--------------------------------------------------------------------------------

Resin 2.1.12 (built Tue Dec 9 14:58:25 PST 2003)

经过查资料,发现是PrintWriter已经返回用户数据后,就不能再forward到其它页面了。也就是这个错误:

forward should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed, this method throws an IllegalStateException. Uncommitted output in the response buffer is automatically cleared before the forward. forward应当在响应提交给客户端之前调用(响应体输出被刷新前)。如果响应已经被提交,该方法抛出IllegalStateException。响应缓存中未提交的输出在转发之前自动清空。

所以就不在Action中写提示信息了,而把其移动jsp页面,如下:


  <c:if test="${requestScope['isMessage'] == true }">

   <script language="JavaScript" type="text/javascript">

    alert("感谢您对本站提出的宝贵意见和建议!回复见公告牌中的'回复网友留言集'。")

   </script>

  </c:if>

同时,我发现如果在Action中用的是request.setAttribute("isMessage", "true");

则在页面中可以  <c:if test="${requestScope['isMessage'] == true }">

注意,上面的“true”是没有加引号的,可能这就是c:if的boolean类型吧,我也没有去查资料;

但是,如果为:request.setAttribute("isMessage", "otherString");

则必须这样:  <c:if test="${requestScope['isMessage'] == \"otherString\"); }">

就是要加双引号,而且要进行转意。