我有一个简单的Servlet,如下所示:
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>
当我访问网址http://localhost:8080/instrurental/bla
时,控制台中会打印出以下内容:
init
service
但不是我所期望的doGet
。此外,浏览器中没有打印出任何内容! (我期待它说“It Works”)。
从昨天开始,我一直在努力解决这个问题。有没有人有任何建议,问题是什么?
答案 0 :(得分:4)
为什么要覆盖服务方法。没有必要这样做。删除它或打电话
super.service(request,response);
<强>原因强>
试着看看HttpServlet类的来源。在那里你会看到,根据用于调用servlet的方法,即GET / POST,调用必要的方法doGet()或doPost()。当容器实际收到请求时,它会启动一个新线程并通过调用service()方法为客户端提供服务。因此,如果你覆盖它并且不调用超类的服务方法或定义你自己的策略,那么将调用GET,永远不会调用doGet()方法。您的请求从不调用doGet()方法,它调用它的service()方法。