Сервис Servlet и метод init вызываются, но не doGet

1

У меня есть простой сервлет, который выглядит так:

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

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Bla extends HttpServlet {

    private static final long serialVersionUID = 16252534;

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

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

    }

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

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

и web.xml, который выглядит так:

<?xml version="1.0" encoding="UTF-8" ?>

<web-app>
    <display-name>Archetype Created Web Application</display-name>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>Bla</servlet-name>
        <servlet-class>instrurental_proj.servlets.Bla</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Bla</servlet-name>
        <url-pattern>/bla</url-pattern>
    </servlet-mapping>  
</web-app>

Когда я посещаю URL-адрес http://localhost:8080/instrurental/bla, на консоли http://localhost:8080/instrurental/bla следующее:

init
service

но не doGet как я ожидаю. Кроме того, в браузере ничего не распечатывается! (Я ожидаю, что он скажет "Это работает").

С тех пор я борюсь с этим вопросом. У кого-нибудь есть какие-то предложения, в чем проблема?

  • 3
    Проблема в том, что вы переопределяете service основном разрушая нормальный поток сервлета. Если вы добавите super.service(req, resp) к переопределенному методу, он будет работать.
  • 0
    @ M.Deinum Спасибо! Это работает сейчас!
Теги:
servlets

1 ответ

4
Лучший ответ

Почему вы переопределяете метод обслуживания. В этом нет необходимости. Удалите его или вызовите

super.service(request,response);

ПРИЧИНА
Попробуйте увидеть источник класса HttpServlet. Там вы увидите, что в зависимости от метода, который используется для вызова сервлета, т.е. GET/POST, вызывается необходимый метод doGet() или doPost(). И когда контейнер фактически получает запрос, он запускает новый поток и обслуживает клиента, вызывая метод service(). Поэтому, если вы переопределите его и не назовете метод обслуживания супер класса или не определите свою собственную стратегию, которую вызывается GET, метод doGet() никогда не будет вызван. Ваш запрос никогда не вызывает метод doGet(), его метод service(), который его вызывает.

  • 0
    Принято и +1 за объяснение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню