千峰 Servlet

温老师
https://www.bilibili.com/video/BV1Ga4y1Y7Ah

课程目标:

  1. CS/BS 架构
  2. Tomcat
  3. Servlet
  4. Servlet应用
  5. Cookie/Session
  6. Filter 管理器

958794123

一、引言

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-grwMaBSy-1639054040115)(E:\app\Typora\img\image-20211114141842107.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDk833UC-1639054040117)(E:\app\Typora\img\image-20211114141953536.png)]

二 、服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y5bxgsJv-1639054040118)(E:\app\Typora\img\image-20211114142119618.png)]

2.2 常见服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvFqY6KG-1639054040120)(E:\app\Typora\img\image-20211114142423176.png)]

2.3 Tomcat 服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LylUFyup-1639054040123)(E:\app\Typora\img\image-20211114145414178.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCq8Nnnt-1639054040125)(E:\app\Typora\img\image-20211114145453543.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqv6JggL-1639054040127)(E:\app\Typora\img\image-20211114145938690.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vqjBoPEX-1639054040130)(E:\app\Typora\img\image-20211114150152964.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9dITkAN-1639054040131)(E:\app\Typora\img\image-20211114150251902.png)]

2.6 项目部署及访问静态资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXoIt4Kj-1639054040133)(E:\app\Typora\img\image-20211114150335983.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Qnwq9QA-1639054040135)(E:\app\Typora\img\image-20211114151121164.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vHTfIjM4-1639054040138)(E:\app\Typora\img\image-20211114151151594.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WZ3s0eg-1639054040140)(E:\app\Typora\img\image-20211114151218179.png)]

2.7 常见错误

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OxTnGbj-1639054040141)(E:\app\Typora\img\image-20211114151243909.png)]

三、 Servlet 【重点】

3.1 概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVlJrZbe-1639054040143)(E:\app\Typora\img\image-20211114151429566.png)]

3.2 开发步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k4BgFL7G-1639054040145)(E:\app\Typora\img\image-20211114151511547.png)]

3.2.2 编写Servlet


public class servlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("My First Servlet!");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m5FBLmuJ-1639054040147)(E:\app\Typora\img\image-20211114152950630.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77Md4cyI-1639054040149)(E:\app\Typora\img\image-20211114152909983.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HdwXLKVD-1639054040150)(E:\app\Typora\img\image-20211114153346409.png)]

检查Servlet是否编写异常

四、使用Idea创建web项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ihzy4njJ-1639054040153)(E:\app\Typora\img\image-20211114153641470.png)]

4.2 Idea开发Servlet

  1. 编写Servlet
  2. 配置web.xml
  3. 部署web.xml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BWN3shgX-1639054040155)(E:\app\Typora\img\image-20211114154138920.png)]

导入第三方jar包

4.4.2 导出war包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UiPLoDcu-1639054040157)(E:\app\Typora\img\image-20211114195635104.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ZW3Ko47-1639054040159)(E:\app\Typora\img\image-20211114200828019.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3LAGQ2l-1639054040161)(E:\app\Typora\img\image-20211114200847467.png)]

五、HTTP协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bzk4nyKw-1639054040163)(E:\app\Typora\img\image-20211114200918581.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpeAvVlb-1639054040165)(E:\app\Typora\img\image-20211114201022119.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UwhP5pAo-1639054040167)(E:\app\Typora\img\image-20211114201414195.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xw7Y3IEQ-1639054040169)(E:\app\Typora\img\image-20211114201428873.png)]

5.4 请求报文

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3LWdrAJn-1639054040171)(E:\app\Typora\img\image-20211114201603885.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SL9P6inx-1639054040173)(E:\app\Typora\img\image-20211114201638620.png)]

响应报文

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zAcFs20N-1639054040175)(E:\app\Typora\img\image-20211114201913158.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ebemN07e-1639054040176)(E:\app\Typora\img\image-20211114202025607.png)]

