一.面试常考问题
- 问题1:请回答Servlet生命周期?
Servlet是单实例多线程的,自始至终只会创建一个对象来响应用户请求。
①如果web.xml中没有配置load-on-startup,则当用户第一次请求到达时创建servlet类的对象,然后使用该对象依次调用service(ServletRequest,ServletResponse)—service(HttpServletRequest,HttpServletResponse)—doGet/doPost方法响应用户请求;当用户请求再次到达时,不会重新创建对象,直接使用已经创建的对象调用service—service—doGet/doPost进行响应。
②如果web.xml中有该Servlet的load-on-startup配置,则服务器启动时会按照load-on-startup配置的加载顺序依次创建Servlet对象,当请求到达时直接使用对象调用service-service-doGet/doPost方法进行相应。
③当服务器关闭时,就销毁Servlet对象实例
- 问题2:为什么创建的servlet是继承自httpServlet,而不是直接实现Servlet接口?
HttpServlet已经实现了HTTP协议处理。
二.Servlet详解
(1)什么是Servlet类
- servlet是
Server+Applet的缩写
,表示服务器应用
。Servlet其实就是一套规范,按照servlet规范编写的程序可以直接运行在支持servlet规范的java服务器上。
Servlet就是继承了(javax.servlet.http.HttpServlet)类、能够接收请求的Java类。
(2)Servlet类创建
- ①创建过程
a.创建一个类(类名通常以Servlet结尾)
b.继承(javax.servlet.http.HttpServlet)类
c.重写doGet和doPost方法
d.如果get请求和post请求的处理方式相同,则在doGet中调用doPost,然后将处理请求的逻辑代码写在doPost方法中
- ②Servlet类三种创建方式:
a.implements Servlet
b.extends GenericServlet
c.extends HttpServlet
在实际项目开发中,我们通常采用第三种继承HttpServlet的方式创建Servlet类,HttpServlet已经实现了HTTP协议处理
。
(3)Servlet接口
- Servlet是一套规范,那么里面的Servlet结构自然很重要了。
- Servlet接口定义如下:
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}
- init在容器启动时会被容器调用(load-on-startup设置为负数或者不设置时会在Servlet第一次被调用时才被调用),只会调用一次;
- getServletConfig用户获取ServletConfig;
- service方法用于处理一个具体的请求;
- getServletInfo方法用于获取Servlet相关信息,这个方法要自己实现,默认返回空字符串。
- destory主要用于Servlet销毁时释放资源,一般是关闭服务器时,也只会调用一次。
(4)Servlet请求响应流程:
- 处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西。理解这个的前提是了解一些http协议的东西,并且知道B/S模式(浏览器/服务器)。
一个Java Servlet就是一个小型Java应用程序,它可以继承HttpServlet实现,运行在Web服务器中。Servlet会接收并响应来自浏览器的请求,通常是基于Http协议的请求。
(5)tomcat和servlet的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器
. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件.
- ①:Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据读可以通过request对象调用对应的方法查询到。
- ②:Tomcat同时会要响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器
- 补充Servlet生命周期图解
Invest in yourself while you are young.
2020.03.08
转载:https://blog.csdn.net/weixin_45393094/article/details/104714798