【问题标题】:The Class x having annotation javax.servlet.annotation.WebServlet need to be a derived class of javax.servlet.http.HttpServlet具有注解 javax.servlet.annotation.WebServlet 的 Class x 需要是 javax.servlet.http.HttpServlet 的派生类
【发布时间】:2012-10-15 14:11:40
【问题描述】:

我试图重现一个仅使用 javax.servlet.Servlet 接口实现 Servlet 的 Servlet 示例。但是,它不起作用。当我尝试使用 Web 浏览器运行 servlet 时,它会显示一条错误消息:

请求的资源()不可用。

glassfish中记录的错误信息是

[#|2012-10-15T07:00:58.703-0500|严重|glassfish3.0.1|global|_ThreadID=39;_ThreadName=Thread-1;|The 类 app01a.MyServlet 有注释 javax.servlet.annotation.WebServlet 需要是一个派生类 javax.servlet.http.HttpServlet。符号:TYPE 位置:class app01a.MyServlet |#]

我正在使用 glassfish、eclipse 和 jdk1.7.0_03。

为什么会这样?

我知道实现 Servlet 的常规方法是扩展 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>");
    }

}

【问题讨论】:

    标签: jakarta-ee glassfish-3 servlet-3.0


    【解决方案1】:

    我正在阅读这本书,并且在 Jetty 上也遇到了相同的问题,并显示以下错误消息: WARN:oeja.WebServletAnnotation:main: app01a.MyServlet is not assignable from javax.servlet.http.HttpServlet

    这是因为@WebServlet 注解只能应用于 javax.servlet.http.HttpServlet 的子类。

    The Java 6 EE Tutorial 说:

    使用@WebServlet 注解的类必须扩展 javax.servlet.http.HttpServlet 类

    因此可以通过将implements Servlet 替换为extends HttpServlet 轻松解决此问题。

    【讨论】:

      【解决方案2】:

      我可以看到你不久前问过这个问题,但我遇到了类似的问题。

      尝试完全删除 WebServlet 并再次部署站点。您可能会收到更接近问题根源的更有用的错误消息。

      我这样做了,发现我在我的一个实体类中创建了一个无效的 NamedQuery。之后我把 WebServlet 注释放回去了,网站很好。

      【讨论】:

        猜你喜欢
        • 2012-10-21
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        相关资源
        最近更新 更多