状态码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIEJJ7wv-1639054040180)(E:\app\Typora\img\image-20211114202111358.png)]

六、Servlet详解【重点】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTGENkdH-1639054040184)(E:\app\Typora\img\image-20211114202234865.png)]

6.1.2 GenericServlet 抽象类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-miFHfijc-1639054040186)(E:\app\Typora\img\image-20211114202532749.png)]

6.2 两种方式创建Servlet

  • 实现接口Servlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BXHAddos-1639054040188)(E:\app\Typora\img\image-20211114211434124.png)]

该方式比较麻烦,需要实现接口中的所有方法

  • 继承HttpServlet

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T0419Ni9-1639054040189)(E:\app\Typora\img\image-20211114211519850.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8P85k51-1639054040191)(E:\app\Typora\img\image-20211114211621436.png)]

6.3 Servlet的两种配置方式

6.3.1 使用web.xml (Servlet2.5之前使用)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Frx5F9Op-1639054040195)(E:\app\Typora\img\image-20211114212011161.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EaAwkRcL-1639054040197)(E:\app\Typora\img\image-20211114212104571.png)]

6.3.2 使用注解(Servlet3.0后支持,推荐)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rf3nSFu1-1639054040199)(E:\app\Typora\img\image-20211114215218333.png)]

七、Servlet应用【重点】

7.1 request 对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3VUTLwf0-1639054040201)(E:\app\Typora\img\image-20211114220345042.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9ZTzn8D-1639054040203)(E:\app\Typora\img\image-20211114220409019.png)]

7.1.2 request 主要方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pe8uAsop-1639054040206)(E:\app\Typora\img\image-20211114220526641.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f4NsSaV3-1639054040207)(E:\app\Typora\img\image-20211114221937313.png)]

7.1.5 中文乱码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kNL8TGQg-1639054040209)(E:\app\Typora\img\image-20211114222013659.png)]

7.2 response 对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hbxjd8sH-1639054040212)(E:\app\Typora\img\image-20211114222947677.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aQEYE3QS-1639054040218)(E:\app\Typora\img\image-20211114224533410.png)]

7.2.2 解决输出中文乱码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1k8gEe3k-1639054040220)(E:\app\Typora\img\image-20211114224621148.png)]

7.3 综合案例(Servlet + JDBC)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2EfB4GSC-1639054040221)(E:\app\Typora\img\image-20211114224933344.png)]

八、转化与重定向

8.1 现有问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NYMGSExT-1639054040223)(E:\app\Typora\img\image-20211115221154420.png)]

8.1.1 业务、显示分离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1GOxxTl-1639054040224)(E:\app\Typora\img\image-20211115221633430.png)]

8.2 转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vz2URndR-1639054040226)(E:\app\Typora\img\image-20211115221751410.png)]

8.2.2 数据传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaUEdrde-1639054040231)(E:\app\Typora\img\image-20211115223242881.png)]

8.2.3 转发的特点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qd2nGUSy-1639054040233)(E:\app\Typora\img\image-20211115224409432.png)]

8.3 重定向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OaxulIft-1639054040235)(E:\app\Typora\img\image-20211115224847724.png)]

8.3.2 数据传递

  • Response 传递数据 只能是String类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZYipDNrt-1639054040237)(E:\app\Typora\img\image-20211115225130132.png)]

8.3.3 重定向的特点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-488TMKyp-1639054040239)(E:\app\Typora\img\image-20211115225402567.png)]

8.4 转发、重定向总结

  • 不建议使用sendRedirect进行传递数据,明文传递数据不安全

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ohrOIXpO-1639054040242)(E:\app\Typora\img\image-20211115225457977.png)]

九、Servlet 生命周期

9.1 生命周期的是个阶段

9.1.1 实例化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LbFRKbTL-1639054040245)(E:\app\Typora\img\image-20211115225720696.png)]

