Servlet详细教程

news2024/11/19 3:46:24

文章目录

  • Servlet
    • servlet 简介
    • Servlet 入门案例
      • 页面编写
      • 页面提交 get 请求
    • Servlet 和 Tomcat 关系
      • servlet-api
      • get 和 post 请求
    • Servlet 生命周期
    • 案例
    • HttpServletRequest 接口
      • 简介
      • 文件上传
      • FileServlet 类


Servlet

servlet 简介

servlet 全称为 server applet 是服务器的小程序,是用 java 语言编写的服务器程序,目的是和浏览器交互并且动态的生成 web 内容; servlet 具体是指实现了 Servlet 接口的类,servlet 运行于支持 java 的应用服务 器(tomcat)中。 从原理上讲,servlet 可以响应任何的请求,但是在绝大多数时 servlet 用来扩展基于http 协议的 web 服务。 简单理解:之前学习过的 JDBC 技术是用来实现 java 语言和数据库之间的连接技术,现在 需要实现 java 语言和浏览器进行连接,就需要一个像 JDBC 这样的一个中间件,servlet 就作为这个中间件;

Servlet 入门案例

使用 servlet + jsp 技术,实现页面登录时用户名和密码输入,后台获取页面上输入的用 户名和密码;

页面编写

在这里插入图片描述

web.xml

在这里插入图片描述

servlet 类

