Servlet详解

一.Servlet生命周期

  • 初始化
  • 提供服务
  • 销毁

1.测试生命周期

package com.demo.servlet;import javax.servlet.*;
import java.io.IOException;public class LifeServlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("Servlet init");}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse)throws ServletException, IOException {System.out.println("Servlet service");}@Overridepublic void destroy() {System.out.println("Servlet destroy");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic String getServletInfo() {return null;}
}

2.初始化:init()

(1)默认情况

  • 默认情况下,第一次被请求的时候初始化,初始化在整个生命中只有一次

在这里插入图片描述

(2)设置初始化时间

  • 某种原因,导致第一次请求时初始化很慢,这时就可以修改Servlet的初始化时间

  • 使用其值为大于等于0的整数时,该Servlet就会在服务器启动时初始化,初始化在整个生命中只有一次

在这里插入图片描述

3.提供服务:service()

  • 生命周期中会提供n次

在这里插入图片描述

4.销毁:destroy()

  • 服务器关闭时自动销毁,生命周期中只有一次

在这里插入图片描述

二.Servlet的映射路径

1.web.xml配置

(1)标签

  • 的子标签,用于给Servlet配置访问路径

(2)注意

  1. 路径最前面加上/,代表根目录
  2. 路径中可以出现文件夹的,如/user/test/urlServlet

(3)示例

  • http://localhost:8888/day02_war_exploded/user/test/lifeServlet
  • http://localhost:8888/day02_war_exploded/user/life.html

2.模块前端文件的访问路径

  1. 访问文件时,只需要关注自己创建的目录,自动生成的不管
  2. 访问Servlet时,照着url-pattern设置的值来找

3.Servlet3.0注解配置

(1)使用前提

  • Servlet3.0和JDK1.5及以后的版本才能使用

(2)使用

在这里插入图片描述

(3)注意

  • 同一个Servlet,要么使用web.xml文件配置,要么使用注解配置,但是不能使用两种方式同时配置

  • 注解中的参数有name、serviceName;若是只写name参数,可以省略key值,只写value;除此之外要写key-value的形式

三.Servlet请求对象

1.HttpServletRequest接口

  • 请求对象
  • 父接口:ServletRequest
  • 包含请求行,请求头和请求体

在这里插入图片描述

2.请求行

(1)包含

  • 请求方式
  • 请求的资源
  • 协议及其版本

(2)获取信息

    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println(req.getMethod());System.out.println(req.getRequestURL());System.out.println(req.getRequestURI());System.out.println(req.getServerName());System.out.println(req.getServerPort());}

3.请求头

(1)获取信息

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String value1 = req.getHeader("Host");System.out.println(value1);Enumeration<String> names = req.getHeaderNames();while (names.hasMoreElements()) {String name = names.nextElement();String value = req.getHeader(name);System.out.println(name+":"+value);}}

4.请求体

  • 就是请求的数据,也就是Servlet中获取的参数

(1)Servlet中获取请求的数据的方法

  • request.getParameter(“name属性的值”);返回值类型为String
  • request.getParameterValues(“name属性的值”);返回值类型为String[]

(2)示例

    @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");String gender = req.getParameter("gender");String hobbies[] = req.getParameterValues("hobbies");System.out.println(username+","+password+","+gender+","+ Arrays.toString(hobbies));}

5.Servlet获取参数乱码问题

(1)问题

  • 中文乱码,Servlet的默认编码集是ISO-8859-1(纯英文)
  • 页面输入中文进行提交,会乱码

(2)解决方案

在这里插入图片描述

四.文件上传

  • 就是在指定的位置复制出一个跟源文件一模一样的文件

1.页面编写

  • 表单的method属性的值必须是pos
  • 表单上加上enctype,值为multipart/form-data

在这里插入图片描述

2.Servlet

  • 在Servlet上加上@MultipartConfig

在这里插入图片描述

3.Post方法编写

  • 不同浏览器上传文件的路径不一样
  • 绝对路径(不带盘符)
  • 文件名+文件类型后缀
    @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//设置请求体编码集req.setCharacterEncoding("utf-8");String username = req.getParameter("username");String password = req.getParameter("password");String gender = req.getParameter("gender");String hobbies[] = req.getParameterValues("hobbies");System.out.println(username+","+password+","+gender+","+ Arrays.toString(hobbies));//文件相关处理//获取用户提交的文件对象Part part = req.getPart("photo");//指定上传路径String path = "d://upload";//判断该路径是否存在File file = new File(path);if (!file.exists()) {//不存在则创建file.mkdirs();}//获取上传的文件的名字String fileName = part.getSubmittedFileName();//在指定位置创建指定文件part.write(path+"/"+fileName);}

