當response提交后,不能調用sendError(),什么意思?
出現這個錯誤,一定是多次response導致的。可以這么理解,承載客戶端和服務器進行Http交互的Socket連接已經關閉了,而你還試圖發送數據給客戶端,顯然會出錯。就好比我倆打電話,我都掛電話了,你還在“喂喂喂”。
例如下面這段代碼就會出現此錯誤:
- import java.io.Writer;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts2.ServletActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- public class LoginAction extends ActionSupport {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String userName;
- private String pwd;
- private String verifyCode;
- private String ajax;
- // 錯誤的寫法
- @Override
- public String execute() throws Exception {
- // 通過ajax登錄
- if (ajax != null) {
- HttpServletResponse response = ServletActionContext.getResponse();
- Writer writer = response.getWriter();
- writer.write("登錄成功!");
- writer.flush();
- writer.close();
- }
- return SUCCESS;
- }
- // 正確寫法
- public String login1() throws Exception {
- if (ajax != null) {
- HttpServletResponse response = ServletActionContext.getResponse();
- Writer writer = response.getWriter();
- writer.write("登錄成功!");
- writer.flush();
- writer.close();
- return null;
- }
- return SUCCESS;
- }
- // 正確寫法
- public String login2() throws Exception {
- if (ajax != null) {
- HttpServletResponse response = ServletActionContext.getResponse();
- Writer writer = response.getWriter();
- writer.write("登錄成功!");
- writer.flush();
- writer.close();
- }
- return null;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getPwd() {
- return pwd;
- }
- public void setPwd(String pwd) {
- this.pwd = pwd;
- }
- public String getVerifyCode() {
- return verifyCode;
- }
- public void setVerifyCode(String verifyCode) {
- this.verifyCode = verifyCode;
- }
- public String getAjax() {
- return ajax;
- }
- public void setAjax(String ajax) {
- this.ajax = ajax;
- }
- }
以上為登錄測試代碼(Struts2),在以上示例中,如果判斷為ajax!=null成立,那么一定會報如題所示的錯誤,原因就是:if子句里已經做了一次response,在writer.close();的時候,本次response已經完成;但是緊接着在return SUCCESS;的時候,相當於又做了一次response,所以就出錯了~
類似的錯誤也會出現於以下代碼中:
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- Writer writer = response.getWriter();
- writer.write("Hello");
- writer.flush();
- writer.close();
- response.sendRedirect("http://blog.csdn.net/baiyanglu/article/details/8076104");
- }
出現本錯誤后,web前端能夠接收到第一次response的內容(就是說,掛電話之前說的話,我還是可以聽到的,掛電話后講的,當然聽不到咯~),不會報錯,只會在后台顯示出錯了