3

javax.servlet.Servlet インターフェイスのみを使用してサーブレットを実装するサーブレットの例を再現しようとしました。しかし、それは機能していません。Web ブラウザーを使用してサーブレットを実行しようとすると、次のエラー メッセージが表示されます。

ご要請のリソースはご利用できません。

グラスフィッシュに記録されたエラーメッセージは

[#|2012-10-15T07:00:58.703-0500|SEVERE|glassfish3.0.1|global|_ThreadID=39;_ThreadName=Thread-1;|アノテーション javax.servlet.annotation.WebServlet を持つクラス app01a.MyServlet は、 javax.servlet.http.HttpServlet の派生クラスになります。記号: TYPE 場所: クラス app01a.MyServlet |#]

私はグラスフィッシュ、エクリプス、jdk1.7.0_03 を使用しています。

なぜこうなった?

サーブレットを実装する通常の方法は、HttpServlet クラスを拡張することです。しかし、著者がなぜそうしているのかについては興味があります。

本の名前は「Servlet and JSP: A Tutorial By Budi Kurniawan」です。

以下はサンプルコードです。

ご協力ありがとうございました

package app01a;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;


/**
 * Servlet implementation class MyServlet
 */
@WebServlet("/MyServlet")
public class MyServlet implements Servlet {

    private transient ServletConfig  servletConfig;

    /**
     * Default constructor. 
     */
    public MyServlet() {
    }

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        this.servletConfig = servletConfig;
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
    }

    /**
     * @see Servlet#getServletConfig()
     */
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    /**
     * @see Servlet#getServletInfo()
     */
    public String getServletInfo() {
        return "My Servlet";
    }

    /**
     * @see Servlet#service(ServletRequest request, ServletResponse response)
     */
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        String servletName = servletConfig.getServletName();
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.print("<html><head></head><body>Hello from " +
                     servletName + "</body></html>");
    }

}
4

2 に答える 2

2

この本を読んでいて、Jetty でも同じ問題に遭遇し、次のエラー メッセージが表示されました。 WARN:oeja.WebServletAnnotation:main: app01a.MyServlet is not assignable from javax.servlet.http.HttpServlet

これは、@WebServlet アノテーションが javax.servlet.http.HttpServlet のサブクラスにしか適用できないために発生しています。

Java 6 EE チュートリアルには次のように書かれています。

@WebServlet でアノテーションが付けられたクラスは、javax.servlet.http.HttpServlet クラスを拡張する必要があります

implements Servletしたがって、この問題は に置き換えることで簡単に修正できますextends HttpServlet

于 2014-10-21T20:02:04.220 に答える
1

しばらく前にこの質問をしたことがわかりますが、同様の問題がありました。

WebServlet を完全に削除して、サイトを再度デプロイしてみてください。問題の根本に近い、より役立つエラー メッセージが表示される場合があります。

これを行ったところ、エンティティ クラスの 1 つで無効な NamedQuery を作成したことがわかりました。その後、WebServlet アノテーションを元に戻しましたが、サイトは問題ありませんでした。

于 2013-12-06T00:18:43.970 に答える