forward(request, response)问题,偶尔空白,随机性的!

Dones 2008-06-18 03:39:54
问题陈述如下:
Java servlet,在执行跳转forward时,偶尔会出现异常。
所执行的页面,就是一张空白的页面,邮件查看源文件,是几行系统产生的HTML。
偶尔出现一次,应该是随机性的异常。
刷新一下,又OK了。
导致客户总认为程序不够稳定。。。TNND!

根据错误日志,在Google、Baidu搜了一大堆。
都说是在response输出之后执行Forward的原因。狗屁,压根就没输出过嘛!
也有的说,是response的buffer溢出了。
莫名其妙。
也不知是啥子原因。

Servlet代码如下:
//doPost()
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

String realName = request.getParameter("_realName");

//...

sessionUtil.removeAttribute(SESSION_NAME);
getServletContext().getRequestDispatcher("/msg.jsp").forward(request, response);
return ;
}




Tomcat5.5日志如下:
严重: Servlet.service() for servlet com.xxx.xxx.xxx.AddGuestDo threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed


...全文
318 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dones 2009-05-19
  • 打赏
  • 举报
回复
废除手写Servlet,改用Struts就好了!


郁闷,结贴!

liaojingzh 2008-08-04
  • 打赏
  • 举报
回复
朋友,去掉return试试
无缝2013 2008-08-04
  • 打赏
  • 举报
回复
我也有同样的问题,再传值得时候报空指针异常
这是servlet端
response.setContentType("text/html");
request.getSession().setAttribute("id",ll.searchResult);
ServletContext sc = getServletContext();
RequestDispatcher dispatcher = sc.getRequestDispatcher("search.jsp");
dispatcher.forward(request, response);
这是jsp接受:

Vector con=(Vector)session.getAttribute( "id ");
  • 打赏
  • 举报
回复
response.setCharacterEncoding("utf-8");
应该是这句的原因吧。

至于随机性可能是浏览器缓存,或者别的什么原因。。。。个人认为
Dones 2008-08-04
  • 打赏
  • 举报
回复
楼上的,说话,真逗。

dryZeng 2008-08-01
  • 打赏
  • 举报
回复
去掉forward(request, response)呢.
Dones 2008-08-01
  • 打赏
  • 举报
回复
莫名的。
yeezai 2008-06-19
  • 打赏
  • 举报
回复
getServletContext().getRequestDispatcher("/msg.jsp").forward(request, response);
在页面跳转之后不能再有任何输出,空格也不行
Cannot forward after response has been committed
也就是说,在这句之后你可能还有out.println();之类的语句,但不一定是在这个servlet里
请仔细检查,我遇到过N多次了
java资料太多?在网页中选中想收藏的文字(图片),右键选“收录到易载”,搞定!
树成 2008-06-19
  • 打赏
  • 举报
回复
你没有发出具体的异常信息,所以不好判断是哪个地方出了什么错误,一般来说只要能够定位错误出现在哪一行代码就能够轻松解决错误。
从你错误的信息来看,似乎是在你在你转发之前,响应已经完成,我以前也出现过类似的错误,这种错误在于前面执行了一次forward操作以后,后面又再执行一次forward操作出现的情况,这样就会造成你所遇到的那种错误。
如果你的代码是随机出现的,可能是你的某个if判断语造成了可能性分支,如果这个servlet没有if语句,也可能是你在执行这个servlet之前的某个servlet后者过滤器执行了某个转发操作,这些操作也应该是在某些特定条件下才触发的,而转发并非当前servlet而造成的错误。
Dones 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yeezai 的回复:]
getServletContext().getRequestDispatcher("/msg.jsp").forward(request, response);
在页面跳转之后不能再有任何输出,空格也不行
Cannot forward after response has been committed
也就是说,在这句之后你可能还有out.println();之类的语句,但不一定是在这个servlet里
请仔细检查,我遇到过N多次了
java资料太多?在网页中选中想收藏的文字(图片),右键选“收录到易载”,搞定!
[/Quote]

这只Servlet程序,就是一只简单的部署在web.xml下面的Servlet;
不涉及Struts等其他的东东,也不再Filter范围内。
加一块儿才150多行代码,压根就找不到response的相关操作。

