浅谈Servlet
Servlet是什么
Java Servlet是运行在Web服务器或应用服务器上的程序,作为HTTP请求和HTTP服务器上的数据库或者应用之间的一层中间层。Servlet动态的处理来自客户端的请求,动态的生成html页面来响应请求。
Servlet运行在容器Container中,并不直接访问服务器计算机,而且Java存在安全管理器限制,所以使用Servlet可以保护计算机上的资源,是可信的。
Servlet架构
如图是Servlet架构,比较容易困惑的是HTTP Server和Servlets Program之间的关系,做如下解释:
- HTTP Server (HTTP服务器)
- HTTP服务器是一个网络服务,用于接受客户端的请求,并返回相应的HTTP响应。是Web应用的基础,负责处理网络层面的通信。
- HTTP服务器的职责
- 监听网络端口
- 解析HTTP请求
- 处理静态资源(如html文件,图片,CSS文件等)
- 转发动态请求(如将请求转发给后端应用,Servlet Container也视作后端应用的其中一种)
- 返回响应,将处理结果以HTTP响应的形式返回给客户端
- Servlet
- Servlet并不是一个独立的服务器,而是运行在Servlet容器中,动态处理HTTP服务器转发过来的HTTP请求并且生成响应。
- Servlet的职责
- 动态生成HTML,XML数据等内容
- 业务逻辑的处理,比如处理用户输入,与数据库交互等等
- 请求和响应管理,如通过Java API(
HttpServletRequest
&HttpServletResponse
)读取请求数据和构造响应。
- Servlet Container (Servlet容器)
- Servlet容器时HTTP Server的一部分,专门用于来管理和运行Servlet。常见的Servlet容器有Apache Tomcat,Jetty等等。
- Servlet的职责
- Servlet生命周期的管理:负责加载、初始化、运行和销毁Servlet。
- 请求的转发:将HTTP Server接收到的动态请求转发给相对应的Servlet。
- 线程管理:为每个请求分配线程,确保Servlet的并发处理能力。
- 提供服务:为Servlet提供运行环境,包括请求解析、响应封装、安全控制等等。
- 三者的关系是什么?
- HTTP Server是基础
- Servlet容器是HTTP服务器的拓展,Servlet容器运行在HTTP服务器的内部
- Servlet是动态处理的核心
- 整体的Servlet处理的流程如下
- 客户端发起HTTP请求(Request)
- HTTP服务器接收到客户端的请求,判断是否需要动态处理
- 如果是动态的,那么转发给Servlet容器
- Servlet容器根据请求信息选择合适的Servlet
- Servlet处理请求并且生成响应(Response)
- Sevlet容器将响应返回给HTTP服务器
- HTTP服务器将最终的请求发回给客户端
Servlet生命周期
Servlet生命周期中有很多方法,比较重要的是init()方法,service()方法,doGet()方法,doPost()方法和destroy方法
init()方法
init()方法在第一次创建Servlet时被调用,在后续每次用户请求中不再被调用,当一个Servlet被调用时,就会创建一个Servlet实例,每一个用户请求会产生一个新的线程,并在适当的时候移交给doGet和doPost方法,在init方法中被加载的数据将会被用于Servlet的整个生命周期。
1 |
|
service()方法
service方法是实际上提供服务,或者说执行任务的方法。Servlet容器实际上是通过调用service方法来处理来自客户端的请求的,并且将处理好的响应重新发送回客户端。
每当服务器接收到一个Servlet请求的是偶,服务器都会产生一个新的线程并且调用service方法。service方法会检查接收到的HTTP请求的类型(GET,POST等等),并且在适当的时候去调用对应的doGet,doPost等方法。
1 |
|
doGet()方法
GET请求来自于一个URL的正常求情,或者来自于一个没有指定METHOD的HTML表单,它由doGet方法来处理
1 |
|
doPost()方法
POST请求来自于一个制定了POST METHOD的HTML
1 |
|
destroy()方法
在生命周期结束时destroy方法将会被调用,这个方法会让Servlet进行关闭数据库连接,停止后台线程等活动,并且在调用此方法过后Servlet对象将会被标记为垃圾,等待垃圾回收机制的回收。
1 |
|
Servlets API
在Java中,Servlets API主要由javax.servlet
和javax.servlet.http
两个包提供,一共包含了38个接口和21个类。
javax.servlet
这个包可以被拓展来应用于处理任何一种应用层协议的请求,其中HTTP协议是使用比较广泛的协议之一。javax.servlet.http
则是一个javax.servlet
包的拓展,专门用于处理HTTP协议的请求。
如果要实现不同的HTTP Servlet,则可以通过继承HttpServlet
这个类的子类来实现独立的Servlet编写。只需要重写doGet和doPost等方法。
如何实现一个简单的Servlet类
首先导入一些必要的包
1 |
|
然后开始重写servlet方法,这里以一个实现每次请求counter+1的servlet为例
1 |
|
这个servlet类继承了HttpServlet
类并且重写了doGet方法来实现业务逻辑。
总结
Servlet是一种运行在Web服务器或应用服务器上的Java程序,它作为HTTP请求与数据库或其他应用之间的中间层。Servlet容器负责管理Servlet的生命周期,包括初始化、请求处理和销毁等。Servlet通过实现doGet和doPost等方法来处理客户端的请求,并动态生成响应内容。Servlet的架构中,HTTP服务器负责处理网络请求,Servlet容器则运行在其之上,负责动态请求的处理。通过Servlet,开发者可以实现Web应用的业务逻辑,以满足用户的请求。