五.Servlet响应对象

1.HttpServletResponse接口

  • 服务器响应对象
  • 父接口:ServletResponse
  • 包含响应行,响应头和响应体。

在这里插入图片描述

2.响应行

  • 包含协议及其版本,状态码

(1)状态码

状态码说明
1**请求已到达服务器,但未完成,需要再次请求
2**请求已到达服务器,并且已完成
3**服务器内部资源重定向
4**资源找不到
5**服务器内部异常,代码异常
200成功
404找不到,原因:路径有问题
500代码有问题,90%以上都是空指针

(2)设置状态码

   @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setStatus(404);}

3.响应头

响应头keyvalue
Location这个头通常配合302状态码使用,它用于告诉浏览器你去找谁。
Server告诉浏览器,服务器的类型
Content-Encoding服务器通过这个头,告诉浏览器,回送的数据采用的压缩格式。
Content-Length0
Content-Languagezh-cn
Content-Type这个头用于告诉浏览器,回送数据的类型
Last-Modified这个头用于告诉浏览器,数据的最后修改时间
Transfer-Encoding用于通知浏览器,数据是以分块形式回送的
Cache-Controlno-cache 通知浏览器不要缓存
Refresh1;url=http://www.it315.org 隔多少秒以后,让当前页面去访问哪个地址(例如网页登陆成功后,跳回原来的界面,就是用的这个头)
Content-Dispositionattachment;filename=aaa.zip 和下载相关,通知浏览器以附件的形式下载服务器发送过去的数据
Set-CookieSS=Q0=5Lb_nQ; path=/search 和cookie相关的头
ETagW/“83794-1208174400000” 和cookie相关的头
Expires-1 通知浏览器是否缓存当前资源:如果这个头的值是一个以毫秒为单位值,则通知浏览器缓存资源到指定的时间点;如果值是0或-1,则通知浏览器禁止缓存
Pragmano-cache 通知浏览器是否缓存资源
Connectionclose/Keep-Alive 是否继续保持连接
DateTue, 11 Jul 2000 18:23:51 GMT 当前响应的时间

(1)Location的使用

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setStatus(302);resp.setHeader("location","http://www.baidu.com");}

(2)Refresh的使用

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setHeader("refresh","2;url=http://www.qidian.com");}

4.响应体

  • 响应的数据,会将HTML,text等信息返回给客户端。

(1)响应数据传递方式

  • 响应数据需要通过流来传递,response自带两个输出流
  • 这两个流不能同时使用
ServletOutputStream out = response.getOutputStream();//字节流PrintWriter out = response.getWriter();//字符流

(2)示例

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.print("<h1>今天天气不错</h1>");out.close();}

六.文件下载

1.创建下载文件的页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="responseServlet">下载</a>
</body>
</html>

2.添加测试图片操作

  • 去除原来的 exploded

  • 重新添加exploded

在这里插入图片描述

3.Servlet编写代码

  • 下载的源文件直接放在src目录下
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//告诉浏览器,以附件的形式打开数据resp.setHeader("Content-Disposition","attachment;filename=erha.png");//输入流读取文件//this.getClass().getClassLoader().getResourceAsStream("gouza.png")用于快速的获取src当中问文件对象流InputStream in = this.getClass().getClassLoader().getResourceAsStream("gouza.png");//输出流写文件ServletOutputStream out = resp.getOutputStream();//边读边写byte[] b = new byte[1024];int len = 0;while ((len = in.read(b)) != -1) {out.write(b,0,len);}out.close();in.close();}

七.请求转发与重定向

1.Servlet进行跳转的方式

跳转方式方法
请求转发request.getRequestDispatcher(“跳转的文件路径”).forward(request,response);
重定向response.sendRedirect(“跳转的文件路径”);

2.请求转发

在这里插入图片描述

(1)请求转发概述

  • 服务器行为,客户端不知道整个操作在服务器中到底处理了多少次,所以地址栏不会发生改变
  • 整个过程中只发送了一个请求,所以request对整个转发过程中所有的Servlet是共享的
  • 请求转发的是那种数据提交方式,那么第二个servlet也是该方式,出form表单和超链接

(2)创建FirstServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/firstServlet")
public class FirstServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入FirstServlet");req.setAttribute("color","red");System.out.println(req.getAttribute("color"));req.getRequestDispatcher("secondServlet").forward(req,resp);}
}

(3)创建SecondServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/secondServlet")
public class SecondServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入SecondServlet");System.out.println(req.getAttribute("color"));}
}