9.1.2 初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x6Kc1Lsu-1639054040249)(E:\app\Typora\img\image-20211115225833487.png)]

9.1.3 服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FLc0V9pz-1639054040254)(E:\app\Typora\img\image-20211115225845412.png)]

9.1.4 销毁

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H62036uT-1639054040257)(E:\app\Typora\img\image-20211115225858488.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yHqA7mtA-1639054040258)(E:\app\Typora\img\image-20211115230228125.png)]

@WebServlet("/ls")
public class LifeServlet implements Servlet {public LifeServlet(){System.out.println("1、实例化");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("2、初始化");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("3、接收请求,响应结果");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("4、销毁");}
}

十、Servlet特性

10.1 线程安全问题

Servlet的成员变量 message

10.2 如何保证线程安全

既能解决线程安全、又能解决性能问题 就是局部变量了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o6p2yrKu-1639054040259)(E:\app\Typora\img\image-20211115231545580.png)]

@WebServlet(name = "NumberServlet",value = "/numberServlet")
public class NumberServlet extends HttpServlet {// 成员变量只有一份
//    private int number;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 局部变量int number = 1;resp.setContentType("text/html;charset=utf-8");PrintWriter out = resp.getWriter();out.print("您的数字是:" + number);number++;}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

十一、状态管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvNlaM30-1639054040262)(E:\app\Typora\img\image-20211116211825604.png)]

十二、Cookie 的使用

12.1 什么是 Cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pc3EmtoN-1639054040275)(E:\app\Typora\img\image-20211116212025193.png)]

12.2 创建 Cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UTOpMdYt-1639054040277)(E:\app\Typora\img\image-20211116213137177.png)]

12.3 获取 Cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCtlWEHG-1639054040279)(E:\app\Typora\img\image-20211116214052841.png)]

  • 防止Cookie为空,获取完Cookie后要判断

12.4 修改 Cookie

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EdKrixDU-1639054040280)(E:\app\Typora\img\image-20211116215754764.png)]

12.5 Cookie 编码与解码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7LD9yLX-1639054040282)(E:\app\Typora\img\image-20211116220618103.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8duAoUKU-1639054040283)(E:\app\Typora\img\image-20211116220450003.png)]

12.6 Cookie 的优点和缺点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jykd2vy7-1639054040284)(E:\app\Typora\img\image-20211116220519098.png)]

十三、Session对象 【重点】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DnjoA8TZ-1639054040286)(E:\app\Typora\img\image-20211116220717409.png)]

13.3 Session 使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ujWF0Vbj-1639054040288)(E:\app\Typora\img\image-20211116220931596.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3T8chJbq-1639054040289)(E:\app\Typora\img\image-20211116222045968.png)]

13.4 Session 与 request 的区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YjY5kEdK-1639054040290)(E:\app\Typora\img\image-20211116222644497.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjFX8tAO-1639054040293)(E:\app\Typora\img\image-20211116222730858.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTYLsZ4d-1639054040294)(E:\app\Typora\img\image-20211116222756744.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wmVwMZj-1639054040296)(E:\app\Typora\img\image-20211116222817594.png)]

13.5 Session 的生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p1JqulK7-1639054040297)(E:\app\Typora\img\image-20211116222944480.png)]

13.4 浏览器禁用Cookie解决方案【了解】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i1PGHkr1-1639054040298)(E:\app\Typora\img\image-20211116223523283.png)]

13.5 Session实战权限验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TwyRnQwL-1639054040305)(E:\app\Typora\img\image-20211116224103549.png)]

13.6 Session 实战保存验证码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wjKoF5Ie-1639054040308)(E:\app\Typora\img\image-20211116225139483.png)]

十四、ServletContext对象【重点】

14.1 ServletContext概述

14.2 获取 ServletContext 对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AGx1fkFi-1639054040329)(E:\app\Typora\img\image-20211116225814510.png)]

14.3 ServletContext 作用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXB5H29A-1639054040333)(E:\app\Typora\img\image-20211117203446755.png)]

