Javaweb - 10.1 Servlet
目录
Servlet 简介
动态资源和静态资源
Servlet 简介
Servlet 开发流程
目标
开发过程
开发一个 web 类型的 module
开发一个 form 表单
开发一个 UserServlet
在 web..xml 为 userServlet 配置请求路径
Edit Configurations
启动项目
完!
Servlet 简介
动态资源和静态资源
静态资源:
无需在程序运行时,通过代码生成的资源,在程序运行之前就写好的资源。例如:html css js img 音频 视频文件
动态资源:
需要在程序运行时,通过代码生成的资源,在程序运行之前,无法确定的数据,运行时动态生成。例如:Servlet Thymeleaf......
动态资源指的不是视图上的动态效果,而是简单的人机交互效果~
举个栗子:
去蛋糕店买蛋糕:
我们直接买柜台上已经做好的:静态资源
我们和店员提出要求后现场定制一个:动态资源
Servlet 简介
Servlet(server applet)是运行在服务端(Tomcat)的 Java 小程序,是 sun 公司提供一套定义动态资源的规范,代码层面上 Servlet 就是一个接口
用来接收 处理客户端请求 响应给浏览器的动态资源。在整个 Web 应用中,Servlet 主要负责接收处理请求,协同调度功能以及响应数据。我们可以把 Servlet 称作为 Web 应用中的控制器。
不是所有的 Java 类都能用于处理客户端请求,能处理客户端请求,并做出响应的一套技术标准就是 Servlet
Servlet 是运行在服务端的,所以 Servlet 必须在 Web 项目中开发并且在 Tomcat 这样的服务器容器中运行。
Servlet 主要起一个承上启下的作用
Servlet 开发流程
目标
实现功能:校验注册时,用户名是否被占用。通过客户端向 Servlet 发送请求,携带 username,如果用户名是 “admin”,则向客户端响应 NO,如果是其它,响应 YES
开发过程
开发一个 web 类型的 module
上篇文章已经有所介绍,此处进行复习
开发一个 form 表单
在 web 目录下,开发一个 form 表单,向servlet发送一个GET请求并携带username参数
这里的 action 先空着,因为我们还没有写 servlet 的代码~
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form method = "get" action = "">用户名:<input type = "text" name = "username"><br/><input type="submit" value = "校验">
</form></body>
</html>
开发一个 UserServlet
在 src 目录下面创建一个 UserServlet 类
如果直接 implements Servlet 的话,需要重写下面四个方法,比较繁琐
我们直接可以 extends HttpServlet
package com.zzz.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;/** @author zzr* @date: 2025/07/03 20:49* @description: 验证用户名的Servlet*/
public class userServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1. 获取请求中的键值对参数 key=value (根据参数名获取参数 无论参数在 usl? 后面,还是在请求体中,都能获取)String username = request.getParameter("username");// 2.处理业务的代码String info = "YES";if ("admin".equals(username)) {info = "NO";}// 3. 将要响应的数据放入 responsePrintWriter writer = response.getWriter(); //该方法返回的是一个向响应体中打印字符串的打印流writer.write(info);}
}
注意:
1. 自定义一个类,要继承 HttpServlet 类
2. 重写 service 方法,该方法主要就是处理用户的请求
3. HttpServletRequest 代表请求对象,是由请求报文,经过 Tomcat 转换而来的,通过该对象,可以获取请求中的信息
4. HttpServletResponse 代表响应对象,该对象会被 Tomcat 转换为响应的报文,通过该对象,可以设置响应中的信息。
5. Servlet 对象的生命周期(创建,初始化,处理服务,销毁)都是由 Tomcat 自己管理的,不需要我们干预。
6. HttpServletRequest 和 HttpServletResponse 两个对象也是由 Tomcat 自动和 报文来转换的,在调用 service 方法传入给我们的~
在 web..xml 为 userServlet 配置请求路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"version="5.0"><!-- 1. 配置 servlet 类,并起一个别名servlet-class 告诉 Tomcat 对应的要实例化的 servlet 类servlet-name 用于关联请求的映射路径
--><servlet><servlet-name>userServlet</servlet-name><servlet-class>com.zzz.servlet.userServlet</servlet-class></servlet>
<!-- 映射路径 --><servlet-mapping><servlet-name>userServlet</servlet-name><url-pattern>/userServlet</url-pattern></servlet-mapping>
</web-app>
这里配置完映射路径后,url-pattern 中的路径是什么,我们的 html 页面中 form 表单要提交的 action 就是什么~
补充:
1. Servlet 并不是文件系统中实际存在的文件或目录,为了能够请求到该资源,需要为其配置映射路径
2. Servlet 的请求映射路径配置在 web.xml 中
3. <servlet-name> 作为 servley 的别名,见名知意即可,随意定义
4. <usl-pattern> 标签用于定义 servlet 的请求映射路径
5. 一个 servlet 可以对应多个不同的 <url-pattern>
6. 多个 sevlet 不能使用相同的 <url-pattern>
Edit Configurations
先将我们之前部署的项目删除掉~
再部署我们的 web02~
启动项目
使用 debug 模式运行测试,访问 index.html,提交表单测试
打个断点,debug 模式运行
自动会跳到 index.html 页面(index.html 页面是会默认跳出的页面~)
输入 zzz 点击校验,因为我们的断点,浏览器等待响应,转小圆圈
然后进入 IDEA,查看,收到了我们的 “zzz”,
全部放通后,最终浏览器响应 YES