(4)index.html,点击测试跳转

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="firstServlet">测试请求转发</a>
</body>
</html>

(5)结果

在这里插入图片描述

3.重定向

在这里插入图片描述

(1)重定向概述

  • 客户端行为,客户端向FirstServlet发送请求,FirstServlet给了客户端响应告诉客户端去找SecondServlet,客户端向SecondServlet发送请求
  • 地址栏会变,request不共享

(2)创建FirstServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/firstServlet")
public class FirstServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入FirstServlet");req.setAttribute("color","red");System.out.println(req.getAttribute("color"));resp.sendRedirect("secondServlet");}
}

(3)创建SecondServlet

package com.demo.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/secondServlet")
public class SecondServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("进入SecondServlet");System.out.println(req.getAttribute("color"));}
}

(4)测试

在这里插入图片描述

4.请求转发与重定向的区别

请求转发重定向
发出位置服务器行为客户端行为
地址栏内容地址栏不会发生改变地址栏会发生改变
请求次数只有一次请求至少两次请求
request共享equest是共享的request不共享的
转发效率较低
发送范围只能在当前模块中进行可以跳转到其他模块的作用域容器对象:作用域里面的作为容器的对象

--------------------------------------------------------: |
| 发出位置 | 服务器行为 | 客户端行为 |
| 地址栏内容 | 地址栏不会发生改变 | 地址栏会发生改变 |
| 请求次数 | 只有一次请求 | 至少两次请求 |
| request共享 | equest是共享的 | request不共享的 |
| 转发效率 | 高 | 较低 |
| 发送范围 | 只能在当前模块中进行 | 可以跳转到其他模块的作用域容器对象:作用域里面的作为容器的对象 |

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain+LLM实战---使用知识图谱和大模型来实现多跳问答

原文&#xff1a;Knowledge Graphs & LLMs: Multi-Hop Question Answering 可以使用检索增强方法来克服大型语言模型(Large Language Models, llm)的局限性&#xff0c;比如幻觉和有限的知识。检索增强方法背后的思想是在提问时引用外部数据&#xff0c;并将其提供给LLM&a…

Failed to launch task: 文件”Setup”不存在 Mac安装Adobe软件报错解决方案

在安装 Adobe 软件时&#xff0c;软件提示 Failed to launch task: 文件”Setup”不存在 &#xff0c;这个时候怎么处理呢&#xff1f; 解决方法如下&#xff1a; 1、安装 AnitCC 或 或 Creative Cloud 环境&#xff0c;保证软件所需要的环境 2、如果安装后也不起作用&#x…

Scala语言用Selenium库写一个爬虫模版

首先&#xff0c;我将使用Scala编写一个使用Selenium库下载yuanfudao内容的下载器程序。 然后我们需要在项目的build.sbt文件中添加selenium的依赖项。以下是添加Selenium依赖项的代码&#xff1a; libraryDependencies "org.openqa.selenium" % "selenium-ja…

基于人工大猩猩部队算法的无人机航迹规划-附代码

基于人工大猩猩部队算法的无人机航迹规划 文章目录 基于人工大猩猩部队算法的无人机航迹规划1.人工大猩猩部队搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用人工大猩猩部队算法…

SpringSecurity全家桶 (一) —— 简介

1. 概述 Spring Security 是一个框架&#xff0c;提供针对常见攻击的身份验证、授权和保护。 它为保护命令式和响应式应用程序提供了一流的支持&#xff0c;是保护基于 Spring 的应用程序的事实标准。 2. 了解 shiro&#xff1a; 在之前SSM框架盛行的时代&#xff0c;项目的…

轻信息服务展示预约小程序的内容是什么

预约几乎是适应所有经营商家的&#xff0c;可以提升客户服务/产品获取度、锁客及便捷性需求&#xff0c;同时也利于提升商家整体经营效率&#xff0c;无论获客还是留存线索都有很高帮助。 尤其对线下服务实体店来说&#xff0c;需要预约形式将客户引流到店&#xff0c;传统商家…

[MICROSAR Adaptive] --- Hello Adaptive World

Automotive E/E Architecture and AUTOSAR Adaptive Platform Vector Solution: MICROSAR Adaptive First project: Hello Adaptive World Summary 1 引言 1.1 AP诞生的历史背景 新一代电子电器架构通常将车内的节点分为三类。计算平台,预控制器和传感器执行器相关的节点,…

Leetcode 73 矩阵置0

