0

私は Java サーブレットを初めて使用し、ログイン ページを開こうとしています。サーブレットのサービス メソッドは次のとおりです。

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();

    getServletContext().getRequestDispatcher("/login.jsp").forward(request, response);
}

ここに私のlogin.jspファイルがあります:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</head>
<body>


<form action="servletexample" method="post">
    <table border="0">
        <tr>
            <td>User Name:</td><td><input type="text" name="firstname" /></td>
        </tr>
        <tr>
            <td>Password:</td><td><input type="password" name="lastname" /></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" name="submit" value="Submit" /></td>
        </tr>
    </table>
    </form>

</body>
</html>

プロジェクトを実行すると、次のエラーが発生します。

HTTP Status 500 - Cannot forward after response has been committed

--------------------------------------------------------------------------------

type Exception report

message Cannot forward after response has been committed

description The server encountered an internal error that prevented it from fulfilling this request.

exception 

java.lang.IllegalStateException: Cannot forward after response has been committed
com.exaple.tutorial.ServletExample.service(ServletExample.java:33)
javax.servlet.http.HttpServlet.service(HttpServlet.java:723)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.37 logs.

WebContent フォルダーのスクリーンショットは次のとおりです。

ここに画像の説明を入力

そして最後に web.xml ファイル:

    <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>ServletsJSPExample</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>ServletExample</display-name>
    <servlet-name>ServletExample</servlet-name>
   <servlet-class>com.exaple.tutorial.ServletExample</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletExample</servlet-name>
    <url-pattern>/servletexample</url-pattern>
  </servlet-mapping>
</web-app>

誰でも助けることができますか?ありがとう

4

1 に答える 1

1

サービスメソッドで PrintWriter を初期化する理由がわかりません。サービスメソッドを終了するとすぐにライターがフラッシュ/クローズされるため、これが 500 内部エラーの原因である可能性があります。また、リクエストを転送した後に jsp をレンダリングしようとすると、すでにコミットされたサーバー 500 エラーの応答がスローされます。そのため、printwriter インスタンスをコメントアウトしてから、要求を login.jsp に転送してみてください。

これはjavadocsを形成します:

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

もう一つの重要なこと:

そのメソッドは魔法のようにコードの実行を終了せず、メソッドからジャンプしないため、 forward() メソッドの後に戻りません。メソッドから戻り、残りのコードの実行を自分で停止する必要があります。

于 2013-06-30T00:21:06.760 に答える