• Cannot call sendError() after the response has been committed


    当response提交后,不能调用sendError(),什么意思?

    出现这个错误,一定是多次response导致的。可以这么理解,承载客户端和服务器进行Http交互的Socket连接已经关闭了,而你还试图发送数据给客户端,显然会出错。就好比我俩打电话,我都挂电话了,你还在“喂喂喂”。

    例如下面这段代码就会出现此错误:

    1. import java.io.Writer;  
    2.   
    3. import javax.servlet.http.HttpServletResponse;  
    4.   
    5. import org.apache.struts2.ServletActionContext;  
    6.   
    7. import com.opensymphony.xwork2.ActionSupport;  
    8.   
    9. public class LoginAction extends ActionSupport {  
    10.   
    11.     /** 
    12.      *  
    13.      */  
    14.     private static final long serialVersionUID = 1L;  
    15.     private String userName;  
    16.     private String pwd;  
    17.     private String verifyCode;  
    18.     private String ajax;  
    19.   
    20.     // 错误的写法  
    21.     @Override  
    22.     public String execute() throws Exception {  
    23.         // 通过ajax登录  
    24.         if (ajax != null) {  
    25.             HttpServletResponse response = ServletActionContext.getResponse();  
    26.             Writer writer = response.getWriter();  
    27.             writer.write("登录成功!");  
    28.             writer.flush();  
    29.             writer.close();  
    30.         }  
    31.         return SUCCESS;  
    32.     }  
    33.   
    34.     // 正确写法  
    35.     public String login1() throws Exception {  
    36.         if (ajax != null) {  
    37.             HttpServletResponse response = ServletActionContext.getResponse();  
    38.             Writer writer = response.getWriter();  
    39.             writer.write("登录成功!");  
    40.             writer.flush();  
    41.             writer.close();  
    42.             return null;  
    43.         }  
    44.         return SUCCESS;  
    45.     }  
    46.   
    47.     // 正确写法  
    48.     public String login2() throws Exception {  
    49.         if (ajax != null) {  
    50.             HttpServletResponse response = ServletActionContext.getResponse();  
    51.             Writer writer = response.getWriter();  
    52.             writer.write("登录成功!");  
    53.             writer.flush();  
    54.             writer.close();  
    55.         }  
    56.         return null;  
    57.     }  
    58.   
    59.     public String getUserName() {  
    60.         return userName;  
    61.     }  
    62.   
    63.     public void setUserName(String userName) {  
    64.         this.userName = userName;  
    65.     }  
    66.   
    67.     public String getPwd() {  
    68.         return pwd;  
    69.     }  
    70.   
    71.     public void setPwd(String pwd) {  
    72.         this.pwd = pwd;  
    73.     }  
    74.   
    75.     public String getVerifyCode() {  
    76.         return verifyCode;  
    77.     }  
    78.   
    79.     public void setVerifyCode(String verifyCode) {  
    80.         this.verifyCode = verifyCode;  
    81.     }  
    82.   
    83.     public String getAjax() {  
    84.         return ajax;  
    85.     }  
    86.   
    87.     public void setAjax(String ajax) {  
    88.         this.ajax = ajax;  
    89.     }  
    90. }  

    以上为登录测试代码(Struts2),在以上示例中,如果判断为ajax!=null成立,那么一定会报如题所示的错误,原因就是:if子句里已经做了一次response,在writer.close();的时候,本次response已经完成;但是紧接着在return SUCCESS;的时候,相当于又做了一次response,所以就出错了~


    类似的错误也会出现于以下代码中:

    1. protected void doGet(HttpServletRequest request, HttpServletResponse response)   
    2.                 throws ServletException, IOException {  
    3.             Writer writer = response.getWriter();  
    4.             writer.write("Hello");  
    5.             writer.flush();  
    6.             writer.close();  
    7.   
    8.             response.sendRedirect("http://blog.csdn.net/baiyanglu/article/details/8076104");  
    9.         }  

    出现本错误后,web前端能够接收到第一次response的内容(就是说,挂电话之前说的话,我还是可以听到的,挂电话后讲的,当然听不到咯~),不会报错,只会在后台显示出错了

     以上,转自http://www.cnblogs.com/wang3680/p/2c5f28ecfb8c2e2772474f3fab4d771c.html

  • 相关阅读:
    学习心得——王梦茹
    优秀学生专栏——孙珩发
    优秀学生专栏——孙振涛
    学习心得——李嫣然、逯广捷
    Spring和Hibernate集成声明式事务 小强斋
    Hibernate——编程式事务 小强斋
    设计模式>原则 小强斋
    Spring>JDK动态代理和CGLIB字节码生成 小强斋
    Hibernate——编程式事务 小强斋
    设计模式>原则 小强斋
  • 原文地址:https://www.cnblogs.com/beijingstruggle/p/6522999.html
Copyright © 2020-2023  润新知