当前位置: 首页 > news >正文

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

完!

http://www.lryc.cn/news/579319.html

相关文章:

  • C盘空间的“元凶”——虚拟内存的神秘面纱
  • css ::before学习笔记
  • 专业AI工具导航与人工智能学习平台AIbase.cn 连接现在与AI未来的智能桥梁
  • YOLO基础算法入门之YOLOv8中的C2f(C2-Faster)高效特征提取结构
  • STC8G 8051内核单片机开发 (中断)
  • 算法学习笔记:4.KMP 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 家政维修小程序源码php方案解析
  • FASTAPI+VUE3平价商贸管理系统
  • 实际开发如何快速定位和解决死锁?
  • thinkphp中间件
  • 协同过滤推荐算法
  • 动态规划-P1216 [IOI 1994] 数字三角形 Number Triangles
  • RAG实战指南 Day 4:LlamaIndex框架实战指南
  • AutoMedPrompt的技术,自动优化提示词
  • 基于 govaluate 的监控系统中,如何设计灵活可扩展的自定义表达式函数体系
  • 【学习线路】机器学习线路概述与内容关键点说明
  • 解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
  • STC8G 8051内核单片机开发(GPIO)
  • “Payload document size is larger than maximum of 16793600.“问题解决(MongoDB)
  • C++ 网络编程(14) asio多线程模型IOThreadPool
  • PyTorch 安装使用教程
  • EXCEL小妙招——判断A列和B列是否相等
  • AI时代SEO关键词策略
  • cv610将音频chn0配置为g711a,chn1配置为 aac编码,记录
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的跨语言信息检索与知识融合(331)
  • Docker:容器化技术的基石与实践指南
  • 机器学习在智能能源管理中的应用:需求响应与可再生能源整合
  • ECharts 安装使用教程
  • 计算机视觉的新浪潮:扩散模型(Diffusion Models)技术剖析与应用前景
  • 第8章网络协议-NAT