【Servlet】Servlet入门

news2025/4/28 0:52:39

文章目录

  • 一、介绍
  • 二、入门案例
    • 导入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
     */
    @Override
    public 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.coloradmin.cn/o/1569869.html

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

相关文章

java数据结构与算法刷题-----LeetCode504. 七进制数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 倒退迭代&#xff08;除基取余法&#xff09;2. 省略掉反转操…

【JavaEE初阶系列】——文件操作 IO 之 文件系统操作

目录 &#x1f4dd;认识文件 &#x1f6a9;树型结构组织 和 目录 &#x1f388;绝对路径和相对路径 &#x1f6a9;文件类型 &#x1f4dd;文件系统操作 &#x1f388;File 概述 &#x1f388;File类的使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 静态成员变量 4…

小明记账簿-记账工具

今天不了技术&#xff0c;聊一下工具&#xff0c;最近耗费无数个日日夜夜&#xff0c;做了一个记账小程序&#xff0c;感觉很实用&#xff0c;简单方便&#xff0c;希望帮助那些需要帮助的人。 想轻松管理个人财务吗&#xff1f;试试小明记账簿吧&#xff01;它是一款便捷&…

篮桥杯刷题第n天(dp更新)

最长上升子序列 输入&#xff1a; 10 1 4 5 1 4 1 9 1 9 输出&#xff1a; 4 算法思想&#xff1a;记录每个数为结尾的最长子序列长度&#xff0c;作为dp数组。 eg&#xff1a;&#xff08;这个是以每个位置开头的记录最长的来穷举但核心仍为上述的算法思想&#xff09; …

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构&#xff1a;综合指南 前言一、什么是 Kubernetes 架构&#xff1f;1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 &#xff08;CCM&#xff09; 三…

【HarmonyOS】ArkUI - 动画

利用属性动画、显示动画、组件转场动画实现组件动画效果。 一、属性动画 属性动画是通过设置组件的 animation 属性来给组件添加动画&#xff0c;当组件的 width、height、Opacity、backgroundColor、scale、rotate、translate 等属性变更时&#xff0c;可以实现渐变过渡效果。…

有人用GPT来做日内交易,居然赚钱了!但是……

在我们还在烦恼会不会被AI替代时&#xff0c;已经有人在教ChatGPT去炒股票了。 在近年ChatGPT火速出圈后&#xff0c;围绕AI能取代什么职业的讨论持续受到大众关注。 从事客服、编程、法律合规以及内容创作等行业人员最早感受到这股AI带来的寒意。 那ChatGPT能不能替代交易员…

Web APIs简介 Dom

JS的组成 API API 是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节 简单理解&#xff1a;API是给程序员提供的一种工具&#xff0c;以便能更轻松的实现…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法&#xff1a;将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突&#xff1a;不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突&#xff1a; 1. 开放寻址&#xff1a;产生哈希冲突后&…

刷题之Leetcode704题(超级详细)

704. 二分查找 力扣题目链接(opens new window)https://leetcode.cn/problems/binary-search/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&am…

【Apache Doris】周FAQ集锦:第 1 期

【Apache Doris】周FAQ集锦&#xff1a;第 1 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

【Java设计模式】序:设计模式总体概述

目录 什么是设计模式设计模式的分类1 创建型模式1.1. 单例&#xff08;Singleton&#xff09;1.2 原型&#xff08;Prototype&#xff09;1.3 工厂方法&#xff08;FactoryMethod&#xff09;1.4 抽象工厂&#xff08;AbstractFactory&#xff09;1.5 建造者&#xff08;Builde…

<网络安全>《71 微课堂<常见的国家级APT组织介绍>》

1 简介 国家级APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&#xff09;组织是有国家背景支持的顶尖黑客团伙&#xff0c;专注于针对特定目标进行长期的持续性网络攻击。 2 十大APT 2.1 NSA 美国国家安全局&#xff08;National Security Agency&a…

Redis面试题28道

1、什么是类加载器&#xff0c;类加载器有哪些&#xff1f; 1、什么是类加载器&#xff1f; 类加载器负责加载所有的类&#xff0c;其为所有被载入内存的类生成一个 java.lang.Class 实例对象。 2、类加载器有哪些&#xff1f; JVM 有三种类加载器&#xff1a; &#xff08…

基于GaN的半导体光学放大器SOA

摘要 基于GaN的材料可覆盖很宽的光谱范围&#xff0c;以紫外、紫、蓝、绿和红波发射的激光二极管已经商业化。基于GaN的半导体光学放大器&#xff08;SOA&#xff09;具有提高激光二极管输出功率的能力&#xff0c;因此SOA将有很多潜在应用。未来需要利用短波、超快脉冲特性的…

GD32F470_ADS1115 超小型 16位 模数转换器 ADC 4通道模块移植

2.9 ADS1115多路模数转换器 ADS1115 器件是兼容 IIC 的 16 位高精度低功耗模数转换器 (ADC)&#xff0c;采用超小型无引线 X2QFN-10 封装和 VSSOP-10 封装。ADS111x 器件采用了低漂移电压基准和振荡器。ADS1114 和 ADS1115 还采用可编程增益放大器(PGA)和数字比较器。这些特性加…

kali报错Unable to connect to remote host: No route to host,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

《搜广推算法指南》(2024版) 重磅发布!

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 结合…

全自动封箱机的工作原理:科技与效率的完美结合

随着科技的不断发展&#xff0c;越来越多的自动化设备走进了我们的日常生活和工业生产中。其中&#xff0c;全自动封箱机作为物流包装领域的重要一环&#xff0c;凭借其高效、精准的工作性能&#xff0c;正逐渐成为提升生产效率、降低劳动成本的得力助手。星派就来与大家深入探…