14.4 ServletContext 特点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUOS1hKW-1639054040335)(E:\app\Typora\img\image-20211117203507972.png)]

14.5 ServletContext 应用场景

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wyq1xY2F-1639054040338)(E:\app\Typora\img\image-20211117203641184.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdjldVHQ-1639054040340)(E:\app\Typora\img\image-20211117203711500.png)]

14.6 作用域总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byPewpWU-1639054040342)(E:\app\Typora\img\image-20211117203751672.png)]

十五、过滤器【重点】

15.1 现有问题

15.2 概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0VRJeDX-1639054040343)(E:\app\Typora\img\image-20211117203922374.png)]

15.3 过滤器作用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7B8cP03-1639054040345)(E:\app\Typora\img\image-20211117204152823.png)]

15.4 编写过滤器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXDvyks4-1639054040347)(E:\app\Typora\img\image-20211117204259040.png)]

@WebFilter(filterName = "MyFilter",value = "/t")
public class MyFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("过滤前 -- MyFilter--");chain.doFilter(req, resp);System.out.println("过滤后 --end--");}@Overridepublic void init(FilterConfig config) throws ServletException {}
}

15.5 过滤器配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-idIPwCKS-1639054040348)(E:\app\Typora\img\image-20211117205039775.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZTnNzo1-1639054040349)(E:\app\Typora\img\image-20211117205059155.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zmbuouVj-1639054040350)(E:\app\Typora\img\image-20211117205250700.png)]

15.6 过滤器链和优先级

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rgz9hdiJ-1639054040352)(E:\app\Typora\img\image-20211117205320389.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SraBLQhH-1639054040354)(E:\app\Typora\img\image-20211117205642152.png)]

15.7 过滤器的典型应用

15.7.1 过滤器解决编码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HlNQGFIs-1639054040357)(E:\app\Typora\img\image-20211117210354759.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yeA4nWey-1639054040358)(E:\app\Typora\img\image-20211117210939492.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8tnFKTad-1639054040360)(E:\app\Typora\img\image-20211117210731725.png)]

15.7.2 权限验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05zqi307-1639054040361)(E:\app\Typora\img\image-20211117211005369.png)]

十六、综合案例(EMS)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I055CjEL-1639054040362)(E:\app\Typora\img\image-20211117211543104.png)]

补充

https://www.bilibili.com/video/BV1Ta4y1H7Vc?p=39

1. 文件上传

1.1 前台页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2TuVviax-1639054040363)(E:\app\Typora\img\image-20211117231114016.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RuN4xDPb-1639054040364)(E:\app\Typora\img\image-20211117231229418.png)]

1.2 后台实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNFEwF6R-1639054040365)(E:\app\Typora\img\image-20211117231322708.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F2VQO20p-1639054040367)(E:\app\Typora\img\image-20211117231355439.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRGIIoQk-1639054040368)(E:\app\Typora\img\image-20211117231625400.png)]

2. 文件下载

2.1 超链接下载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9o3yVOt-1639054040370)(E:\app\Typora\img\image-20211117233229691.png)]

<!-- 浏览器能够识别的文件 默认打开-->
<a href="./download/test.txt">文本文件</a>
<a href="./download/test.jpg">图片文件</a>
<!-- 浏览器不能识别的文件 默认下载-->
<a href="./download/test.zip">压缩文件</a>
<hr>
<!-- 浏览器下载可识别的文件 download属性 -->
<a href="./download/test.txt" download>文件</a>
<a href="./download/test.jpg" download="比萨斜塔.jpg">文件</a>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Ge2sF9K-1639054040371)(E:\app\Typora\img\image-20211117233732016.png)]

2.2 后台实现下载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KxGWRBmN-1639054040373)(E:\app\Typora\img\image-20211117234522405.png)]

