HTTP状态500 - 在提交响应后无法转发

时间:2014-03-31 18:43:49

标签: java java-ee servlets

我该如何解决这个问题?我尝试了很多东西,并在这里看了很多不同的东西,同样的问题,但我无法解决它。有人可以解释发生了什么。如果它有帮助,我希望客户提交一个表单,一旦它们进入servlet并将其发送到收据,他们会看到他们输入的信息。如果有一个更容易的解决方案,我会全力以赴。

下面是stacktrace

Mar 31, 2014 2:40:17 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [edu.witc.Assignment03.controller.CustomerServlet] in context with path [/Justin_EJ_Assignment03_15400579] threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:348)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
    at edu.witc.Assignment03.controller.CustomerServlet.sendCustomerInfo(CustomerServlet.java:85)
    at edu.witc.Assignment03.controller.CustomerServlet.doPost(CustomerServlet.java:139)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

SERVLET

package edu.witc.Assignment03.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//import javax.servlet.annotation.WebServlet;
//import javax.servlet.http.HttpServlet;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;




import javax.servlet.http.HttpSession;

import edu.witc.Assignment03.model.Customer;
import edu.witc.Assignment03.model.Phone;
import edu.witc.Assignment03.model.States;


@WebServlet(description = "servlet to get act as controller between form and models", urlPatterns = { "/customerServlet" })
public class CustomerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public CustomerServlet() {
        super();
    }

    private void processRequest(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        HttpSession session = request.getSession();

        //create the JavaStudents object    
        Phone phone = new Phone();

        //declare the student collection
        Collection<Phone> phones = phone.getPhoneCollection();
        //flesh out the collection from the arraylist
        //students = new JavaStudents().getStudents();
        //System.out.println("hey " + students.size());
        //store the JavaStudents object in the session
        //if(session != null){
            session.setAttribute("phones", phones);
            request.getRequestDispatcher("/customerManagement.jsp").forward(request, response);
        //}

    }






    private edu.witc.Assignment03.model.States states = new States();
    private List<edu.witc.Assignment03.model.Customer> customers = new ArrayList<Customer>();



 private void addCustomer(HttpServletResponse response, HttpServletRequest request)//redirect to index
           throws IOException, ServletException {
    String url = "/receipt.jsp";
        request.setAttribute("customers", customers);
        request.getRequestDispatcher(url).forward(request,response);
    }

    private void editCustomer(HttpServletResponse response, HttpServletRequest request)//redirect to index
           throws IOException, ServletException {
        String url = "/customerManagement.jsp";
        request.setAttribute("customers", customers);
    request.getRequestDispatcher(url).forward(request,response);
    }

    private void sendCustomerInfo(HttpServletResponse response, HttpServletRequest request)//redirect to index
            throws IOException, ServletException {
        String url = "/receipt.jsp";
        request.setAttribute("customers", customers);
        request.getRequestDispatcher(url).forward(request,response);




    }

    private Customer getCustomer(int customerId) {
        for (Customer customer : customers) {
            if (customer.getCustomerId() == customerId) {
                return customer;
            }
        }
        return null;
    }



    private void sendEditCustomerForm(HttpServletRequest request, 
            HttpServletResponse response) throws IOException, ServletException {

        String url = "/customerManagement.jsp";
        request.setAttribute("customers", customers);
        request.getRequestDispatcher(url).forward(request,response);
    }






    public void doPost(HttpServletRequest request, 
            HttpServletResponse response)
            throws ServletException, IOException {

           processRequest(request, response);
        // update customer
        int customerId = 0;
        try {
            customerId = 
                    Integer.parseInt(request.getParameter("id"));
        } catch (NumberFormatException e) {
        }
        Customer customer = getCustomer(customerId);
        if (customer != null) {
            customer.setFirstName(request.getParameter("firstName"));
            customer.setLastName(request.getParameter("lastName"));
            customer.setEmail(request.getParameter("email"));
            customer.setPhone(request.getParameter("phone"));
            customer.setAddress(request.getParameter("address"));
            customer.setCity(request.getParameter("city"));

            customer.setZip(request.getParameter("zip"));
        }
        sendCustomerInfo(response, request);
    }
}

2 个答案:

答案 0 :(得分:2)

doPost()方法中,您使用以下两种方法发送回复

processRequest(request, response);
sendCustomerInfo(response, request);

因此,在调用sendCustomerInfo(response, request)时,您将获得此异常,因为processRequest方法已经提交了响应

答案 1 :(得分:0)

如果没有看到任何代码,很难告诉你该做什么。然而,正在发生的是:

  edu.witc.Assignment03.controller.CustomerServlet.sendCustomerInfo(CustomerServlet.java:85)

您要将回复转发给其他人。

但您之前已在回复中发送了一些内容。你无法做到的。您必须发送回复,或将请求转发给其他人。你不能做到这两点。