Servlet基础知识

Servlet是Java提供的一门动态的web资源开发技术

Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servelt

Servlet快速入门
  1. 创建web项目,导入Servlet依赖坐标
<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

      2.创建一个类实现Servlet接口,并重写接口中的所有方法,并在service方法中输出一句话 

      3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径 

@WebServlet("/demo")
public class ServletImpl implements Servlet {

      4.访问:启动Tomcat,浏览器URL范围访问Servlet 

Servlet执行流程

Http://localhost:8080访问的是web服务器

由web服务器创建Servlet对象,Servlet方法由web服务器调用

Servlet生命周期

Servlet运行在web服务器中,其生命周期由web服务器管理

  1. 加载和实例化:默认情况下,当Servlet第一次被访问的时候,web服务器会创建Servlet对象
@WebServlet(loadOnStartup=1)
//负整数:第一次被访问的时候创建Servlet实例
//0或者正整数:服务器启动的时候就会创建Servlet实例

      2.初始化:在Servlet实例化之后,web服务器将调用Servlet的init()方法初始化这个对象,完成一些加载配置文件,创建连接等初始化工作,该方法只调用一次 

      3.请求处理:每次请求Servlet时,web服务器都会调用Servlet的service方法对请求进行处理

      4.服务终止:当需要释放内存或者关闭web服务器时,web服务器会调用Servlet对象的destory()方法完成资源的释放。在destory()方法调用之后,web服务器会释放Servlet这个实例,该实例会被Java的垃圾回收器进行回收

Servlet体系结构

get和post请求方式的请求消息不一样,所以要分开处理,根据不同的请求方式,调用不同的逻辑

Servlet urlPattern配置

Servlet想要被访问,必须配置其访问路径

  1. 一个Servlet可以配置多个访问路径
@WebServlet(urlPattern={"/demo1","/demo2"})

 URL匹配规则

  1. 精确匹配
//配置路径
@WebServlet(urlPattern={"/user/select"})

//访问路径
localhost:8080/web-demo/user/select

      2.目录匹配

//配置路径
@WebServlet(urlPattern="/user/*")

//访问路径
localhost:8080/web-demo/user/aaa
localhost:8080/web-demo/user/bbb

         3.扩展名匹配

//配置路径
@WebServlet(urlPattern="*.is")

//访问路径
localhost:8080/web-demo/aaa.is
localhost:8080/web-demo/bbb.is

         4.任意匹配

//配置路径
@WebServlet(urlPattern="/")
@WebServlet(urlPattern="/*")

//访问路径
localhost:8080/web-demo/hehe
localhost:8080/web-demo/haha

Request和Response

Request:获取请求数据

Response:设置响应数据

Request

Request的继承体系

Tomcat需要解析请求数据,封装为Request对象并且创建request对象传递到service方法中

Request获取请求数据

请求数据分为三部分

  1. 请求体
  • String getMethod():获取请求方式
  • String getContextPath():动态获取虚拟目录
  • StringBuffer getRequestURL():获取URL
  • String getRequestURI():获取URI
  • String getQueryString():获取请求参数

      2 .请求头

  • String getHeader():根据请求头名称,获取值

      3.请求体

  • ServletInputStream getInputStream:获取字节输入流
  • BufferedReader getReader():获取字符输入流
Request通用方式获取请求参数

GET请求方式和POST请求方式主要是在于获取请求参数的不同,提供一种统一获取请求参数的方法,从而减少代码的重用率

  • Map<String,String[]> getParameterMap():获取所有参数Map集合
  • String[] getParameterValues(String name):根据名称获取参数值(数组)
  • String getParameter(String name):根据名称获取参数值(单个值)
POST请求方式解决中文乱码问题

POST请求方式获取请求参数是通过字符输入流进行获取,字符输入流的默认字符集是ISO字符集

request.setCharacterEncoding("UTF-8")
GET请求方式解决中文乱码问题

GET请求方式获取请求参数是通过getQueryString()方法进行获取

GET请求先通过浏览器进行编码使用的是UTF-8字符集,然后通过Tomcat服务器进行解码,使用的是ISO字符集,编码和解码的字符集不同,所以会导致乱码

要正确解码应该把编码之后的数据转换成二进制数据,再把二进制数据转为字符串

POST方式也可以用这个方式,但是用设置字符集的方式更方便

String encode = URLEncoder.encode("张三","UTF-8")
String decode = URLDecoder.decode(encode,"IOS-8859-1")
//转换成字节数据     编码
byte[] bytes = decode.getBytes("ISO-8859-1")
//转换成字符串    解码
String str = new String(bytes,"UTF-8")



//转换成一行
String username =  request.getparamter("username")
username = new String(username.getBytes(StandardCharsets.IOS-88859-1),StandardCharsets.UTF-8)

Request请求转发

请求转发:再服务器内部进行资源跳转的方式

在资源a中写请求转发的代码

request.getRequestDispatcher("资源b的路径").forward(request,response)

请求转发资源间共享数据,使用Request对象

