JavaWeb三大组件之一,用于处理请求,一般Servlet需要接收请求数据,处理请求,完成响应。
1、实现javax.servlet.Servlet接口;
2、继承javax.servlet.GenericServlet抽象类;
3、继承javax.servlet.http.HttpServlet抽象类;
void init(ServletConfig);// 出生方法
该方法是在Servlet第一次被访问的时候调用,而且Servlet一生只会调用一次该方法,所以我们可以在该方法做一些数据的初始化
void service(ServletRequest,ServletResponse);
每次接收请求时,都会调用该方法,可以多次调用
void destroy();
不轻易离去,只有服务器关闭的时候才会离去,在服务器关闭之前,会“临死”之前调用该方法。
public class HelloServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("Servlet出生了!");
}
public ServletConfig getServletConfig() {
return null;
}
public void destroy() {
System.out.println("Servlet死亡!");
}
public String getServletInfo() {
return null;
}
public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {
System.out.println("hello servlet!");
}
}
这也是第一种实现方式。
service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;
init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的
元素。这里面有几个方法需要提一下:
GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。
我们可以看看它的源代码:
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {}
@Override
public void destroy() {}
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
@Override
public String getServletInfo() {
return "";
}
@Override
public void init(ServletConfig config) throws ServletException { this.config = config;
this.init();
}
public void init()throws ServletException {}
public void log(String msg) {
getServletContext().log(getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
@Override
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
@Override
public String getServletName() {
return config.getServletName();
}
}
它有一个属于自己的方法,init()方法,注意这个是无参的,Servlet接口里面的init方法是有参数的,所以我们如果需要初始化的话只要重写这个无参数的init()方法就行,另外再重写service方法就行。
是GenericServlet的子类,该类提供了对HTTP请求的特殊支持,所以一般都会通过继承HttpServlet来完成对Servlet的定义,这个类是里面有着自己的service方法,能够把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse,所以我们在继承这个类的时候只需要重写他的doGet()或者doPost()就行。
eg:
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("hello doGet()...");
}
}
public class BServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("hello doPost()...");
}
}