1. Servlet容器和Servlet的关系
Servlet是一个Java程序,一个Servlet应用有一个或多个Servlet程序。JSP页面会被转换和编译成Servlet程序。Servlet应用无法独立运行,必须运行在Servlet容器中。Servlet容器将用户的请求传递给Servlet应用,并将结果返回给用户。
2. Servlet API
Servlet的核心是Servlet接口,它是所有Servlet类必须直接或间接实现的一个接口。直接实现是指编写接口Servlet的实现类,间接实现是指继承接口Servlet的实现类。Servlet接口定义了Servlet和Servlet容器之间的契约。这个契约归结起来就是,Servlet容器将Servlet类载入内存,并在Servlet实例上调用具体方法。
用户请求会致使Servlet容器调用Servlet的service方法,并传入一个ServletRequest实例和一个ServletResponse实例。ServletRequest中封装了当前的HTTP请求,ServletResponse封装了对当前用户的HTTP响应。对于每一个应用程序,Servlet容器还会创建一个ServletContext实例,它封装了上下文(应用程序)的环境详情。此外,每一个Servlet实例都有一个封装Servlet配置的ServletConfig。
Servlet接口中定义了以下5个方法
void init(ServletConfig config) throws ServletException;
void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
void destroy();
String getServletInfo();
ServletConfig getServletConfig();
init、service和destory时Servlet的生命周期方法
- init,当且仅当该Servlet第一次被请求时,Servlet容器会调用这个方法,我们可以用这个方法完成一些初始化工作。
- service,每当请求该Servlet时,Servlet容器就会调用这个方法。此方法接受用户的请求对象,执行业务操作,利用响应对象响应用户请求。
- destroy,当容器监测到一个Servlet从服务中被移除时,容器调用该方法,释放资源。
getServletInfo和getServletConfig是非生命周期方法
- getServletInfo,该方法会返回Servlet的描述信息,我们可以用它返回有用或为null的任意字符串
- getServletConfig,这个方法会返回由Servlet容器传给init方法的ServletConfig对象。我们将传给init方法的ServletConfig对象赋值给一个类级别的变量(static变量),并在getServletConfig方法中返回出去
3. Servlet的线程安全
Servlet实例会被一个应用程序中的所有用户共享,因此不建议使用类级变量,除非他们是只读的,或者是java.util.concurrent.atomic包的成员。
参考资料
书籍《Servlet、JSP和Spring MVC初学指南》