/**
* 通过 web.xml 配置文件建立与前端页面和后台 servlet 连接
* 在 servlet 类中就可以针对页面发送的请求进行对应的处理;
* 处理请求的方案,要根据页面发送请求时的请求方式来决定:
* jsp 页面上常用两种请求方式:
*  ① get  -- servlet 类中可以使用 doGet 方法来进行请求的处理
*  ② post -- servlet 类中可以使用 doPost 方法来进行请求的处理
* 如果不知道页面发送请求时的请求方式,servlet 类中有提供通用
* 方法 service 该方法可处理任意方式的请求;
* service 方法的工作原理:
* ① 拦截请求,任意请求方式的请求都能拦截
* ② 分析被拦截的请求具体使用的是哪种请求方式
* ③ 根据分析结果去调用对应的 doXXX 方法来处理该请求 */
public class LoginServlet extends HttpServlet {
/* Servlet 接口中定义好的 doGet 方法,用于页面的 get 请求处理*/
@Override
protected void doGet(HttpServletRequest req,                HttpServletResponse resp) throws ServletException, IOException {
/**
* 请求处理三部曲:
* ① 获取请求参数
* ② 请求参数处理
* ③ 响应结果给页面 */
String username = req.getParameter("username"); String pwd = req.getParameter("pwd");

System.out.println(username + "----" + pwd);
}

/* Servlet 接口中定义好的 doPost 方法,用于页面的 post 请求处理*/
@Override
protected void doPost(HttpServletRequest req,               HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}

/* Servlet 接口中定义好的 Service 方法,可用于任意请求处理*/
@Override

页面提交 get 请求

在这里插入图片描述

控制台输出结果

在这里插入图片描述

Servlet 和 Tomcat 关系

Servlet 是 tomcat 的一个组件,Servlet 的功能需要依赖 tomcat 的 servletapi.jar;在 web 工程启动时,有了这个 jar 包就可以直接使用里面的功能,tomcat
会直接解析运行。
Tomcat 在启动时,会根据 web.xml 配置文件进行容器的初始化;初始化
ServletConfig、ServletContext 对象,以及 HttpServletRequest 和
HttpServletResponse 对象;一起交给 Servlet;此后 Servlet 就具备了相关的一
些功能;

servlet-api

servlet-api 下主要有两部分内容;一个是 javax.servlet,另一个是
javax.servlet.http;
javax.servlet 中主要是一些接口的定义,例如 Servlet 接口、抽象类
GenericServlet,这些都是通用的接口或者抽象类;
javax.servlet.http 中定义了与 http 请求相关的类和接口;例如HttpServlet类、
HttpServletRequest 和 HttpServletResponse 接口;
Servlet 接口、 GenericServlet 抽象类、 HttpServlet类 三者之间的关系如下
图:

在这里插入图片描述
在这里插入图片描述

在自定义 servlet 类时,可以直接实现 Servlet 接口或者是继承抽象类
GenericServlet;但是不建议这么做,因为在接口和抽象类中会存在大量的抽象方法,需要
重写不必要的方法;HttpServlet 作为 GenericServlet 的子类,必然已经实现类接口
和抽象中的抽象方法,所有继承 HttpServlet 不需要去重写大量的抽象方法,只需要关注
我们需要的方法即可;
因此 HttpServlet 类时我们在自定义 Servlet 类的首选父类;

get 和 post 请求

get 和 post 是页面在进行数据提交时的两种不同方式,在 servlet 进行处理时也会有对
应的方法;
get -- doGet 方法
post -- doPost 方法
doGet 和 doPost 都是 service 方法的拆分;不管页面是以哪种请求方式进行请求的发
送,都会先通过 service 方法,由 service 方法进行分析,再来决定该调用什么方法进
行请求的处理;
两种请求方式的区别:
① 参数传递方式不同:
get 所有的请求参数都会在地址栏进行拼接;
post 不会在 url 中显示,而是在请求内容中,相对于 get 更安全
② 传送数据大小不同
get 传送的数据量较小,主要是因为 url 长度受限;
post 传送的数据一般认为是不受限制的;
③ 信息缓存
get 提交的数据能被缓存,请求保留在浏览器的历史记录中;
post 一半不能被缓存,不会保存在浏览器的历史记录中;
④ 编码方式与乱码
get 请求默认编码格式为 ISO-8859-1(tomcat8以前),tomcat8 以后默认为
utf-8;因此在使用 tomcat8 以前的版本进行请求参数获取时,需要进行编码格式的转换;
String username = request.getParamter("username");
String new_name = new String(username.getByte("iso-8859-
1"),"utf-8");
post 请求支持多种编码类型,可以使用更好的方式进行编码的转换
request.setCharacterEncoding("UTF-8");
如果是在响应的时候乱码,也可以使用 response 对象进行响应编码设置
response.setContentType("text/html",charset="utf-8")
总结:表单或者是 AJAX 在进行请求发送时,一般使用 post 请求方式;如果是 a 标签进
行请求的发送,默认是 get 请求;
Servlet 生命周期
案例
doGet 和 doPost 都是 service 方法的拆分;不管页面是以哪种请求方式进行请求的发
送,都会先通过 service 方法,由 service 方法进行分析,再来决定该调用什么方法进
行请求的处理;
两种请求方式的区别:
① 参数传递方式不同:
get 所有的请求参数都会在地址栏进行拼接;
post 不会在 url 中显示,而是在请求内容中,相对于 get 更安全
② 传送数据大小不同
get 传送的数据量较小,主要是因为 url 长度受限;
post 传送的数据一般认为是不受限制的;
③ 信息缓存
get 提交的数据能被缓存,请求保留在浏览器的历史记录中;
post 一半不能被缓存,不会保存在浏览器的历史记录中;
④ 编码方式与乱码
get 请求默认编码格式为 ISO-8859-1(tomcat8以前),tomcat8 以后默认为
utf-8;因此在使用 tomcat8 以前的版本进行请求参数获取时,需要进行编码格式的转换;
String username = request.getParamter("username");
String new_name = new String(username.getByte("iso-8859-
1"),"utf-8");
post 请求支持多种编码类型,可以使用更好的方式进行编码的转换
request.setCharacterEncoding("UTF-8");
如果是在响应的时候乱码,也可以使用 response 对象进行响应编码设置
response.setContentType("text/html",charset="utf-8")
总结:表单或者是 AJAX 在进行请求发送时,一般使用 post 请求方式;如果是 a 标签进
行请求的发送,默认是 get 请求;

Servlet 生命周期

Servlet 生命周期指 servlet 从初始化到被销毁的整个过程;整个过程分为三个阶段:
① 容器的初始化 -- init()
② 容器的使用 -- service -- doXX
③ 容器销毁 -- destroy
初始化是在服务器启动后第一次访问 servlet 时;容器只会初始化一次;
使用是在页面发送请求后,使用对应的方法进行请求的处理;
销毁是服务器关闭;
一个 Servlet 想要正常的工作,必须先进行容器的初始化,然后根据请求方式提供对应的服
务;

案例

public class LifeServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("容器被初始化了.....");
}
@Override
protected void service(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
System.out.println("提供服务.....");
}
@Override
public void destroy() {
System.out.println("容器被销毁.....");
}
}

web.xml

在这里插入图片描述

发送请求

在这里插入图片描述

执行结果
在这里插入图片描述

如果需要在服务器启动时就进行容器的初始化,可以在 web.xml 配置文件中进行初始化时间
的设置;
<load-on-startup>0</load-on-startup>
设置为大于等于0的整数,表示在服务器启动时就进行容器的初始化;

在这里插入图片描述

HttpServletRequest 接口

简介

HttpServletRequest 接口称为请求处理对象,是 ServletRequest 的子接口,在
Serlvlet 初始化时被创建(可能是容器启动时,或者是第一次访问容器时)并且交给
service 方法来使用;
请求对象可用于接收客户端请求、获取请求参数,还可以获取主机地址、端口号、请求方式、
项目路径等功能;
一个请求被分为三个部分:分别是请求行、请求头、请求体	

请求行

通过 request 对象相应的方法可以获取请求行中的内容;请求行中主要包含:http 协议、
服务、端口、项目名称、请求方式、参数列表等;

jsp 页面

在这里插入图片描述

web.xml

在这里插入图片描述

servlet 类

在这里插入图片描述

请求头

请求头是当前用户发送的数据的描述信息;
请求头内容时浏览器在发送请求时自动添加的,不需要编程人员操作;
如果想要查看请求头中的内容,可以使用 getHeader 方法进行获取;

jsp 页面

在这里插入图片描述

web.xml

在这里插入图片描述

servlet 类

在这里插入图片描述

请求体

请求体就是发送请求是所携带的数据,也就是后台需要去获取的页面传递的参数;
使用 request 提供的 getParamter 方法或者是 getParamterValues 方法进行传递
参数的获取;两个方法的返回值都是 String 类型;即是不管页面上输入的是什么类型的数
据,最终获取到后都是字符串;

jsp 页面
在这里插入图片描述

web.xml

在这里插入图片描述

servlet 类

在这里插入图片描述

文件上传

文件上传指的是将本地的文件上传到服务器;使用 form 表单和请求对象来实现,和常规的请
求参数略有不同;
首先在 form 标签中需要添加一个额外的属性来支持表单实现文件上传的功能
<form action="" method="" enctype="multipart/form-data"></form>; 有
了 enctype="multipart/form-data" 属性,请求方式必须是 post 请求;
其次对于处理文件上传请求的 servlet 需添加一个注解 @MultipartConfig

jsp 页面
在这里插入图片描述
在这里插入图片描述

FileServlet 类

在这里插入图片描述

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

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

相关文章

龙腾iSharedisk无盘系统 v1.8 Build 20230207 Crack

龙腾 iShareDisk无盘系统是一款高品质的 无盘启动和VHD离线启动系统。其功能满足目前校园、网咖、企业、酒店、证券、服务业、KTV、包厢VOD的需求&#xff0c;其可以 自行选择部署有盘或者无盘&#xff0c;实现Windows全系列产品无盘/VHD 启动的一体化解决方案&#xff01; …

【Storm】【七】Storm三种打包方式对比分析

Storm三种打包方式对比分析 一、简介二、mvn package三、maven-assembly-plugin插件四、maven-shade-plugin插件五、结论六、打包注意事项一、简介 在将 Storm Topology 提交到服务器集群运行时&#xff0c;需要先将项目进行打包。本文主要对比分析各种打包方式&#xff0c;并…

MyBatis - 14 - 分页插件的配置及使用

文章目录1、分页插件配置&#xff08;1&#xff09;在pom.xml中添加依赖&#xff08;2&#xff09;在MyBatis的核心配置文件中配置插件2、分页插件的使用回顾Mysql分页功能MyBatis分页插件的使用测试显示第1页&#xff0c;每页显示4条数据&#xff0c;打印page对象测试获取分页…

A. Linova and Kingdom(dfs + 贪心)

A. Linova and Kingdom&#xff08;dfs 贪心&#xff09;一、问题二、思路三、代码一、问题 二、思路 这道题的大意就是&#xff0c;给我们一棵树&#xff0c;我们需要在树上选择kkk个点&#xff0c;然后让kkk个信使从我们选取的kkk个点向第一个点出发。 我们把我们选取的k个…

Verdaccio 搭建私有 npm 仓库

背景 公司内部封装业务相关的组件库&#xff0c;工具库&#xff0c;希望统一管理和维护&#xff0c;在多个项目中都能使用&#xff0c;同时希望不公开&#xff0c;只在局域网中使用。所以&#xff0c;需要搭建私有 npm 仓库 Verdaccio verdaccio 是一个能够创建私有 registr…

vue:vue2与vue3的区别

一、背景 vue2是指的2.X vue3是指的3.0以及更新的版本&#xff08;3.2版本在script标签里可以写setup&#xff0c;极大的简化了开发&#xff09; 本文对比两者区别。 二、官网 生命周期选项 | Vue.js API 参考 | Vue.js Vue.js - 渐进式 JavaScript 框架 | Vue.js Vue.…

Redis学习【11】之分布式系统

文章目录一 数据分区算法1.1 顺序分区1.1.1 轮询分区算法1.1.2 时间片轮转分区算法1.1.3 数据块分区算法1.1.4 业务主题分区算法1.2 哈希分区1.2.1 节点取模分区算法1.2.2 一致性哈希分区算法1.2.3 虚拟槽分区算法二 分布式系统环境搭建与运行2.1 系统搭建2.1.1 系统架构2.1.2 …

物理层的概述(可以说是对王道计算机网络的笔记)

目录前言物理层概述基本概念数据通信基础知识数据通信相关术语三种通信方式两种传输方式码元&#xff0c;速率、波特、带宽**练习题**奈氏准则和香农定理奈氏准则&#xff08;奈奎斯特定理&#xff09;香浓定理结尾前言 本章内容讲述了物理层的概念,也是我上个星期上课的内容&…

现代检测技术-期末复习

文章目录差动结构的优点偏差/零位/微差法的应用偏差法测量零位法测量微差法测量格罗布斯准则&#xff08;作业题&#xff09;最小二乘法自相关/互相关算法的应用&#xff08;教材和课件案例&#xff09;自相关性分析互相关分析&#xff1a;电子计数器测频法&#xff08;作业题&…

第53章 短信验证服务和登录的前端定义实现

1 向src\router\index.js添加定义 { path: /LoginSms, name: 手机号登录, component: () > import(../views/LoginSmsView.vue) }, { path: /Users/Register, name: 用户注册, component: () > import(../views/Users/RegisterView.vue), }, 2 向src\common\http.api.js添…

Javascript借用原型对象继承父类型方法

借用原型对象继承父类型方法 目的: 儿子继承父类属性和方法&#xff0c;父类之后新增的方法不会被儿子继承。 前言&#xff1a; 先理解一个问题&#xff1a; Son.prototype Father.prototype; 这一操作相当于把Son的原型对象指向Father。 意味着Son的prototype的地址与Fa…

Vue基础学习 v-指令(2) 本地应用(记事本)

v-bind 设置元素的属性&#xff08;比如&#xff1a;src&#xff0c;title&#xff0c;class&#xff09; v-bind:属性名值 <div id"app"><img v-bind:src"imgSrc" alt"" v-bind:title"imgTitle"></div><scrip…

数学建模(一):LP 问题

文章目录数学建模&#xff08;一&#xff09;&#xff1a;LP 问题一、 MATLAB求解二、 Python 求解数学建模&#xff08;一&#xff09;&#xff1a;LP 问题 在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济效益的问题。此类问…

关于分布式事务的理解

关于分布式事务的理解 分布式事务之前先简单介绍下介于本地事务和分布式事务之间的两个事务&#xff1a;全局事务&#xff08;Global Transactions&#xff09;和共享事务&#xff08;Share Transactions&#xff09;的原理与实现。 先给全局事务做个限定&#xff1a;一种适用…

JVM运行时数据区划分

Java内存空间 内存是非常重要的系统资源&#xff0c;是硬盘和cpu的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略&#xff0c;保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机…

使用secure crt连接ensp中虚拟设备

0 前言 ensp中虚拟设备如路由器、防火墙等本质上是 virtualbox中运行的虚机&#xff0c;因此可通过 telnet 连接 127.0.0.1 及对应端口方式连接到ensp中设备&#xff1b; 1 连接方法 1.1 查看设备所监听端口 设备图标上&#xff0c;右键 设置 点击 配置&#xff0c;可查看到…

UGUI 上使用 Particle System 支持 Sorting Layer 排序渲染

UGUI 上使用 Particle System 支持 Sorting Layer 排序渲染 Unity 中 Particle System 在 UGUI 上是可以根据 Sorting Layer 以及 Order in Layer 和 UI 组件(Image、Text等) 排序渲染的 Layer 值高的能够遮挡 Layer 值低的 组件 开发中会有这样的需求&#xff1a;要求 Part…

CAD异形图形的绘制

这个CAD图形的难点在于如何画角度98长165的斜线&#xff0c;剩下的图形就很好画了&#xff0c;那么用到的命令有圆、直线、导圆角、偏移等多个CAD命令的结合 目标对象 操作步骤 1.先使用直线命令画相交于A点的两条辅助线段&#xff0c;然后以A点为圆心画半径47.5和直径65的圆…

Java -数据结构,【优先级队列 / 堆】

一、二叉树的顺序存储 在前面我们已经讲了二叉树的链式存储&#xff0c;就是一棵树的左孩子和右孩子 而现在讲的是&#xff1a;顺序存储一棵二叉树。 1.1、存储方式 使用数组保存二叉树结构&#xff0c;方式即将二叉树用层序遍历方式放入数组中。 一般只适合表示完全二叉树&a…

真实需求和梦想实现满足

多少的时光和岁月中都不曾认真系统的深度思考自己的真实需求和欲望之间是否一致&#xff0c;随着时间的流逝才发现自己追求的是一场空&#xff0c;自己的真实需求并不是苦苦追求的东西&#xff0c;这也是当梦想照进现实&#xff01;欲望是无善无恶的&#xff0c;不必为了满足自…