<form action="/Servlet/downloadServlet">文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名"><button>下载</button>
</form>
@WebServlet(name = "DownloadServlet",value = "/downloadServlet")
public class DownloadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("文件下载 ....");request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");String fileName = request.getParameter("fileName");if(fileName==null || "".equals(fileName.trim())){System.out.println("文件名输入为空");response.getWriter().write("请输入要下载的文件名!");response.getWriter().close();return;}// 得到图片存放的路径String path = request.getServletContext().getRealPath("/download/");// 通过路径得到File对象File file = new File(String.valueOf(Path.of(path,fileName)));// 判断文件对象是否存在,并且是一个标准文件if(file.exists() && file.isFile()){System.out.println("下载文件:"+file.getPath());// 设置响应类型(浏览器无法使用某种方式或激活某个程序来处理MIME类型)response.setContentType("application/x-msdownload");// 设置响应头response.setHeader("Content-Disposition","attachment;filename="+fileName);// 得到输入流FileInputStream fis = new FileInputStream(file);byte[] bytes = new byte[1024];ServletOutputStream out = response.getOutputStream();int len = 0;while((len=fis.read(bytes))!=-1){out.write(bytes);}// 关闭流out.close();fis.close();}else{System.out.println("文件不存在");response.getWriter().write("文件不存在,请重试!");response.getWriter().close();}}

3. 监听器

https://www.bilibili.com/video/BV1mE411h7Co?p=280

3.1 Servlet 监听器的概述

3.1.1 什么是监听器

监听器就是一个实现类特定接口的java类,这个java类用于监听另一个java类的方法调用或者属性的改变。当被监听对象发生上述事件后,监听器某个方法会立即被执行。

3.1.2 监听器的应用

用来监听其他对象的变化的,主要应用在图形化界面上。

  • java中GUI,Android

3.1.3 监听器的术语

  • 事件源:指的是被监听对象(汽车)
  • 监听器:值的是监听的对象(报警器)
  • 事件源和监听器绑定:在汽车上安装报警器
  • 事件:指的是事件源对象的改变(踹了汽车一脚) 主要功能:获得事件源对象。

3.2 监听器入门

3.2.1 入门案例 (关闭win窗口)

public class MyFrame extends JFrame {public static void main(String[] args) {MyFrame myFrame = new MyFrame();myFrame.setBounds(0,0,200,180);myFrame.setVisible(true);myFrame.setName("小窗口");// 在事件源上绑定监听器myFrame.addWindowListener(new MyWindowListener());}
}
class MyWindowListener implements WindowListener{@Overridepublic void windowClosing(WindowEvent e) {MyFrame myFrame = (MyFrame)e.getSource();System.out.println(myFrame.getName());System.out.println("窗口关闭.....");System.exit(0);}
}

3.2.2 监听器的执行过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5mkwlQf-1639054040374)(E:\app\Typora\img\image-20211121210207943.png)]

3.3 Servlet 中的监听器

在Servlet中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext、HttpSession、ServletRequest这三个域对象。

  • 一类:监听三个域对象的创建和销毁的监听器(三个)
  • 二类:监听三个域对象(属性添加、移除、替换)的监听器(三个)
  • 三类:监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)

3.3.1 ServletContextListener 监听器

  • 用来监听ServletContext域对象的创建和销毁的监听器

创建:在服务器启动的时候,为每个web应用创建单独的ServletContext对象。

销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。

  • 监听ServletContext的创建

    void contextInitialized(ServletContextEvent sce)
    
  • 监听ServletContext的销毁

    void contextDestroyed(ServletContextEvent sce)
    
  • 创建监听器

/*** 事件源:ServletContext* 监听器:MyServletContextListener* 事件源和监听器的绑定*/
public class MyServletContextListener implements ServletContextListener{public MyServletContextListener() {}@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("ServletContext对象被创建了....");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("ServletContext对象被销毁了....");}
}
  • 监听器的配置
