1

我希望 Servlet 始终执行相同的任务。不管它是 GET 还是 POST。目前我只是调用doGet()from doPost(),它工作正常。

然后我尝试覆盖该service()方法,我认为它会以相同的方式工作。但事实并非如此!

代码以某种方式被执行,但响应不会生成网页:

response.getWriter();
response.println(string); 

此代码适用于 doGet/doPost 方法,但不适用于服务。为什么?

小服务程序:

class MyWebServlet extends HttpServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String string = "teststring";
        out.println(string);
    }
}
4

3 回答 3

3

更改public void service(ServletRequest request, ServletResponse response)public void service(HttpServletRequest request,HttpServletResponse response),它应该可以工作。

于 2012-09-28T09:31:37.543 回答
2

您覆盖了错误的方法。

那么为什么你的编译器在你写了@Override注解之后就没有抱怨呢?

实际上,您的 servlet 继承了两个服务方法,但没有相同的参数 => 方法重载。

  • public void service(ServletRequest request, ServletResponse response)GenericServlet类实现,这意味着您的 servlet 的第一个父类。

  • public void service(HttpServletRequest request, HttpServletResponse response) 由HttpServlet类实现。
    这是您需要覆盖的。

您可以有效地覆盖第一个,但是您会丢失 http 进程,并且不会将任何内容写入您的浏览器。它解释了你的问题。

GenericServlet定义了一个通用的、独立于协议的 servlet,因此与 http 协议没有直接关系。

于 2012-09-28T09:24:36.380 回答
-1

看下面的例子。当用户执行 GET 时,doGet 将被调用,如果他们执行 Post,它将调用 doPost,实习生调用 doGet。

   //Sample Code:
    @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      PrintWriter writer = resp.getWriter();
      writer.println("Hello World");
      writer.close();
   }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
   }
于 2012-09-28T09:36:43.280 回答