У меня есть простой сервлет, который выглядит так:
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
как я ожидаю. Кроме того, в браузере ничего не распечатывается! (Я ожидаю, что он скажет "Это работает").
С тех пор я борюсь с этим вопросом. У кого-нибудь есть какие-то предложения, в чем проблема?
Почему вы переопределяете метод обслуживания. В этом нет необходимости. Удалите его или вызовите
super.service(request,response);
ПРИЧИНА
Попробуйте увидеть источник класса HttpServlet. Там вы увидите, что в зависимости от метода, который используется для вызова сервлета, т.е. GET/POST, вызывается необходимый метод doGet() или doPost(). И когда контейнер фактически получает запрос, он запускает новый поток и обслуживает клиента, вызывая метод service(). Поэтому, если вы переопределите его и не назовете метод обслуживания супер класса или не определите свою собственную стратегию, которую вызывается GET, метод doGet() никогда не будет вызван. Ваш запрос никогда не вызывает метод doGet(), его метод service(), который его вызывает.
service
основном разрушая нормальный поток сервлета. Если вы добавитеsuper.service(req, resp)
к переопределенному методу, он будет работать.