class Solution {//1.用矩阵的第一行和第一列来标记该行或该列是否应该为0,但是这样的话忽视了第一行或第一列为0的情况//2.用标记row0和column0来标记第一行或第一列是否该为0public void setZeroes(int[][] matrix) {int n matrix.length;int m matrix[0].length;boolean r…

构建 hive 时间维表

众所周知 hive 的时间处理异常繁琐且在一些涉及日期的统计场景中会写较长的 sql&#xff0c;例如&#xff1a;周累计、周环比等&#xff1b;本文将使用维表的形式降低时间处理的复杂度&#xff0c;提前计算好标准时间字符串未来可能需要转换的形式。 一、表设计 结合业务场景常…

【Ubuntu】虚拟机安装系统与初始化配置

一、安装ubuntu系统 1、首先在虚拟机上安装一个虚拟机系统。 简单操作忽略&#xff0c;只贴出与安装linux不同的地方。 内存&#xff0c;处理器&#xff0c;磁盘等什么自己看着需要自己增加们这边不做过多说明。一直下一步&#xff0c;然后就安装好了。2、选择镜像位置然后启…

【SpringSecurity】简介

SpringSecurity简介 Spring Security 的前身是Acegi Security&#xff0c;在被收纳为Spring 子项目后正式更名为Spring Security。Spring Security目前已经到了6.x&#xff0c;并且加入了原生OAuth2.0框架&#xff0c;支持更加现代化的密码加密方式。可以预见&#xff0c;在Ja…

Go语言文本处理:正则表达式与字符串操作

大家好&#xff0c;我是[lincyang]。 今天&#xff0c;我们将一起探讨Go语言在文本处理方面的强大功能&#xff0c;特别是正则表达式和字符串操作。 Go语言以其简洁和高效而闻名&#xff0c;这些特性在文本处理上也得到了很好的体现。 接下来&#xff0c;我将通过丰富的案例…

torch.cuda.OutOfMemoryError: CUDA out of memory.

训练清华ChatGLM-6B时报错, 原因是显存不够 torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 96.00 MiB (GPU 0; 23.70 GiB total capacity; 4.37 GiB already allocated; 64.81 MiB free; 4.37 GiB reserved in total by PyTorch) If reserved memory is…

XSAN数据恢复-存储空间架构迁移时误格式化存储系统的XSAN数据恢复案例

XSAN数据恢复环境&#xff1a; 昆腾存储&#xff0c;MAC OS操作系统&#xff0c;存放视频类数据&#xff08;MXF、MOV等格式文件&#xff09;。 XSAN故障&检测&#xff1a; 将存储空间从XSAN架构迁移到STORNEXT架构后&#xff0c;存储空间中数据全部丢失。 故障存储中一共…

嵌入式中如何将BootLoader与APP合并成一个固件

1、前言 嵌入式固件一般分为BootLoader和App&#xff0c;BootLoader用于启动校验、App升级、App版本回滚等功能&#xff0c;BootLoader在cpu上电第一阶段中运行&#xff0c;之后跳转至App地址执行应用程序。 因此&#xff0c;在发布固件的时候&#xff0c;会存在BootLoader固件…

该酷的酷该飒的飒~质感满满的羊羔绒皮外套

皮毛一体材质柔软舒适 保暖性能极佳 冬天穿也不惧严寒的哦 宽松版型&#xff0c;对身材的包容性很强 外套的细节处理也非常出色&#xff0c;车缝线整齐 纽扣和拉链质量也是很不错的哟

【入门Flink】- 05Flink运行时架构以及一些核心概念

系统架构 Flink运行时架构Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager 是一个 Flink 集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。每个应用都应该被唯一的 JobManager 所控制执行。 JobManger 又包含…

全球首例无液氦脑磁图辅助下的胶质瘤切除手术顺利完成

近日&#xff0c;在国家重点研发计划“新型无液氦脑磁图系统研发”项目支持下&#xff0c;首都医科大学附属北京天坛医院季楠教授团队完成全球首例无液氦脑磁图运动功能区定位辅助下的胶质瘤切除手术。 手术对一例肿瘤累及运动功能区的年轻女性在术前分别利用无液氦脑磁图仪和功…

Java继承:抽取相同共性,实现代码复用

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、继承的概念二、继承的语法三、父类成员访问1、子类中访问父类成员变量Ⅰ、子类和父类不存在同名成员变量Ⅱ、子类和父类成员…

mysql:B+树/事务

B树 : 为了数据库量身定做的数据结构 我们当前这里的讨论都是围绕 mysql 的 innodb 这个存储引擎来讨论的 其他存储引擎可能会用到hash 作为索引,此时就只能应对这种精准匹配的情况了 要了解 B树 我们先了解 B树, B树 是 B树 的改进 B树 有时候会写作 B-树 (这里的" -…