  • void setAttribute(String name,Object o):存储数据到request域中
  • Object getAttribute(String key):根据key,获取值
  • void removeAttribute(String key):根据key,删除键值对

请求转发的特点:

  • 浏览器地址不会发生变化
  • 只能转发到当前服务器的内部资源
  • 一次请求,可以在转发的资源间使用request共享数据
Response
Response的继承结构

Tomcat创建response对象并传入service方法中

Response设置响应数据

响应数据分为三部分

  1. 响应行
void setStatus(int sc)//设置响应码

      2.响应头 

void setHeader(String name,String value)//设置响应数据键值对

      3.响应体 

PrintWriter getWriter()//获取字符输出流
ServletOutputStream get OutputStream()//获取字节输出流
Response重定向

重定向:是一种资源跳转的方式

浏览器先请求资源a,资源a处理不了,设置一个状态码302,然后再设置响应头给浏览器,浏览器对着响应头再请求对应的资源b

response.setStatus(302)
response.setHeader("location","资源b的路径")



//简化方式完成重定向
response.sendRedirect("资源b的路径")

重定向的特点

  • 浏览器的地址栏会发生改变
  • 可以重定向到任意资源
  • 两次请求,不能在多个资源下使用request共享数据

路径问题

判断路径给谁使用,如果路径要给浏览器使用需要加虚拟目录,如果路径要给服务端使用就不需要加虚拟目录

动态获取虚拟目录

String contextPath = resp.getContextPath()
Response响应字符数据
  1. 获取字符输出流
PrintWriter  writer = response.getWriter()

2.设置响应头信息 

response.serHeader("content-type","text/html")

3.写到浏览器数据 

//解决中文乱码问题
response.setContentType("text.html;charset=utf-8");
writer.write("你好");

字符输出流不需要关闭,随着响应结束,response对象被销毁,流也就关闭了

Response响应字节数据
  1. 读取文件
FileInputStream fis = new FileInputStream("")

 2. 获取字节输出流

ServletOutputStream os = response.getOutputStream

3. 完成文件的拷贝

//使用apache提供的工具类IOUtils的工具类
IOUtils.cpoy(fis,os)

