文章目录
推荐文章:servlet的本质是什么,它是如何工作的?(来自知乎)
什么是Servlet?
Servlet(Server Applet,全称Java Servlet。是⽤Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,⽣成动态Web内容。
狭义的Servlet是指Java语⾔实现的⼀个接⼝,⼴义的Servlet是指任何实现了这个Servlet接⼝的类,⼀般情况下,⼈们将Servlet理解为后者。
Servlet运⾏于⽀持Java的应⽤服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝⼤多数情况下Servlet只⽤来扩展基于HTTP协议的Web服务器。
也就是说,Servlet是用于处理HTTP请求并响应(根据不同的请求分配不同的Service)的处理类
Servlet工作模式:
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应并将其传给服务器
- 服务器将响应返回客户端
Servlet的API
:
写一个简单的Servlet
- 创建⼀个类实现Servlet接⼝,或继承HttpServlet,重写⽅法
public class LoginServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//初始化⽅法
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse
servletResponse) throws ServletException, IOException {
//处理get/post请求的⽅法
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
//销毁的⽅法
}
}
- 在web.xml文档中配置映射关系
<servlet>
<servlet-name>⾃定义名称</servlet-name>
<servlet-class>处理请求的类的完整路径</servlet-class>
</servlet>
<servlet-mapping><!-- mapping 表示映射 -->
<servlet-name>⾃定义名称</servlet-name>
<url-pattern>请求名</url-pattern>
</servlet-mapping>
执行顺序:
当客户端发送的请求"test"到达服务器
-
首先,到web.xml配置文件中的servlet-mapping标签中对url-pattern标签中的内容进行匹配,找到url-pattern标签内容为"/test"对应的
处理类名称servlet-name
-
接下来,到servlet标签中对servlet-name标签中的内容进行匹配,找到servlet-name对应的
servlet-class标签中的内容
,如此就获得了处理类的完整路径
所以,当启动tomcat,在浏览器输入http://localhost/工程名/访问路径 提交请求后,便可以通过以上顺序找到处理类的完整路径,通过反射
的方式使得程序运行过程中动态得到处理类的属性和方法,使我们不需要编写main方法,不需要手动new一个对象,便能够处理请求。
说说Servlet的工作原理?
(1)Servlet接口定义了Servlet和Servlet容器之间的契约:Servlet容器将Servlet类载入内存
,(生成实例
)并产生Servlet实例和调用它的具体方法。在一个应用程序中,每种Servlet类只能有一个实例(单例模式)
(2)用户请求致使Servlet容器调用Servlet的Service()
方法,并传入一个ServletRequest对象和一个ServletResponse对象。请求和响应对象都是由Servlet容器(如Tomcat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
ServletRequest中封装了当前的HTTP请求,因此开发人员不必解析和操作原始的HTTP数据。Servlet表示当前用户的HTTP响应,程序员只需要直接操作SerletResponse对象
就能把响应轻松发回给用户。
(3)对于每个应用程序,Servlet容器还会创建一个ServletContext对象
。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象
。
说说Servlet的生命周期?
当客户端首次发送第一次
请求后,由容器去解析请求,根据请求找到对应的Servlet类,判断该类实例是否存在。
若不存在,则创建Servlet实例,调取init()方法,进行初始化。
初始化后调取service()方法,判断客户端的请求方式(get,执行doGet();post,执行doPost)。
处理方法完成后,生成响应返回给客户端。
单词请求处理完毕。
当用户发送第二次以后
的请求,会判断实例是否存在,但是不会再执行init(),而是直接去执行service()。
当用户