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

【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(3) |GET和POST两种基本请求方法有什么区别
  • 深入理解MP4视频文件裁剪原理[下下]
  • Navicat Premium工具安装教程(超详细讲解)
  • 未来社会:人与机器更深度的交互及其影响
  • 2024年04月在线IDE流行度最新排名
  • # 达梦数据库知识点
  • B000-1115-运算符
  • 设计模式:创建者模式
  • 第四百四十三回
  • HTML1:html基础
  • 个人品牌打造IP孵化运营培训教程架构课件
  • 汽车网络安全管理
  • 【算法刷题day16】Leetcode:104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
  • 微信小程序生命周期管理:从数据初始化到事件绑定
  • 【随笔】Git -- 高级命令(中篇)(七)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 4. 路由到控制器 - Laravel从零开始教程
  • create-react-app项目添加less配置
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Laravel 菜鸟晋级之路
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • leetcode98. Validate Binary Search Tree
  • MySQL数据库运维之数据恢复
  • Mysql优化
  • PHP面试之三:MySQL数据库
  • scala基础语法(二)
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spring-boot 启动时碰到的错误
  • Vue2.x学习三:事件处理生命周期钩子
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 如何设计一个比特币钱包服务
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 异步
  • 原生js练习题---第五课
  • 《码出高效》学习笔记与书中错误记录
  • 7行Python代码的人脸识别
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 积累各种好的链接
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #pragma data_seg 共享数据区(转)
  • #QT(TCP网络编程-服务端)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (LeetCode) T14. Longest Common Prefix
  • (SpringBoot)第七章:SpringBoot日志文件
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (未解决)macOS matplotlib 中文是方框
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)