 4.关闭流

fis.close()

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

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

相关文章

百度Apollo新版本Beta技术沙龙参会体验

在自动驾驶领域&#xff0c;百度的Apollo一直是业界开源的标杆。其持续升级和创新的开源项目为整个自动驾驶行业树立了典范&#xff0c;不仅推动了技术的发展&#xff0c;也为广大的社区开发者们提供了学习和参考的范本。最近百度发布了Apollo新的Beta版本&#xff0c; 新版本B…

【PID学习笔记 6 】控制系统的性能指标之二

写在前面 上文介绍了控制系统的稳态与动态、过渡过程、阶跃响应以及阶跃信号作用下过渡过程的四种形式。本文紧接上文&#xff0c;首先总结过渡过程的分类&#xff0c;然后介绍控制系统的性能评价&#xff0c;最后重点介绍控制系统性能指标中的单项指标。 一、过渡过程的分类…

四.多表查询

多表查询 1.一个案例引发的多表连接1.1案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3案例分析与问题解决 2.多表查询分类讲解分类1&#xff1a;等值连接vs非等值连接分类2&#xff1a;自连接vs非自连接分类3&#xff1a;内连接vs外连接 3.SQL99语法实现多表…

读书笔记-《数据结构与算法》-摘要2[冒泡排序]

冒泡排序 核心&#xff1a;冒泡&#xff0c;持续比较相邻元素&#xff0c;大的挪到后面&#xff0c;因此大的会逐步往后挪&#xff0c;故称之为冒泡。 public class BubbleSort {public static void main(String[] args) {int unsortedArray[] new int[]{6, 5, 3, 1, 8, 7, 2…

旋转设备状态监测与预测性维护:提高设备可靠性的关键

在工业领域的各个行业中&#xff0c;旋转设备都扮演着重要的角色。为了确保设备的可靠运行和预防潜在的故障&#xff0c;旋转设备状态监测及预测性维护变得至关重要。本文将介绍一些常见的旋转设备状态监测方法&#xff0c;并探讨如何利用这些方法来实施预测性维护&#xff0c;…

Java的第二十一章:网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可以编写出高质量的网络通信程序。 …

周周爱学习之快速排序

快速排序&#xff0c;顾名思义&#xff0c;快速排序是一种速度非常快的一种排序算法 平均时间复杂度为O(),最坏时间复杂度为O()数据量较大时&#xff0c;优势非常明显属于不稳定排序 1.算法描述 每一轮排序选择一个基准点&#xff08;pivot&#xff09;进行分区 让小于基准点…

supervisord + nginx + Daphne + django4.0 最新asgi服务器部署实验

由于需要用到channel&#xff0c;最近在研究通过asgi部署django。 先吐槽一下官方文档&#xff0c;这个地方讲的非常简单。然后中文互联网环境能找到的都是3.0试用的说明&#xff0c;这玩意是不是真的没人用啊&#xff1f;还是说Django已经脱离时代了。。。 简单研究了一下&am…

洗地机好用吗?口碑好的洗地机有哪些?

自从洗地机开始引入市场以来&#xff0c;它一直受到人们的关注。它在解放家庭清洁劳动力和提供快速方便的清洁方面表现出色&#xff0c;超越了多年来传统的拖把清洁方式。越来越多的人选择使用洗地机来完成家庭清洁任务。如果你也对洗地机产生了浓厚的兴趣&#xff0c;并想购买…

【MATLAB源码-第93期】基于matlab的白鲸优化算法(BWO)和鲸鱼优化算法(WOA)机器人栅格路径规划对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 白鲸优化算法&#xff08;BWO&#xff09; 白鲸优化算法是受到白鲸捕食和迁徙行为启发的一种算法。其主要特点和步骤包括&#xff1a; 1. 搜索食物&#xff08;全局搜索&#xff09;&#xff1a;算法模仿白鲸寻找食物的行为。…

【模型报错记录】‘PromptForGeneration‘ object has no attribute ‘can_generate‘

通过这个连接中的方法解决&#xff1a; “PromptForGeneration”对象没有属性“can_generate” 期刊 #277 thunlp/OpenPrompt GitHub的 问题描述&#xff1a;在使用model.generate() 的时候报错&#xff1a;PromptForGeneration object has no attribute can_generate 解决方法…

Java中子类都继承父类的什么?

1.构造方法 构造方法不可以被继承的&#xff0c;为什么呢&#xff1f;应为名称的定义&#xff0c;构造方法是一类名称与类名一致&#xff0c;无返回值和类型修饰的一种。所以如果子类继承父类的构造方法的话&#xff0c;那么就违背了构造方法的规定。 2.成员属性 成员属性是…

C# Demo--汉字转拼音

1.Nuget安装NPOI及Pinyin4net 2.Demo 代码部分 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using System.IO;…

【Linux】基础IO--重定向理解Linux下一切皆文件缓冲区

文章目录 一、重定向1.什么是重定向2.dup2 系统调用3.理解输入重定向、输出重定向和追加重定向4.简易shell完整实现 二、理解linux下一切皆文件三、缓冲区1.为什么要有缓冲区2.缓冲区的刷新策略3.缓冲区的位置4.实现一个简易的C语言缓冲区5.内核缓冲区 一、重定向 1.什么是重定…

【5】PyQt按钮

QPushButton 常见的按钮实现类包括:QPushButton、QRadioButton和QCheckBox QPushButton是最普通的按钮控件&#xff0c;可以响应一些用户的事件 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton import sysdef func():print("按下按钮啦&#xff0c;火…

YOLOv8优化策略:简单高效的模块-现代反向残差移动模块 (iRMB) | | ICCV2023 EMO

🚀🚀🚀本文改进:设计了一种面向移动端应用的简单而高效的现代反向残差移动模块 (Inverted Residual Mobile Block, iRMB),它吸收了类似 CNN 的效率来模拟短距离依赖和类似 Transformer 的动态建模能力来学习长距离交互,引入YOLOV8 🚀🚀🚀YOLOv8改进专栏:http:…

Python神器解析时间序列数据:数据分析者必读

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 时间序列数据是在许多领域中都至关重要的数据类型&#xff0c;它涵盖了一系列按时间顺序排列的数据点。Python作为一种强大的数据分析工具&#xff0c;提供了许多库和工具&#xff0c;能够有效地处理、分析和可视…

2D与3D图形的基本变换

1. 2d transformations 1.1缩放(Scaling) 其实这个转换非常简单&#xff0c;如图所示就是把x与y进行s倍的缩放&#xff0c;而我们图中的这个矩阵正好满足这一算法。 1.2镜像(Reflection) 这个镜像变换可以和上面的做类比&#xff0c;简单看一下就行。 1.3错切(Shearing) 当然…

【力扣】54. 螺旋矩阵

题解&#xff1a; 这里当然就不能只是通过双循环来解题了&#xff0c;因为会烦死。这道题的关键点在于左右边界的确定&#xff0c;参考官方解题法在这里写出我的解题思路。 首先看图&#xff0c;螺旋且顺时针&#xff0c;所以我们可以先遍历从左至右的&#xff0c;上边界加一…

科技论文中的Assumption、Remark、Property、Lemma、Theorem、Proof含义

一、背景 学控制、数学、自动化专业的学生在阅读论文时&#xff0c;经常会看到Assumption、Remark、Property、Lemma、Theorem、Proof等单词&#xff0c;对于初学者可能不太清楚他们之间的区别&#xff0c;因此这里做一下详细的说明。 以机器人领域的论文为例。 论文题目&…