莫名其妙。
Dones 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 spiniper 的回复:]
你没有发出具体的异常信息,所以不好判断是哪个地方出了什么错误,一般来说只要能够定位错误出现在哪一行代码就能够轻松解决错误。
从你错误的信息来看,似乎是在你在你转发之前,响应已经完成,我以前也出现过类似的错误,这种错误在于前面执行了一次forward操作以后,后面又再执行一次forward操作出现的情况,这样就会造成你所遇到的那种错误。
如果你的代码是随机出现的,可能是你的某个if判断语造成了可能性分支,如果这个…
[/Quote]

2008-6-19 1:02:06 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet com.senhe.vote.guest.AddGuestDo threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.xxx.xxx.xxx.AddGuestDo.doPost(AddGuestDo.java:152)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)

AddGuestDo.java第152行,对应的竟然是doPost()末尾的花括号。
//doPost()
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
...
}
zhengguo07q 2008-06-18
  • 打赏
  • 举报
回复
觉得可能是把服务器buffer改成0了 然后又在中间语句中调用过任何修改buffer的语句~造成buffer的刷新
Dones 2008-06-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 justforjoy 的回复:]
引用 4 楼 Dones 的回复:
去掉 response.setCharacterEncoding("utf-8") ;
重启 Tomcat,还是异常。
右键查看源代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML> <HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312"> </HEAD>
<BODY> </BODY> </HTML>



你这样写的话,request还是按gb2312编码的。
而你强制改变request的编码为utf-8,个人认为是不对…
[/Quote]

去,扯开嗓门,把原文念两遍!
搞清楚我问什么先……
justforjoy 2008-06-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Dones 的回复:]
去掉 response.setCharacterEncoding("utf-8") ;
重启 Tomcat,还是异常。
右键查看源代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML> <HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312"> </HEAD>
<BODY> </BODY> </HTML>
[/Quote]


你这样写的话,request还是按gb2312编码的。
而你强制改变request的编码为utf-8,个人认为是不对的。
justforjoy 2008-06-18
  • 打赏
  • 举报
回复
String realName = request.getParameter("_realName");

是否是在输入其他国家语言的字符的时候抛出了异常?比如说日本,德文?
Dones 2008-06-18
  • 打赏
  • 举报
回复
去掉 response.setCharacterEncoding("utf-8") ;
重启 Tomcat,还是异常。
右键查看源代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312"></HEAD>
<BODY></BODY></HTML>
Dones 2008-06-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 al_you_ge 的回复:]
没输出你给response编码干啥!
去掉试试?
[/Quote]

真要测试的时候,又没发现错误。
这一类随机性的错误,不好找。

再一个,如果真是 response.setCharacterEncoding("utf-8") 闯的祸;
那有为什么会随机性的出现异常,而不是始终出现异常?

呼。。。
al_you_ge 2008-06-18
  • 打赏
  • 举报
回复
没输出你给response编码干啥!
去掉试试?
Transformer发轫于NLP(自然语言处理),并跨界应用到CV(计算机视觉)领域。目前已成为深度学习的新范式,影响力和应用前景巨大。  本课程对Transformer的原理和PyTorch代码进行精讲,来帮助大家掌握其详细原理和具体实现。  原理精讲部分包括:注意力机制和自注意力机制、Transformer的架构概述、Encoder的多头注意力(Multi-Head Attention)、Encoder的位置编码(Positional Encoding)、残差链接、层规范化(Layer Normalization)、FFN(Feed Forward Network)、Transformer的训练及性能、Transformer的机器翻译工作流程。   代码精讲部分使用Jupyter Notebook对Transformer的PyTorch代码进行逐行解读,包括:安装PyTorch、Transformer的Encoder代码解读、Transformer的Decoder代码解读、Transformer的超参设置代码解读、Transformer的训练示例(人为随机数据)代码解读、Transformer的训练示例(德语-英语机器翻译)代码解读。相关课程: 《Transformer原理与代码精讲(PyTorch)》https://edu.csdn.net/course/detail/36697《Transformer原理与代码精讲(TensorFlow)》https://edu.csdn.net/course/detail/36699《ViT(Vision Transformer)原理与代码精讲》https://edu.csdn.net/course/detail/36719《DETR原理与代码精讲》https://edu.csdn.net/course/detail/36768《Swin Transformer实战目标检测:训练自己的数据集》https://edu.csdn.net/course/detail/36585《Swin Transformer实战实例分割:训练自己的数据集》https://edu.csdn.net/course/detail/36586《Swin Transformer原理与代码精讲》 https://download.csdn.net/course/detail/37045

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