1

これについては、ここで少なくとも100万回議論されていることは知っていますが、すべてのサーブレットは、forward()を呼び出す前に出力をリダイレクトまたはフラッシュしていました。同じ問題がありますが、出力には何もしていません。私のサーブレットは、リクエストパラメータを受け取り、データベースにコミットして、リクエストに属性を設定するだけです。次に、リクエストをjspに転送し、jspに属性を表示します。Tomcat7でサーブレット3.0を使用しています。これが私のサーブレットのdoPostメソッドであり、その後にこれが転送先のjspが続きます。

@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;フォワードの後に​​ステートメントを入れてみましたが、変更はありませんでした。

ありがとう!

4

1 に答える 1

4

super.doPost(req, resp)メソッド呼び出しを削除する必要があります。HTTPServletからのdoPostメソッドのデフォルトの実装は、「メソッドはサポートされていません」を意味するHTTP 405ステータスコードを返します。これは、コミットされた応答です。したがって、リクエストを他のjspに転送することはできません。

これはRequestDispatcher.forward(ServletRequest req, ServletResponse resp)メソッドの説明の一部です。「応答がクライアントにコミットされる前に(応答本文の出力がフラッシュされる前に)forwardを呼び出す必要があります。応答がすでにコミットされている場合、このメソッドはIllegalStateExceptionをスローします。応答バッファは転送前に自動的にクリアされます。」

于 2012-05-01T23:35:21.980 に答える