2012-05-01 4 views
1

Я знаю, что это обсуждалось не менее миллиона раз здесь, но каждый сервлет перенаправлял или удалял вывод перед вызовом forward(). У меня такая же проблема, но я ничего не делаю с выходом. Мой сервлет просто принимает параметры запроса и записывается в базу данных и устанавливает атрибут запроса. Затем он перенаправляет запрос на jsp, который отображает атрибут. Я использую Servlet 3.0 на Tomcat 7. Вот мой метод сервлета doPost следовал бют СПЯ, что это переадресация на:java.lang.IllegalStateException: не удалось переслать после того, как ответ был совершен

@Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     super.doPost(req, resp); 

     DAOFactory daoFactory = DAOFactory.getFactory(); 
     daoFactory.getCompanyDAO().beginTransaction(); 

     Company company = new Company(); 
     company.setName(req.getParameter("companyName")); 
     company.setContactEmail(req.getParameter("companyEmail")); 
     company.setContactPhone(new Long(req.getParameter("companyMobile"))); 
     company.setAddressLine1(req.getParameter("companyAddressLine1")); 
     company.setAddressLine2(req.getParameter("companyAddressLine2")); 
     company.setCity(req.getParameter("companyCity")); 
     company.setZipcode(Integer.parseInt(req.getParameter("companyZip"))); 
     company.setState(req.getParameter("companyState"));  
     company = daoFactory.getCompanyDAO().save(company); 
     daoFactory.getCompanyDAO().commitTransaction(); 

     Employee owner = new Employee(); 
     owner.setFirstname(req.getParameter("ownerFirstName")); 
     owner.setLastname(req.getParameter("ownerLastName")); 
     owner.setEmail(req.getParameter("ownerEmail")); 
     owner.setMobileNum(new Long(req.getParameter("ownerCellPhone"))); 
     owner.setZipcode(Integer.parseInt(req.getParameter("ownerZip"))); 
     owner.setRole("Employer"); 
     owner.setCompany(company); 
     daoFactory.getEmployeeDAO().beginTransaction(); 
     owner = daoFactory.getEmployeeDAO().save(owner); 
     daoFactory.getEmployeeDAO().commitTransaction(); 

     company.addEmployee(owner); 
     company.setOwnerId(owner.getId()); 

     daoFactory.getCompanyDAO().beginTransaction(); 
     company = daoFactory.getCompanyDAO().save(company); 
     daoFactory.getCompanyDAO().commitTransaction(); 

     req.setAttribute("company", company); 
     RequestDispatcher rd = getServletConfig().getServletContext().getRequestDispatcher("/jsp/companyConfirmation.jsp"); 
     rd.forward(req, resp); 

    } 

JSP:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Insert title here</title> 
</head> 
<body> 
<h3>The Company was saved successfully</h3> 
<p> 
Company name: ${company.name} 
</p> 
</body> 
</html> 

Я уверен, что, возможно, пропустил что-то очень тривиальный. Я не могу понять, что это особенно, когда я не пишу ничего на выходе перед отправкой запроса.

PS: Я также попытался поставить заявление return; после форварда, но без изменений.

Спасибо!

+0

Что такое код, который выполняется super.doPost()? – Marvo

+1

Это была проблема super.doPost(), которая вызывала проблему. Спасибо за подсказку. – motiver

ответ

4

Вы должны удалить вызов метода super.doPost(req, resp). По умолчанию реализация метода doPost из HTTPServlet возвращает код статуса HTTP 405, означающий «Метод не поддерживается», и это ответ, который был совершен. Поэтому вы не можете перенаправить свой запрос на другой jsp.

Это часть описания метода RequestDispatcher.forward(ServletRequest req, ServletResponse resp): «forward должен быть вызван до того, . Незафиксированный вывод в буфере ответа автоматически очищается перед переходом ".

+0

Это было! Спасибо за подсказку. – motiver

Смежные вопросы

 Смежные вопросы