<listener><listener-class>com.zsg.listener.MyServletContextListener</listener-class>
</listener>
  • ServletContextListener 企业用途

    加载框架的配置文件Spring框架提供了一个核心监听器ContextListener
    定时任务调度
    

3.3.2 HttpSessionListener 监听器

  • 用来监听HTTPSession对象的创建和销毁
  • 创建
    • 服务器端第一次调用getSession()方法的时候
  • 销毁
    • 非正常关闭服务器(正常关闭服务器session会被序列化)
    • session 过期(默认30分钟)
    • 手动调用session.invalidate()方法
  • 创建监听器
/*** 监听HttpSession的创建和销毁的监听器*/
public class MyHttpSessionListener implements HttpSessionListener {public MyHttpSessionListener() {}@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("HttpSession对象被创建了....");}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("HttpSession对象被销毁了....");}
}
  • 监听器的配置
<listener><listener-class>com.zsg.listener.MyHttpSessionListener</listener-class>
</listener>
  • 问题

    • 访问HTML是否创建Session 不会
    • 访问JSP是否创建Session 会
    • 访问Servlet是否创建Session 不会(默认没有调用getSession方法)

3.3.3 ServletRequestListener 监听器

  • 用户监听ServletRequest对象的创建和销毁

  • 创建

    从客户端向服务器发送一次请求,服务器就会创建request对象

  • 销毁

    服务器对这次请求做出了响应之后,request对象就销毁了

  • 创建监听器

/*** 监听ServletRequest对象的创建和销毁的监听器*/
public class MyServletRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {System.out.println("ServletRequest 对象被创建了....");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {System.out.println("ServletRequest 对象被销毁了....");}
}
  • 监听器的配置
<listener><listener-class>com.zsg.listener.MyServletRequestListener</listener-class>
</listener>
  • 问题

    • 访问HTML页面是否创建请求对象 :会
    • 访问JSP页面是否创建请求对象 :会
    • 访问Servlet是否创建请求对象 :会

3.3.4 统计当前在线人数的案例分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t2kN2XPr-1639054040375)(E:\app\Typora\img\image-20211121213945627.png)]

public class OnlineCountServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 在服务器启动的时候初始化一个值为0// 还需要将这个值存入到ServletContext中sce.getServletContext().setAttribute("count",0);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}
}
public class OnlineCountHttpSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {// 在线了HttpSession session = se.getSession();System.out.println(session.getId() + "上线了...");// 获取ServletContext中的值Integer count = (Integer) session.getServletContext().getAttribute("count");count++;session.getServletContext().setAttribute("count", count);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// 下线了HttpSession session = se.getSession();System.out.println(session.getId() + "下线了...");// 获取ServletContext中的值Integer count = (Integer) session.getServletContext().getAttribute("count");count--;session.getServletContext().setAttribute("count", count);}
}
<listener><listener-class>com.zsg.listener.onlinecount.OnlineCountServletContextListener</listener-class>
</listener>
<listener><listener-class>com.zsg.listener.onlinecount.OnlineCountHttpSessionListener</listener-class>
</listener>
<h1>在线人数:${count}</h1>

3.4 监听三个域对象的属性变更的监听器

  • ServletContextAttributeListener

    监听ServletContext对象中的属性变更(属性添加,移除,替换)的监听器

    事件源:ServletContextAttributeEvent

  • HttpSessionAttributeListener

    监听HttpSession对象中的属性变更(属性添加,移除,替换)的监听器

    HttpSessionAttributeEvent

  • ServletRequestAttributeListener

    监听ServletRequest对象中的属性变更(属性添加,移除,替换)的监听器

    ServletRequestAttributeEvent

3.4.1 演示第二类监听器 AttributeListener

public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {System.out.println("向session中添加了属性...");}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {System.out.println("向session中移除了属性...");}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {System.out.println("向session中替换了属性...");}
}
<%session.setAttribute("name", "aaa");// 属性添加session.setAttribute("name", "bbb");// 属性替换session.removeAttribute("name");// 属性移除
%>

