Servlet详解
文章目录
一、基本概念
在Java中,Servlet是用于创建动态Web内容的服务器端组件。Servlet运行在Java EE服务器上,可以响应客户端(通常是Web浏览器)发出的请求。Servlet的生命周期由服务器管理,主要包括初始化、请求处理和销毁三个阶段。
Servlet是一种Java类,它实现了
javax.servlet.Servlet
接口。Servlet主要用于处理HTTP请求和生成HTTP响应,可以用于创建动态网页、处理表单数据、管理会话等。
二、Servlet的使用
使用Servlet开发Web应用程序主要涉及以下几个步骤:创建Servlet类、配置Servlet、处理请求和生成响应。
1、创建Servlet类
创建一个继承自
HttpServlet
类的Servlet,并重写
doGet
或
doPost
方法以处理HTTP请求。
importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.IOException;publicclassHelloWorldServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 设置响应内容类型
response.setContentType("text/html");// 获取响应输出流
response.getWriter().println("<h1>Hello, World!</h1>");}}
2、配置Servlet
Servlet可以通过
web.xml
文件或使用注解配置。在配置中,定义Servlet的名称和URL映射。
a. 使用web.xml配置
在
WEB-INF
目录下的
web.xml
文件中配置Servlet。
<web-app><servlet><servlet-name>HelloWorldServlet</servlet-name><servlet-class>com.example.HelloWorldServlet</servlet-class></servlet><servlet-mapping><servlet-name>HelloWorldServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping></web-app>
b. 使用注解配置
在Servlet类上使用
@WebServlet
注解配置Servlet。
importjavax.servlet.annotation.WebServlet;@WebServlet("/hello")publicclassHelloWorldServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{
response.setContentType("text/html");
response.getWriter().println("<h1>Hello, World!</h1>");}}
3、部署Web应用
将Servlet类和相关配置文件打包成一个Web应用程序(WAR文件),然后将WAR文件部署到支持Servlet的Java EE服务器(如Tomcat、Jetty等)上。
如图:
4、处理HTTP请求和生成响应
在
doGet
或
doPost
方法中,可以处理请求参数、生成响应内容、设置响应头等。
@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 获取请求参数String name = request.getParameter("name");// 设置响应内容类型
response.setContentType("text/html");// 生成响应内容
response.getWriter().println("<h1>Hello, "+ name +"!</h1>");}
5、处理表单数据
Servlet可以处理来自HTML表单的数据。以下是一个简单的表单和处理Servlet的示例:
HTML表单
<!DOCTYPEhtml><html><head><title>Form Example</title></head><body><formaction="submitForm"method="POST">
Name: <inputtype="text"name="name"><inputtype="submit"value="Submit"></form></body></html>
Servlet
@WebServlet("/submitForm")publicclassFormServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 获取表单参数String name = request.getParameter("name");// 设置响应内容类型
response.setContentType("text/html");// 生成响应内容
response.getWriter().println("<h1>Hello, "+ name +"!</h1>");}}
6、管理会话
Servlet可以使用HttpSession对象来管理用户会话数据。
@WebServlet("/sessionExample")publicclassSessionServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 获取会话对象HttpSession session = request.getSession();// 获取会话属性String user =(String) session.getAttribute("user");if(user ==null){
user ="Guest";}// 设置响应内容类型
response.setContentType("text/html");// 生成响应内容
response.getWriter().println("<h1>Hello, "+ user +"!</h1>");// 设置会话属性
session.setAttribute("user","John Doe");}}
总结: Servlet是Java Web开发的核心组件,通过继承
HttpServlet
类并重写
doGet
、
doPost
等方法,可以处理HTTP请求并生成响应。Servlet的配置可以通过
web.xml
文件或注解完成。Servlet应用广泛,包括动态网页生成、表单处理、会话管理等。通过这些基本步骤和示例代码,可以开始使用Servlet开发功能强大的Web应用程序。
三、servlet生命周期
Servlet的生命周期是指Servlet在服务器中从创建到销毁的整个过程。Servlet生命周期由Servlet容器(如Tomcat、Jetty等)管理,主要包括以下几个阶段:加载和实例化、初始化、请求处理和销毁。
注意:Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
1、加载和实例化
- 加载:当服务器启动或首次接收到对该Servlet(调用对应的url请求时)的请求时,Servlet容器会加载Servlet类。加载过程包括将Servlet类字节码加载到内存中。
- 实例化:加载类之后,Servlet容器会创建Servlet类的实例。这个过程类似于使用
new
关键字创建对象。
// 服务器加载Servlet类并创建其实例HelloWorldServlet servlet =newHelloWorldServlet();
2、初始化
- 初始化:实例化后,Servlet容器会调用Servlet的
init
方法进行初始化。init
方法在Servlet生命周期内只调用一次,通常在此方法中进行资源分配,如数据库连接、读取配置文件等。
@Overridepublicvoidinit()throwsServletException{// 执行初始化操作System.out.println("Servlet 初始化");}
3、 请求处理
- 请求处理:Servlet初始化完成后,每次有请求到达时,Servlet容器会调用Servlet的
service
方法。service
方法根据请求类型(GET、POST等)调用相应的doGet
、doPost
等方法。每个请求都会触发一次service
方法的调用。
@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 处理GET请求
response.getWriter().println("<h1>Hello, World!</h1>");}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 处理POST请求String name = request.getParameter("name");
response.getWriter().println("<h1>Hello, "+ name +"!</h1>");}
4、销毁
- 销毁:当服务器关闭或Servlet被移除时,Servlet容器会调用Servlet的
destroy
方法进行清理工作。destroy
方法在Servlet生命周期内只调用一次,通常在此方法中释放资源,如关闭数据库连接、清理缓存等。
注意:针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
@Overridepublicvoiddestroy(){// 执行清理操作System.out.println("Servlet 销毁");}
总结:
- 加载和实例化:服务器启动或首次请求时加载Servlet类并创建其实例。
- 初始化:调用
init
方法进行初始化。 - 请求处理:每次请求调用
service
方法,根据请求类型调用相应的doGet
、doPost
等方法。 - 销毁:服务器关闭或Servlet被移除时调用
destroy
方法进行清理。
注意:在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
小tips: 如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。 用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的公共数据。
Servlet理解图:
版权归原作者 风起携月归 所有, 如有侵权,请联系我们删除。