3

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

请求的资源 () 不可用。

glassfish中记录的错误信息是

[#|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 位置:class app01a.MyServlet |#]

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

为什么会这样?

我知道实现 Servlet 的正常方式是扩展 HttpServlet 类。但是,我很好奇作者为什么这样做。

这本书的名字是“Servlet 和 JSP: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 Servletextends HttpServlet.

于 2014-10-21T20:02:04.220 回答
1

我可以看到您前一段时间问过这个问题,但我遇到了类似的问题。

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

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

于 2013-12-06T00:18:43.970 回答