【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
     */
    @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方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bugku-web-速度要快

发现phpsessid 从上述提示 提示发送post请求&#xff0c;并且带有参数margin 发送后发现报文头部有一个字段叫flag&#xff0c;但好像每一次flag都不一样 构建Python脚本 request requests.Session()data {margin:find, } for i in range(50):html request.post(urlhttp:/…

JS详解-class-类的核心语法关于ES6与ES5

class基本核心语法&#xff1a; //定义类class Person{//公有属性(推荐此处定义)name// 定义属性并设置默认值price 100//构造函数constructor(name,age){// 构造函数内部的this实例化对象this.name namethis.age age// 动态添加属性(不推荐&#xff0c;查找麻烦)this.rank …

位运算算法(1)

目录 一、算法简述 191. 位1的个数 一、题目描述 二、思路解析 三、代码 338.比特位计数 一、题目描述 二、思路解析 三、代码 461.汉明距离 一、题目描述 二、思路解析 三、代码 声明&#xff1a;本博客涉及到的三道题均为一种做法的总结&#xff0c;建议先了解做…

ansible-tower安装

特别注意&#xff1a;不需要提前安装ansible&#xff0c;因为ansible tower中的setup.sh脚本会下载对应的ansible版本 ansible tower不支持Ubuntu系统,对cenos系统版本也有一定的限制&#xff0c;建议使用centos7.9。 准备一台全新的机器安装&#xff0c;因为ansible tower需要…

RISC-V/ARM mcu OpenOCD 调试架构解析

Risc-v/ARM mcu OpenOCD 调试架构解析 最近有使用到risc-v的单片机&#xff0c;所以了解了下risc-v单片机的编译与调试环境的搭建&#xff0c;面试时问到risc-v的调试可参看以下内容。 risc-v根据官方的推荐&#xff0c;调试器服务是选择OpenOCD&#xff0c;DopenOCD(开放片上…

2024多功能知识付费源码下载

多功能知识付费源码下载实现流量互导多渠道变现 源码介绍 资源变现类产品的许多优势&#xff0c;并剔除了那些无关紧要的元素&#xff0c;使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持&#xff1a;视频、音频、图文、文档…

【机器学习】揭秘无监督学习:机器如何自我学习发现数据奥秘

无监督学习&#xff1a;全面解析 引言 在机器学习的众多分支中&#xff0c;无监督学习因其在未标记数据上发现隐藏模式的能力而独树一帜。它不依赖于事先标记的输出&#xff0c;而是通过分析数据本身的结构和分布来揭示内在的关系和分类。本文深入探讨无监督学习的核心概念、…

2013年认证杯SPSSPRO杯数学建模C题(第一阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…

学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)

这是 学透 Spring Boot 专栏 的第三篇&#xff0c;欢迎关注我&#xff0c;与我一起学习和探讨 Spring Boot 相关知识&#xff0c;学透 Spring Boot。 从面试题说起 今天我们通过一道和Spring Boot有关的常见面试题入手。 面试题&#xff1a;说说 Spring Boot 中有哪些常用注解…

图解PyTorch中的torch.gather函数和 scatter 函数

前言 torch.gather在目前基于 transformer or query based 的目标检测中&#xff0c;在最后获取目标结果时&#xff0c;经常用到。 这里记录下用法&#xff0c;防止之后又忘了。 介绍 torch.gather 官方文档对torch.gather()的定义非常简洁 定义&#xff1a;从原tensor中获…

[Java基础揉碎]注解

目录 介绍 基本的Annotation介绍 1) Override:限定某个方法&#xff0c;是重写父类方法,该注解只能用于方法 2) Deprecated: 用于表示某个程序元素(类&#xff0c;方法等)已过时 3) SuppressWarnings:抑制编译器警告 四大元注解 ​编辑 Retention ​编辑​编辑 Docume…

【MySQL】MySQL故障排查与环境优化

案例 MySQL是目前企业最常见的数据库之一 日常维护管理的过程中&#xff0c;会遇到很多故障 mysql默认配置无法满足高性能要求 数据流向 MySQL常见的故障案例 故障一 故障现象&#xff1a; ERROR 2002 (HY000): Cant connect to local MySQL server through socket data/m…

【计算机网络】select/poll

多路转接 - select/poll 一、I/O 多路转接之 select1. select 接口2. select 的使用3. select 的优缺点 二、I/O 多路转接之 poll1. poll 接口2. poll 的使用3. poll 与 select 的对比 一、I/O 多路转接之 select 多路转接属于 IO 复用方式的一种。系统提供 select() 函数来实…

如何在 Mac 上恢复已删除的数据

如果您丢失了 Mac 上的数据&#xff0c;请不要绝望。恢复数据比您想象的要容易&#xff0c;并且有很多方法可以尝试。 在 Mac 上遭受数据丢失是每个人都认为永远不会发生在他们身上的事情之一......直到它发生。不过&#xff0c;请不要担心&#xff0c;因为您可以通过多种方法…

数据结构(六)——图的应用

6.4 图的应用 6.4.1 最小生成树 对于⼀个带权连通⽆向图G (V, E)&#xff0c;⽣成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和&#xff09;也可能不同。设R为G的所有⽣成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称为G的…

解析网约车微服务中台架构:打造智能高效的出行平台

随着互联网技术的不断发展&#xff0c;网约车行业已经成为了城市出行的重要方式之一。为了应对市场竞争和用户需求的不断变化&#xff0c;各大网约车平台纷纷采用了微服务中台架构&#xff0c;以构建智能高效的出行平台。本文将深入探讨网约车微服务中台架构的核心概念、关键特…

反序列化漏洞

常见的反序列化流量特征&#xff1a; 像这种st2 045、068、shiro反序列化、fastjson这些java反序列化一类的流量特征 shiro就看cookie中Rememberme字段&#xff0c;什么都要从这里传 fastjson&#xff1a;可以在提交的包中找找json格式的数据&#xff0c;重点看一下有无rmi或…

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!

操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…

记录Xshell使用ed25519公钥免密链接SSH

试了半天&#xff0c;Xshell好像没办法导入linux生成的ssh公钥,因此需要以下步骤实现免密登录 结论&#xff0c;在linux公钥文件中&#xff0c;将客户端生成的ed25519公钥加上去即可(一个公钥单独一行) 1.使用Linux生成秘钥文件(不需要输入私钥密码passphrase)或者直接创建一…

【css】文本过长溢出一行不换行普通css以及antd实现

.text-box { white-space: nowrap; /* 防止文字换行 */ overflow: hidden; /* 隐藏超出div的内容 */ text-overflow: ellipsis; /* 当内容超出时&#xff0c;显示省略号 */ max-width: calc(100% - 80px); /* 假设按钮宽度为80px&#xff0c;则设置div的最大宽度为容器宽度…