一、实现javax.servlet.Servlet接口
详细代码如下:
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo implements Servlet{
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("demo1");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
}
}
二、继承javax.servlet.GenericServlet类(适配器设计模式)
GenericServlet类其实也是实现了Servlet接口和ServiceConfig接口,该类重写了Servlet中的方法,它之中只有一个抽象方法,就是service()方法,所以在继承了GenericServlet类后,我们只需要实现service()方法就可以使用了。
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestGenericServlet extends GenericServlet{
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("GenericServlet");
}
}
三、继承javax.servlet.http.HttpServlet类
该创建方式是开发中最常用的方式,该类采用了模板方法设计模式,其中的模板就是该类中的service()方法,如果继承该类,要求其子类必须至少重写一个方法,通常是以下方法:
1、doGet():用于HTTP GET请求
2、doPost():用于HTTP Post请求
3、doPut():用于HTTP Put请求
4、doDelete():用于HTTP Delete请求
5、init()与destory() 用于管理servlet的生命周期
需要注意的是,不要去重写其中的service()方法,因为service()方法通过将HTTP的请求分发给每个doXxx()方法来处理这些请求。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestHttpServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("doPost");
}
}
这里说一下方法调用的方式,当访问servlet程序时,由于通过<servlet></servlet>标签创建的时Servlet类对象,即Servlet s = new TestHttpServlet();所以访问时会调用其子类重写的service()方法,而该子类TestHttpServlet没有重写service()方法,所以就会调用HttpServlet类的service()方法,该方法中包含了对HTTP的请求进行响应的一系列方法,比如doGet()方法,如果在TestHttpServlet重写了doGet()方法,那么service()就会去调用该类中的doGet()方法,而不去执行HttpServlet类中的doGet()方法。
四、Servlet的线程安全
Servlet是单实例的,但是每次访问的时候是多线程的,因为每访问一次就要调用一遍service()方法,解决线程安全的方法最好是:将重写的方法中的变量写为局部变量,而不写为全局变量,原因是实例只有一个,而多个用户访问时,如果设置了全局变量,那多个用户就操作的是同一个变量,容易出现错误。