【Servlet】Servlet入门

文章目录

  • 一、介绍
  • 二、入门案例
    • 导入servlet-api的解决办法

一、介绍

概念:server applet,即:运行在服务器端的小程序

Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。

将来我们定义一个类,实现Servlet接口,复写方法,tomcat就可以识别这个类,我们就称它为一个Servlet

作用:

  1. 获取用户(客户端)发给我的数据
  2. 调用DAO中的方法完成添加功能
  3. 在控制台打印添加成功

Servlet用大白话来说,就像是一个在Web服务器上运行的Java小程序,它专门用来处理来自浏览器或其他客户端的请求,并根据这些请求动态生成响应内容。你可以想象一下,每当我们在网页上点击按钮或链接发送请求时,Servlet就在后台接收到这个请求,并进行一系列操作,比如从数据库查询数据、执行业务逻辑或者计算结果。

Servlet并不是直接给用户看的一个静态HTML页面,而是负责生成这些动态页面背后的内容。当Servlet完成工作后,会把生成的结果(可能是HTML页面的一部分、JSON数据、XML数据或者其他格式的数据)返回给客户端,客户端(通常是浏览器)再将这些数据呈现给我们用户。

打个比方,如果你在网上购物,当你点击“查看购物车”按钮时,实际上就是向服务器发送了一个请求。这时,服务器上的Servlet就发挥作用了,它读取你的购物车信息,计算总价等细节,然后生成包含你购物车商品列表的网页并传回给你,这样你就能看到自己挑选的商品了。

总之,Servlet是Java语言提供的一种强大工具,用于开发和扩展Web服务器功能,实现与用户的交互式通信,从而创建动态、功能丰富的Web应用程序。


二、入门案例

在web目录下新建add.html文件

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="add" method="post">名称:<input type="text" name="fname">价格:<input type="text" name="price">库存:<input type="text" name="fcount">备注:<input type="text" name="remark"><input type="submit" value="添加">
</form>
</body>
</html>

新建AddServlet类

image-20240303171017922

如果是一个普通类,它是不能够去获取用户发给我的数据的,此时需要让它继承HttpServlet,而这个类并不在JDK包里,而在servlet-api包下。

image-20240303184502393


导入servlet-api的解决办法

  1. 将servlet-api导入到项目里去

    • 在父项目的根目录新建lib文件夹,然后将servlet-api引入。

      这种情况是在很多个Module共享的,默认情况下和module是没有关系的。

      第一步:右击,将它添加为库

      image-20240303203252513

      然后从子项目中引用它

      image-20240303203509169

      加进来后,表示这个module依赖这个Library,但是这个Module里有一个artifact部署包,它是已经生成了。

      • 方法一:将artifact删掉,重新建一个

      • 方法二:点击Problems,将lib加入进入

        image-20240303203716327

    • 在当前项目的web\WEB-INF下新建lib文件夹,导入servlet-api

      缺点:只能是当前module独享。如果有第二个module,我们需要再次重复的新建lib。

      优点:启动的时候会自动将lib加进去

  2. 将Tomcat依赖加入进来

    找到库(Library)

    image-20240303184640242

    将tomcat依赖导入进来

    image-20240303184717917

    查看外部库,可以看见tomcat库已被引入

    image-20240303184747810

此时HttpServlet已经可以正常导入了

编写AddServlet类