3.5 监听HTTP Session中Java类状态改变的监听器

保存在Session域中的Java类可以有多个状态:绑定到Session中;从session中解除绑定;随session对象持久化到一个存储设备中(钝化);随session对象从一个存储设备中恢复(活化)。

Servlet对方中定义了两个特殊的监听的接口,来帮助Java类了解自己在Session域中的状态:

HttpSessionBindingListener 接口

HttpSessionActivitionListener 接口

实现这两个接口的类不需要在web.xml中进行配置

3.5.1 HttpSessionBindingListener 监听器

绑定:必须是Java类存放在session中

监听Java类在HttpSession中的绑定和解除绑定的状态的监听器

public class Bean1 implements HttpSessionBindingListener {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("Bean1 与 Session绑定了...");}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("Bean1 与 Session解除绑定了...");}
}
<%Bean1 bean1 = new Bean1();bean1.setName("zhangsan");session.setAttribute("bean1", bean1);session.removeAttribute("bean1");
%>

3.5.2 HttpSessionActivitionListener 监听器

监听HttpSession中Java类的钝化和活化监听器

/** * 监听HttpSession中对象的钝化和活化的监听器*/
public class Bean2 implements HttpSessionActivationListener, Serializable {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {System.out.println("Bean2 被 Session 钝化了 ...");}@Overridepublic void sessionDidActivate(HttpSessionEvent se) {System.out.println("Bean2 被 Session 活化了 ...");}
}
dunhua.jsp
<%Bean2 bean2 = new Bean2();bean2.setName("bean2");session.setAttribute("bean2",bean2);
%>
huohua.jsp
${bean2.name}
  • 配置Session的序列化和反序列化
<?xml version="1.0" encoding="ISO-8859-1"?>
<Context><Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"><Store className="org.apache.catalina.session.FileStore" directory="mySession"/></Manager>
</Context>

Context 标签可以配置在:

tomcat/conf/context.xml :所有tomcat下虚拟主机和虚拟目录下的工程

tomcat/conf/Catalina/localhost/context.xml :localhost 虚拟主机下的所有项目会序列化session

工程/META-INF/context.xml :当前工程才会序列化session

Tomcat的会话管理器包括两种:

org.apache.catelina.session.StandardManager`类:标准会话管理器
org.apache.catalina.session.PersistentManager类:功能更强大

{
System.out.println(“Bean2 被 Session 钝化了 …”);
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(“Bean2 被 Session 活化了 …”);
}
}


```jsp
dunhua.jsp
<%Bean2 bean2 = new Bean2();bean2.setName("bean2");session.setAttribute("bean2",bean2);
%>
huohua.jsp
${bean2.name}
  • 配置Session的序列化和反序列化
<?xml version="1.0" encoding="ISO-8859-1"?>
<Context><Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"><Store className="org.apache.catalina.session.FileStore" directory="mySession"/></Manager>
</Context>

Context 标签可以配置在:

tomcat/conf/context.xml :所有tomcat下虚拟主机和虚拟目录下的工程

tomcat/conf/Catalina/localhost/context.xml :localhost 虚拟主机下的所有项目会序列化session

工程/META-INF/context.xml :当前工程才会序列化session

Tomcat的会话管理器包括两种:

