23

私は次のサーブレットを持っています:

public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 16252534;
    private static int ping = 3000;
    private Thread t;
    private static boolean shouldStop = false;

    @Override
    public void init() throws ServletException {
        super.init();

        t = new Thread(new Runnable() { 
            @Override
            public void run() {
                while(!shouldStop) {
                    System.out.println("Now:" + System.currentTimeMillis());
                    try {
                        Thread.sleep(ping);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t.start();

    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
        super.doGet(req, resp);
        System.out.println("doGet");
        PrintWriter out = resp.getWriter();
        out.println("<html><h1>It works!!</h1></html>");
    }

    @Override
    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);
        System.out.println("service");

    }

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

    }

    @Override
    public void destroy() {
        super.destroy();
        System.out.println("Destroy servlet");
        shouldStop = true;
    }
}

これは私の中で次のようにマッピングされていますweb.xml

<display-name>MyServer</display-name>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.myserver.MyServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>      
   <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

でブラウザ(Chrome)を開くと、コンソールにログオンした状態でhttp://localhost:8080/MyServer/MyServlet「サービス」が表示され、スレッドは正しく機能しますが、ログに記録された状態で「機能」が表示されず、ブラウザで次のエラーが発生します。doService()doGet()

HTTPメソッドGETはこのURLではサポートされていません

これはどのように発生し、どうすれば解決できますか?

4

2 に答える 2

64

これは、HttpServlet#doXxx()メソッドのデフォルトの実装(doGet()、、、、など)のデフォルトの応答です。これは、メソッドがサーブレットクラスで適切にnになっていない場合、またはメソッドがを介して明示的に呼び出されている場合、HTTP405「メソッドは許可されていません」エラーが発生することを意味します。doPost()doHead()doPut()doXxx()@Overridesuper

したがって、タイプミスがないことを確認するためだけにdoXxx()、アノテーションを含め、メソッドがAPIに準拠するように適切に宣言されていることを確認する必要があります。@Override例えば

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
}

super.doXxx()また、サーブレットメソッドを呼び出さないようにする必要もあります。

super.doGet(request, response);

サーブレットにはこれがあります。この線を取り除くだけで、問題は解消されます。

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

ちなみにこれも当てはまりますが、デフォルトの実装に適切なメソッドを実行させるために必要なservice()ので、この構成では技術的に害はありません。実際には、メソッド全体は不要です。サーブレットからメソッド全体を削除するだけです。service()

super.init();も不要です。をオーバーライドする場合にのみ必要です。init(ServletConfig)そうしServletConfigないと、が設定されないためです。これは、 javadocでも明示的に言及されています。これは、呼び出しを必要とする唯一のメソッドです。super


具体的な問題とは関係なく、そのようなサーブレットでスレッドを生成することは悪い考えです。正しいアプローチについては、サーブレットベースのWebアプリケーションでバックグラウンドタスクを実行する方法に進んでください。

于 2011-03-20T19:06:48.063 に答える
0

servicedoGetまたはdoPostへの呼び出しを委任する責任があるメソッドをオーバーライドしました。詳細については、これを参照してください
。また、各メソッドからのsuper.doxxx(..)呼び出しを削除します。メソッドをオーバーライドしないserviceでください。doGetから「ItWorks」と表示されます。

于 2011-03-20T19:07:26.573 に答える