2

プロジェクトを実行すると、「HTTP メソッド POST はこの URL ではサポートされていません」というエラーが表示されます。面白いことに、2 日前はまったく問題なく動作していました。コードにいくつかの変更を加えた後、元のコードを復元すると、このエラーが発生しました。手伝っていただけませんか?

ここに私のindex.htmlがあります:

<form method="post" action="login.do">
<div>
<table>
            <tr><td>Username: </td><td><input type="text" name="e_name"/>
            </td>  </tr>
            <tr><td> Password: </td><td><input type="password" name="e_pass"/>
            </td>  </tr>
            <tr><td></td><td><input type="submit" name ="e_submit" value="Submit"/>

これが私のログインサーブレットです:

public class Login extends HttpServlet {

/**
 * Processes requests for both HTTP
 * <code>GET</code> and
 * <code>POST</code> methods.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException, SQLException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        /*
         * TODO output your page here. You may use following sample code.
         */
        int status;
        String submit = request.getParameter("e_submit");
        String submit2 = request.getParameter("a_submit");
        out.println("Here1");
        String e_name = request.getParameter("e_name");
        String e_password = request.getParameter("e_pass");
        String a_name = request.getParameter("a_name");
        String a_password = request.getParameter("a_pass");
        out.println(e_name+e_password+a_name+a_password);
        Author author = new Author(a_name,a_password);  
        Editor editor = new Editor(e_name,e_password);

      // If it is an AUTHOR login:

       if(submit==null){
       status = author.login(author);
       out.println("Author Login");
       //Incorrect login details
       if(status==0) {
           out.println("Incorrect");

       RequestDispatcher view = request.getRequestDispatcher("index_F.html");
       view.forward(request, response);

       }
       //Correct login details --- AUTHOR

       else {

              out.println("Correct login details");
              HttpSession session = request.getSession();    
              session.setAttribute(a_name, "a_name");

              RequestDispatcher view = request.getRequestDispatcher("index_S.jsp"); 
              view.forward(request, response);
            }

       }

       //If it is an EDITOR login

       else if (submit2==null){

           status = editor.login(editor);

           //Incorrect login details

           if(status==0) {

       RequestDispatcher view = request.getRequestDispatcher("index_F.html");
       view.forward(request, response);
            }

           //Correct login details --- EDITOR

           else {
               out.println("correct");
               HttpSession session = request.getSession();    
       session.setAttribute(e_name, "e_name");
       session.setAttribute(e_password, "e_pass");
               RequestDispatcher view   = request.getRequestDispatcher("index_S_1.html"); 
               view.forward(request, response);

            }           }


        out.println("</body>");
        out.println("</html>");



    } finally {            
        out.close();
    }
}

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

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

そして、私の web.xml は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
        <param-name>debug</param-name>
        <param-value>2</param-value>
    </init-param>
    <init-param>
        <param-name>detail</param-name>
        <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>controller.Login</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Login</servlet-name>

    <url-pattern>/login.do</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

私は Glassfish v3 サーバーを使用しています - 他に知っておくべきことがあれば教えてください

4

4 に答える 4

5

これは、doGet()anddoPost()メソッドでメソッドを呼び出しているためですsuper。むしろ、processRequest()上記のそれぞれのメソッドの内部を呼び出します。

super.doGet()andメソッドはデフォルトで HTTP 405 を返すため、スーパークラスand をsuper.doPost()呼び出さないでください。doGet()doPost()

于 2012-06-27T09:04:49.817 に答える
2

processRequestコードにメソッドがあるのはなぜですか? 誰がそのメソッドを呼び出しますか?

呼び出してもそのメソッドに到達できないか、そのメソッドをsuper.doGet()明示super.doPost() 的に呼び出す必要があります。

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    processRequest(req,resp)
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    processRequest(req,resp)
}

編集

これを行う

response.sendRedirect("index_F.html");
return;

それ以外の

RequestDispatcher view = request.getRequestDispatcher("index_F.html");
view.forward(request, response);
于 2012-06-27T09:30:26.757 に答える
0

内部doPost()では、を呼び出す必要がありますprocessRequest()

于 2012-06-27T09:00:45.707 に答える
0

実際に実装せずに (を使用して) doGet()andメソッドを呼び出しています。doPost()super

HTTP 405HttpServlet は基本的に、オーバーライドされていないすべての HTTP メソッドが「メソッドがサポートされていません」というエラーを返すテンプレート メソッド パターンに従います。このようなメソッドをオーバーライドする場合は、メソッドを呼び出さないでください。superそうしないと、HTTP 405エラーが発生する可能性があります。doPost() メソッドについても同じことが言えます。

processRequest(req,resp)上記のそれぞれのメソッド内で呼び出します。

編集:

2番、

Dispatcher を使用してリクエストを HTML に転送しないでください。HTMLのみを表示したい場合は、とにかくリダイレ​​クトを使用してください。

response.sendRedirect("index_F.html");
return;

また、redirect無効な資格情報をログアウトまたは返送するときに使用することをお勧めします。

于 2012-06-27T09:13:25.420 に答える