org.apache.catelina.session.StandardManager`类:标准会话管理器
org.apache.catalina.session.PersistentManager类:功能更强大

千峰 Servlet相关推荐

  1. 十五章、KPI(千峰网络安全300课时笔记)

    十五章.KPI(Public Key Infrastruction)公钥基础设施 引言:千峰网络安全300课时学习,视频学习过程中的学习笔记.笔记中借鉴了CSDN博主「beglage」文章中的图片记录 ...

  2. Linux网络编程——千峰物联网笔记

    B站视频:千峰物联网学科linux网络编程 网址:https://www.bilibili.com/video/BV1RJ411B761?p=1 目录 第一章:计算机网络概述 1.1计算机网络发展简史 ...

  3. [网络安全学习篇1]:windowsxp、windows2003、windows7、windows2008系统部署(千峰网络安全视频笔记)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  4. 千峰网络安全笔记(前三讲)

    典中典 <c语言从研发到脱发> <C++从入门到放弃> <Java从跨平台到跨行业> <Ios开发从入门到下架> <Android开发大全--从开 ...

  5. python千锋好还是黑马好_千峰,达内,黑马哪个好?我们该如何选择呢

    千峰,达内,黑马哪个好?说起千峰,达内,黑马,相信很多人都不会陌生,相信可能也有学生报过他们培训班,那么千峰,达内,黑马哪个会比较好呢,我们该如何选择一家好的培训班呢.开课通知:php中文网<第 ...

  6. [网络安全学习篇10]:扫描技术、暴力破解工具(千峰网络安全视频笔记 10 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  7. 网络安全工程师千峰学习总结第八天

    网络安全工程师千峰学习总结第八天 本博客所写内容均是为了方便自己复习所使用,禁止转载或以博客中的命令手段攻击他人 服务器远程管理 一.远程管理类型 1.图形 2.命令行 二.远程桌面 三.telnet ...

  8. php服务器视频教程,从PHP基础到实战高手 高性能Linux服务器构建实战 千峰教育PHP全新版高级视频教程...

    从PHP基础到实战高手 高性能Linux服务器构建实战 千峰教育PHP全新版高级视频教程 非常厉害的一套PHP实战课程,系统的学习完成后可以从零基础的PHP新手, 成长为能独立完成高性能服务器部署的实 ...

  9. 千峰HTML5+CSS3学习笔记

    千峰HTML5+CSS3学习笔记 文章目录 千峰HTML5+CSS3学习笔记 写在前面 1. 前言 2. HTML 3. CSS 3.1 选择器 3.2 CSS属性 4. 盒子模型 4.1 溢出属性 ...

最新文章

  1. ORB-SLAM2中四叉树管理特征点
  2. FlexPod上安装vSphere 5.5配置中的排错(1)
  3. 如何在一个页面添加多个不同的kindeditor编辑器
  4. python题库刷题训练软件_Python基础练习100题 ( 11~ 20)
  5. redis2.2.8版本的安装详情
  6. 3D动作绑定_全息3D叶修养成记?升级打怪玩转荣耀,HE叶修体验
  7. Python 项目中requirements.txt依赖文件的使用
  8. [转]如何才能在 IIS 7.5 使用 Windows PowerShell Snap-In 功能
  9. apache、nignx等日志分析工具
  10. 【点宽专栏】Dual Thrust 交易策略
  11. 分享一份适合写进简历的软件测试项目
  12. 告诉你怎样学Java才是硬道理(转自chinaitlab)
  13. 【专业学位、学术学位硕士研究生】区别是?如何报考
  14. 超越谷歌与特斯拉?百度Apollo生态有一套
  15. Rasterio入门
  16. 扫描二维码登入PC的工作原理
  17. 最优服务次序问题 和 汽车加油问题
  18. iOS UILable换行相关设置
  19. 福利彩票36选7模拟程序
  20. The page has expired due to inactivity.Please refresh and try again.

热门文章

  1. 破世界纪录了!用Python实现自动扫雷
  2. 使用 nexus 作为 npm 私服
  3. html2canvas实现页面截图功能
  4. 微信小程序中箭头函数的使用实例
  5. Soul App发布Z世代行为年度报告:近2成的年轻人爱逛菜市场
  6. 科大讯飞语音引擎错误20021或者21001
  7. 安全生产隐患排查治理信息化系统软件
  8. 编码器频率信号转电压或电流信号采集、隔离转换
  9. win7图片查看器的注册表项_win7打开电脑黑屏只剩鼠标指针的解决教程
  10. Injective Protocol官方文档翻译(一) -介绍、架构、Injective 链