package com.atguigu.servlets;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class AddServlet extends HttpServlet {/*** 这个方法可以帮你去响应post请求,发一个post请求过来,doPost方法就会被调用* 当客户端给服务端发请求的时候,服务器端就把这个请求封装成一个对象:request*/@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {// 请求里去获取参数,获取名字为fname的值String fname = request.getParameter("fname");// 通过Http请求发过来的只能是字符串String priceStr = request.getParameter("price");// 如果需要用到数字,强转即可。int price = Integer.parseInt(priceStr);String fcountStr = request.getParameter("fcount");String fcount = request.getParameter(fcountStr);String remark = request.getParameter("remark");System.out.println("fname = " + fname);System.out.println("price = " + price);System.out.println("fcount = " + fcount);System.out.println("remark = " + remark);}
}

将servlet的名字和某个类对应上,请求add这个组件可以对应上我们刚刚写的AddServlet

image-20240303184832812

配置web\WEB-INF\web.xml

一个servlet允许对应多个servlet-mapping,无论发给哪个,都是对应一个servlet。这样可以在servlet当中获取我们到底是通过哪个URL请求过来的。根据不同URL发送的请求,可以执行不同的业务逻辑。

<servlet><servlet-name>Demo02Servlet</servlet-name><servlet-class>com.atguigu.servlets.Demo02Servlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>Demo02Servlet</servlet-name><url-pattern>/demo02</url-pattern>
</servlet-mapping>
<servlet-mapping><servlet-name>Demo02Servlet</servlet-name><url-pattern>/demo021</url-pattern>
</servlet-mapping>
<servlet-mapping><servlet-name>Demo02Servlet</servlet-name><url-pattern>/demo022</url-pattern>
</servlet-mapping>

但是一个servlet-mapping不能对应多个servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><!-- servlet名字可以随便写 --><servlet-name>AddServlet</servlet-name><!-- 这里需要写上类的全类名 --><servlet-class>com.atguigu.servlets.AddServlet</servlet-class></servlet><!-- 映射 --><servlet-mapping><servlet-name>AddServlet</servlet-name><!-- 这里/千万不能丢! --><url-pattern>/add</url-pattern></servlet-mapping>
</web-app>

执行流程:

  1. 用户发请求:action=add
  2. 服务器(tomcat,项目)中,web.xml中找到servlet-mapping中的url-pattern = /add
  3. servlet-name = AddServlet
  4. 找和servlet-mappingservlet-name一致的servlet
  5. 找到servlet中的servlet-class就能通过 <servlet> 找到com.atguigu.servlets.AddServlet
  6. tomcat会将字节码文件加载进内存,并且创建其对象
  7. 用户发送的是post请求(method=post),因此 tomcat 会执行AddServlet中的doPost方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目新功能开发篇】开发编码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

mysql 磁盘空间100%

MySQL大事务可能会导致过多的占用临时文件&#xff0c;导致磁盘空间撑满的问题 本例说明下binlog cache产生的临时文件 案例复现 调小binlog_cache_size&#xff0c;让DML使用临时文件 使用存储过程模拟大事务 创建表 create table t1( id int AUTO_INCREMENT, name varchar…

Rust---复合数据类型之字符串与切片(2)

目录 字符串操作删除 (Delete)连接 (Concatenate) 字符串转义 前情回顾: Rust—复合数据类型之字符串&#xff08;1&#xff09; 字符串操作 删除 (Delete) 删除方法仅适用于 String 类型&#xff0c;分别是&#xff1a; pop()&#xff0c;remove()&#xff0c;truncate()&a…

【Redis系列】Redis安装与使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

保研线性代数复习3

一.基底&#xff08;Basis&#xff09; 1.什么是生成集&#xff08;Generating Set&#xff09;&#xff1f;什么是张成空间&#xff08;Span&#xff09;&#xff1f; 存在向量空间V(V&#xff0c;&#xff0c;*)&#xff0c;和向量集&#xff08;xi是所说的列向量&#xff…

大模型prompt技巧——思维链(Chain-of-Thought)

1、Zero-shot、One-shot、Few-shot 与fintune prompt的时候给出例子答案&#xff0c;然后再让模型回答。 2、zero-shot-CoT “Let’s think step by step”有奇迹效果 3、多数投票提高CoT性能——自洽性&#xff08;Self-consistency&#xff09; 多个思维链&#xff0c;然后取…

WordPress 6.5 “里贾纳”已经发布

WordPress 6.5 “里贾纳”已经发布&#xff0c;其灵感来自著名爵士小提琴家Regina Carter的多才多艺。雷吉娜是一位屡获殊荣的艺术家和著名的爵士乐教育家&#xff0c;以超越流派而闻名&#xff0c;她在古典音乐方面的技术基础和对爵士乐的深刻理解为她赢得了大胆超越小提琴所能…

修改element-ui table组件展开/收起图标、支持点击行展开/收起、隐藏不可展开行得图标

Element中table默认支持的&#xff0c;展开和收起功能&#xff0c;如下&#xff1a; 针对表格的展开收起&#xff0c;本文改造的主要有3点&#xff1a; 1、修改展开/收起的图标&#xff1b; 2、对于不支持展开/收起的行&#xff0c;隐藏图标&#xff1b; 3、点击行&#xff0…

windows10 上安装 docker

windows 10 上安装 docker 官方目前给的方案是利用 Docker Desktop 来安装 docker 环境 一、安装前准备工作 1.1 检查系统要求 Windows 10 64 位&#xff1a;Home 或 Pro 2004&#xff08;内部版本 19041&#xff09;或更高版本&#xff0c;或者 Enterprise 或 Education 1…

Redis中的复制功能(四)

复制功能 步骤2:建立套接字连接 在SLAVEOF命令执行之后&#xff0c;从服务器将根据命令所设置的IP地址和端口&#xff0c;创建连向主服务器的套接字连接&#xff0c;如图所示。如果从服务器创建的套接字能成功连接(connect)到主服务器&#xff0c;那么从服务器将为这个套接字…

软考109-上午题-【计算机网络】-网络设备

一、网络设备 1-1、物理层的互联设备 物理层的设备&#xff1a;中继器、集线器 1、中继器 中继器&#xff0c;可以使得两个链路在物理层上互联。 可以使得信号再生&#xff0c;信号增强。因此&#xff0c;中继器使得接受用户&#xff0c;收到衰减很小的原始信号 2、集线器&a…

【Java EE】关于Maven

文章目录 &#x1f38d;什么是Maven&#x1f334;为什么要学Maven&#x1f332;创建⼀个Maven项目&#x1f333;Maven核心功能&#x1f338;项目构建&#x1f338;依赖管理 &#x1f340;Maven Help插件&#x1f384;Maven 仓库&#x1f338;本地仓库&#x1f338;私服 ⭕总结 …

Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10)

