2012-05-01 73 views
1

我知道這裏至少討論了一百萬次,但是在調用forward()之前,每個servlet都重定向或刷新輸出。我有同樣的問題,但我沒有對輸出做任何事情。我的servlet只是接受請求參數並提交給數據庫並在請求中設置一個屬性。然後,它將請求轉發給一個jsp,它將顯示該屬性。我使用的Servlet 3.0在Tomcat 7這裏是我的servlet doPost方法遵循BYT,這是轉發到JSP: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)方法調用。來自HTTPServlet的doPost方法的默認實現返回HTTP 405狀態碼,意思是「Method not supported」,並且這是已經提交的響應。因此,您無法將您的請求轉發給其他jsp。

這是RequestDispatcher.forward(ServletRequest req, ServletResponse resp)方法描述的一部分:「之前的響應一直致力於給客戶端(響應主體輸出已被刷新之前)向前應該被稱爲如果響應已經一直致力於,該方法拋出IllegalStateException 。響應緩衝區中未提交的輸出在前向之前自動清除「。

+0

這樣做!感謝提示。 – motiver

相關問題