Servlet 是运行在 Web 服务器或应用服务器上的 Java 程序,作为 Web 浏览器或其他 HTTP 客户端与服务器端应用(如数据库)之间的中间层。它的主要作用是接收客户端请求、处理业务逻辑,并将处理结果以网页形式动态返回给客户端。
使用 Servlet 可以实现以下功能:
- 接收网页表单提交的用户输入;
- 展示来自数据库或其他数据源的内容;
- 动态生成 HTML 页面响应用户请求。
Servlet 是 Java EE(现 Jakarta EE)开发中最核心的技术之一,对于理解 Web 应用的请求响应流程、服务器端逻辑处理等具有重要意义。
项目地址:https://download.csdn.net/download/m1154619573/90943348****
创建和使用
首先新建一个项目,按照下面的选项配置项目。然后一直点就可以了。
目录详解
创建完成后,项目会自动生成一系列目录。我们重点关注 src
目录下的内容。
.idea
和 .mvn
是开发工具自动生成的配置目录。
我们主要编写的程序代码应放在:src/main/java/org/example/demo
路径下。
配置 Servlet 路由
我们创建了一个名为 IndexServlet
的类,用于处理客户端发送的 GET 请求。该类位于 com.example.demo12
包下,并继承了 HttpServlet
。通过 @WebServlet
注解,我们将该 Servlet 映射到路径 /index-servlet
,使得当用户访问该路径时就会触发对应的处理逻辑。在 doGet()
方法中,首先通过 response.setContentType("text/html")
设置响应类型为 HTML,然后通过 PrintWriter
输出一段简单的 HTML 页面。页面中显示了“GET 请求处理成功”的提示信息,并尝试从请求中获取名为 id
的参数。如果该参数存在,则将其值显示出来;否则提示“未收到参数”。
测试路由
完成 Servlet 编写后,我们可以通过 Tomcat 启动整个 Web 项目来进行测试。启动服务后,打开浏览器访问项目主页,可以看到我们自定义的 indexServlet
链接。
点击该链接后,浏览器将跳转到我们先前创建的 IndexServlet
类所映射的路由 /index-servlet
,并触发对应的 doGet()
方法,页面会显示“GET 请求处理成功”等内容。
通过这种方式,我们可以验证 Servlet 是否配置正确、路由是否生效,以及参数是否能成功接收与显示。
生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 初始化后调用 init () 方法。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 销毁前调用 destroy() 方法。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
初始化阶段
当客户端首次请求某个 Servlet 时,Servlet 容器会首先检查内存中是否已经存在该 Servlet 的实例对象:
- 如果已存在,则直接复用该对象;
- 如果不存在,则容器会先创建该 Servlet 的实例,然后调用其
init()
方法进行初始化操作。
需要注意的是:
init()
方法在 Servlet 的生命周期中只会被调用一次,它通常用于加载配置、初始化资源等准备工作。
运行阶段
这是 Servlet 生命周期中最核心的阶段:
- 每当客户端发起请求,Servlet 容器都会创建两个对象:
HttpServletRequest
:封装客户端请求信息;HttpServletResponse
:用于生成响应结果。
- 然后,这两个对象会作为参数传递给 Servlet 的
service()
方法。
service()
方法会根据请求的类型(GET、POST 等)自动分发调用相应的 doGet()
、doPost()
等方法。
需要注意的是:
service()
方法在 Servlet 生命周期中可以被调用多次,即每一次请求都会触发一次 service()
的执行,并伴随新建的请求和响应对象。
销毁阶段
当服务器关闭或 Web 应用被移除(卸载)时,Servlet 对象将被销毁:
- 在销毁之前,Servlet 容器会调用该对象的
destroy()
方法,用于释放资源,如关闭数据库连接、终止线程等。
和初始化类似,destroy()
方法在整个生命周期中也只会被调用一次。
处理http请求
在 Servlet 中,HTTP 请求的处理主要依赖两个重要的接口:HttpServletRequest
和 HttpServletResponse
,它们分别用于接收请求和发送响应。
HttpServletRequest接口
该接口是 ServletRequest
的子接口,封装了客户端发送的所有请求信息,如参数、请求头、请求方式等。
常用方法:
getParameter(String name)
获取指定名称的请求参数(单个值),返回类型为String
。
例如:request.getParameter("username")
getParameterValues(String name)
获取指定名称的参数对应的多个值,返回类型为String[]
。
适用于如复选框等同名参数传多个值的情况。
例如:request.getParameterValues("hobby")
HttpServletResponse接口
该接口是 ServletResponse
的子接口,用于设置服务器响应的内容、格式、编码等信息。
常用方法:
setCharacterEncoding(String charset)
设置响应的编码格式,常用于防止中文乱码。
例如:response.setCharacterEncoding("UTF-8")
setContentType(String type)
设置响应的 MIME 类型,常与编码一起设置,如:
response.setContentType("text/html; charset=UTF-8")
getWriter()
获取一个字符输出流PrintWriter
,用于将响应内容输出到客户端(如浏览器)。
PrintWriter out = response.getWriter();
out.println("<h1>Hello Servlet</h1>");
PrintWriter
可以输出字符串类型的内容,是最常用的响应输出方式之一。