原文&#xff1a;Whisper对于中文语音识别与转写中文文本优化的实践(Python3.10) - 知乎 阿里的FunAsr对Whisper中文领域的转写能力造成了一定的挑战&#xff0c;但实际上&#xff0c;Whisper的使用者完全可以针对中文的语音做一些优化的措施&#xff0c;换句话说&#xff0c;…

前端:登录界面

效果 代码 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

SpringBoot整合ELK8.1.x实现日志中心教程

目录 背景 环境准备 环境安装 1.JDK安装 2.安装Elasticsearch 3.安装zookeeper 4.安装Kafka 5.安装logstash 6.安装file beat 解决方案场景 1.日志采集 1.1 应用日志配置 1.1.1 创建logback-spring.xml文件 1.1.2 创建LoggerFactory 1.1.3 trace日志的记录用法 …

Linux上管理文件系统

Linux上管理文件系统 机械硬盘 机械硬盘由多块盘片组成&#xff0c;它们都绕着主轴旋转。每块盘片上下方都有读写磁头悬浮在盘片上下方&#xff0c;它们与盘片的距离极小。在每次读写数据时盘片旋转&#xff0c;读写磁头被磁臂控制着不断的移动来读取其中的数据。 所有的盘片…

实操:Dropzone.js实现文件上传

&#x1f3e0;官网 点我前往 &#x1f953;依赖 <script src"https://unpkg.com/dropzone5/dist/min/dropzone.min.js"></script> <link rel"stylesheet" href"https://unpkg.com/dropzone5/dist/min/dropzone.min.css" type&…

手搓链表(java)(不完整)

手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09; 文章目录 手搓链表&#xff08;java&#xff09;&#xff08;不完整&#xff09;前言一、代码1.MyLinkedList类&#xff1a;2.测试类&#xff1a; 总结 前言 提示&#xff1a;以下是本篇文章正文内容&…

LeetCode_876(链表的中间结点)

//双指针//时间复杂度O(n) 空间复杂度O(1)public ListNode middleNode(ListNode head) {ListNode slowhead,fast head;while (fast!null && fast.next!null){slow slow.next;fast fast.next.next;}return slow;} 1->2->3->4->5->null 快指针移动两个…