Servlet详细教程

news/2024/10/31 1:32:29/

文章目录

  • 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.ppmy.cn/news/29832.html

相关文章

systemV共享内存

systemV共享内存 共享内存区是最快的IPC形式。共享内存的大小一般是4KB的整数倍&#xff0c;因为系统分配共享内存是以4KB为单位的&#xff08;Page&#xff09;&#xff01;4KB也是划分内存块的基本单位。 之前学的管道&#xff0c;是通过文件系统来实现让不同的进程看到同一…

详解JAVA字节码

目录 1.概述 2.字节码文件构成 2.1.魔数 2.2.版本号 2.3.常量池 2.4.访问标志 2.5.索引 2.6.字段表 2.7.方法表 3.字节码指令 3.1.概述 3.2.指令分类 3.2.1.加载存储指令 3.2.2.运算指令 3.2.3.其他指令 3.3.完整指令工作流程 4.字节码保护 1.概述 以往的编程…

Ubuntu中安装StaMPS

Ubuntu中安装StaMPS0 StaMPS简介1 首先安装好MATLAB&#xff0c;安装一些依赖工具包2 安装StaMPS2.1 下载StaMPS安装包2.2 安装2.3 配置环境2.4 matlab中的路径设置0 StaMPS简介 官网&#xff1a;https://homepages.see.leeds.ac.uk/~earahoo/stamps/ A software package to e…

Vue项目中引入高德地图步骤详解

高德地图API官网&#xff1a;高德开放平台 | 高德地图API。 目录 一、案例效果 二、开发准备 1. 注册高德开放平台账号 2. 创建应用添加 key 值 三、项目中使用地图组件 1. npm 获取高德地图 API 2.在项目中新建 MapContainer.vue 文件&#xff0c;用作地图组件。 3.在…

【第十四届蓝桥杯】第三期模拟赛B组C++题解(待修正+持续更新-ing)

文章目录写在前面一、找最小数题目描述解题报告1、大体思路2、代码详解二、求列名题目描述解题报告1、大体思路2、代码详解三、求日期数题目描述解题报告1、大体思路2、代码详解四、取数题目描述解题报告1、大体思路2、代码详解五、最大连通分块题目描述解题报告1、大体思路2、…

负载均衡算法

静态负载均衡 轮询 将请求按顺序轮流地分配到每个节点上&#xff0c;不关心每个节点实际的连接数和当前的系统负载。 优点&#xff1a;简单高效&#xff0c;易于水平扩展&#xff0c;每个节点满足字面意义上的均衡&#xff1b; 缺点&#xff1a;没有考虑机器的性能问题&…

Java编程问题top100---基础语法系列(三)

Java编程问题top100---基础语法系列&#xff08;三&#xff09;十一、在java中如何对比&#xff08;compare&#xff09;string补充说明十二、Map<Key,Value>基于Value值排序方法1&#xff1a;使用TreeMap方法2&#xff1a;十三、HashMap和Hashtable的区别十四、如何便捷…

maven使用心得

maven 配置文件默认在 ~/.m2/settings.xml maven命令行 mvn clean install -Dmaven.test.skiptrue -s ~/.m2/settings.xml 往本地仓库加jar包 命令形如&#xff1a; mvn install:install-file -DgroupIdcom.lee.net -DartifactIdMyToolIdl -Dversion1.0.0-SNAPSHOT -Dpac…