Servlet

Servlet

一、介绍

  • javaEE规范的一种
  • 作用
    • 指定开发动态文件的步骤
    • 指定HTTP服务器调用动态文件规则
    • 管理动态文件对象规则

二、Servlet接口实现类

  1. Servlet接口是雷子Servlet规范下的一个接口,接口存在于HTTP服务器
  2. Tomcat服务器下lib文件内有servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)
  3. HTTP服务器调用动态文件,必须是Servlet接口实现类

2.1 开发步骤

  1. 创建java类实现HttpServlet接口

  2. 重写父类HttpServlet的两个方法 doGet/doPost方法 重写CTRL+o

  3. 将实现类信息注册到Tomcat服务器中

    web/WEB-INF/web.xml

<!-- 将实现类路径交给Tomcat-->
<servlet>
    <!-- 声明变量存储实现类的路径-->
    <servlet-name>my</servlet-name>
    <!-- 实现类的路径-->
    <servlet-class>My</servlet-class>
</servlet>
<!-- 降低用户访问实现类的难度,取别名-->
<servlet-mapping>
    <servlet-name>my</servlet-name>
    <!-- 设置别名 /开头-->
    <url-pattern>/my</url-pattern>
</servlet-mapping>

三、Servlet对象生命周期

  • 实现类对象只能HTTP服务器自动创建

  • 默认情况 收到请求第一次请求自动创建

    • 可以手动配置 启动服务器时自动创建对象
    <servlet>
        <!-- 声明变量存储实现类的路径-->
        <servlet-name>my</servlet-name>
        <!-- 实现类的路径-->
        <servlet-class>My</servlet-class>
        <!-- 大于0的整数 让对象在服务器启动时就创建-->
            <load-on-startup>1</load-on-startup>
    </servlet>
    
  • 服务器运行时,一个实现类只能被创建一个对象

  • 服务器关闭时,所有对象会被销毁

四、HttpServletResponse接口

  • 来自Servlet规范中 Tomcat中servlet-aqi.jar
  • 实现类由HTTP服务器提供【响应对象】
  • 负责将doGet/doPost方法执行结果 写入响应体 交给浏览器

4.1 主要功能

  1. 执行结果以二进制 写入响应体中

  2. 设置响应头中的【content-type】属性值

    ​ 控制浏览器使用对应的编译器

  3. 设置响应头【location】属性值 将地址赋值

    ​ 从而控制浏览器向指定的服务器发送请求

4.2 使用

以二进制 写入响应体中

//设置响应头中的【content-type】 [charset]修改编码集
resp.setContentType("text/html;	charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print(xxx);
//设置响应头location
resp.sendRedirect("Http://www.baidu.com");

五、HttpServletRequest接口

  • 来自Servlet规范中 Tomcat中servlet-aqi.jar
  • 实现类由HTTP服务器提供【请求对象】
  • 负责在doGet/doPost运行中获取Http请求协议包中的信息

5.1 主要功能

  1. 读取请求行的信息
  2. 读取保存【请求头】【请求体】中的信息
  3. 可以代替浏览器向服务器申请资源文件调用

5.2 使用

读取请求包中的信息

请求头和请求体的方法是一样的

请求头保存 Get参数 Tomcat默认解码UTF-8

请求体保存 Post参数 Tomcat默认解码ISO-8859-1 如果是中文 就乱码

//读取请求行中url信息
String url = req.getRequestURL().toString();
//读取请求行中method信息
String method = req.getMethod();
//资源文件精准定位
String uri = req.getRequestURI();

//修改Tomcat解码字符集
req.setCharacterEncoding("gbk");
//读取请求头中的请求参数名
        Enumeration<String> parames = req.getParameterNames();
        while (parames.hasMoreElements()){
            String parame = parames.nextElement();
            //读取请求参数值
            String parameter =req.getParameter(parame);
            System.out.println(parame+":"+parameter);
        }

5.3 响应与请求对象生命周期

  1. 当HTTP服务器接收浏览器发送的请求协议包之后

    自动为协议包生成请求对象和响应对象

  2. HTTP服务器调用doGet/doPost方法时

    将两个对象作为实参传递到方法,确保方法的执行

  3. HTTP准备推送响应协议包之前

    负责将两个对象销毁

  4. 请求对象和响应对象贯穿一次请求的处理过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22qB3kHU-1631945809870)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210913141958994.png)]

六、项目

6.1 前期准备

6.2 用户注册流程图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cId3SmVJ-1631945809875)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210913145057760.png)]

七、默认网站定位

http://localhost:8080/myweb/
//Tomcat默认定位规则 安装位置下conf/web.xml打开拉到底
//依次 如果没有就404
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>

7.1自定义默认网站定位

//在web.xml配置文件下
<welcome-file-list>
	<welcome-file>xxx.html</welcome-file>
</welcome-file-list>

八、HTTP状态码

8.1 介绍

  1. 由三位数组成

  2. Http服务器在推送响应包前,根据本次请求情况

    将Http状态码写入响应包状态行

  3. 返回了对应文件,通过http状态码通知浏览器如何处理

    不能返回,就勇敢http状态码向浏览器解释原因

8.2 分类

  1. 组成 100-599 分5大类

  2. 1xx:最具有特征100:不是独立的资源文件

    ​ 浏览器会继续请求资源文件

  3. 2xx:

    200:通知浏览器本次返回文件是独立完整的文件

  4. 3xx:

    302:c此次返回不是文件 是一个资源文件地址

    ​ 浏览器自动根据地址去索要文件

  5. 4xx:

    404: 没有找到对应资源文件

    405:找到servlet文件 没找到对应请求方式

  6. 5xx:

    500:找到servlet文件 找到对应请求方式 java 处理异常

九、多个servlet之间

9.1 调用规则

  1. 前提条件:需要服务器中多个servlet协同处理

    但是浏览器一次只能访问一个,需要用户手动发起多次请求

  2. 提高用户使用感受

    多个servlet 用户只需要手动请求一次

9.2 重定向解决方案

  1. 工作原理:用户手动请求一次,浏览器访问OneServlet工作完毕,将Two地址写入响应头 location属性,服务器将302状态码写入状态行、

  2. 实现命令:

    //写入响应头 location属性
    //请求地址:/网站名/资源文件  或者   整个地址
    resp.sendRedirect("请求地址");
    
    
  3. 请求次数

    浏览器至少发起两次 用户手动第一次

    后续都浏览器自动发送的

  4. 请求方式:

    重定向解决方案 通过地址栏发起下一次请求 GET

  5. 缺点:

    浏览器与服务器之间进行多次往返,增加用户等待服务时间

9.3 请求转发解决方案

  1. 工作原理:用户手动请求一次,浏览器访问OneServlet工作完毕,

    通过当前请求对象代替浏览器向服务器发送请求

    调用Two,然后服务器自动调用完成任务

  2. 实现命令:

//	通过请求对象生成资源文件申请报告对象
RequestDispatcher report = req.getRequestDispatcher("/资源文件");
//将报告对象发送给服务器(当前请求对象,当前响应对象)
report.forward(req,resp);

//简化版
req.getRequestDispatcher("/资源文件").report.forward(req,resp);
  1. 请求次数:1次
  2. 请求地址:只能向服务器申请当前网站下的资源文件地址【不要写网站】
  3. 请求方式:根据第一次请求中method属性决定

十、多个servlet的数据共享方案

  1. 数据共享:OneServlet执行结束将产生的数据给Two
  2. Servlet规范中提供了四种数据共享方案
    1. ServletContext接口
    2. Cookie类
    3. HttpSession接口
    4. HttpServletRequest接口

10.1 ServletContext接口

  1. 介绍

    1)来自Servlet接口规范中的一个接口

    在Tomcat servlet-api.jar中

    2)如果两个Servlet来自同一个网站下

    可以通过这个接口实现数据共享

    3)称为【全局作用域对象】

  2. 工作原理:每个网站都存在一个全局作用域对象相当于Map 留言板[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXN8USv7-1631945809878)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210916103300850.png)]

  3. 全局作用域对象生命周期:

    1)服务器启动中,自动为当前网站创建全局作用域对象

    2)服务器运行中,一个网站只有一个全局作用域对象

    3)服务器运行,会一直存活

    4)服务器关闭,会负责销毁

  4. 命令实现:

    //请求方法中 用请求对象获得全局作用域对象ServletContext application = rep.getServletContext();//将数据添加到全局作用域 作为共享数据application.setAttribute("key",数据)://在另一个Servlet中获取共享数据ServletContext application = req.getServletContext();Object xxx = application.getAttribute("key");
    

10.2 Cookie类

  1. 介绍

    1)来自Servlet接口规范中的一个工具类

    在Tomcat servlet-api.jar 中

    2)如果两个Servlet来自同一个网站下 并且是同一个浏览器/用户提供服务

    可以借助这个Cookie对象实现数据共享

    3)Cookie存放用户的私人数据,提高服务质量

    4)现实类似用户在服务端得到【会员卡】

  2. 工作原理:第一次访问网站的OneServlet在运行中

    会创建一个Cookie存放与当前用户相关的数据 one工作完毕

    会写入响应头 交还给当前浏览器

    浏览器会将Cookie缓存 后面用户通过【同一个浏览器】向服务器 Two发送请求

    会将Cookie写入请求头发送过去 Two就可以读取请求头中Cookie中信息

    获得One提供的共享数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AX04g0Iw-1631945809882)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210916105140088.png)]

  3. 实现命令:

    //One 创建Cookie对象 也是相当Map 但是只能存放一个键值对 key(不中文)/value只能StringCookie card_1 = new Cookie("key","value");Cookie card_2 = new Cookie("key","value");//将Cookie写入响应头中 可以多个Cookieresp.addCookie(card_1);resp.addCookie(card_2);//Two 调用请求头得到浏览器的Cookie集合Cookie[] cookies = req.getCookies();//遍历集合for(Cookie card:cookies){    String key = card.getName();    String value = card.getValue();}
    
  4. 会员卡Cookie项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pRRqfj07-1631945809885)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210916143326283.png)]

  1. 生命周期

    1)销毁时机

    Cookie对象放在浏览器缓存

    浏览器关闭 对象就被销毁

    2)手动设置情况下

    可以将浏览器将对象放在客户端硬盘上

    同时指定存活时间 时间到自动删除

//在硬盘存活时间 关闭浏览器 服务器 都不会被销毁只有时间到cookie.setMaxAge(60); //时间是秒

10.3 HttpSession接口

  1. 介绍

    1)来自Servlet接口规范中的一个接口

    实现类也在 在Tomcat servlet-api.jar中

    2)如果两个Servlet来自同一个网站下 并且是同一个浏览器/用户提供服务

    3)会话作用域对象

  2. HttpSession与Cookie区别

    1)存储位置

    服务端计算机内存 / 客户端计算机(浏览器内存/硬盘)

    2)数据类型

    任意数据类型Object / 只能是String

    3)数据数量

    map数组任意个 / 只能一个

    4)参照物

    服务端的私人保险柜 / 服务器的会员卡

  3. 命令实现

    //One调用请求对象 获取HttpSission对象HttpSission session = req.getSession();//将数据添加session.setAttribute("key",数据);//TwoHttpSesion session = req.getSession();Object 数据 = session.getAttribute("key");
    
  4. 服务器如何把用户和HttpSession关联起来

    会返回一个 Cookie的手牌 缓存在浏览器中

    下次请求 就携带手牌

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MdkI9VEG-1631945809886)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210917093638357.png)]

  1. getSession()与getSssion(false)

    (): 如果用户有储物柜 返回

    ​ 没有就创建一个新的 返回

    (false):如果有 返回

    ​ 没有就返回null

  2. 销毁时机

    1)用户和HttpSession关联的Cookie只能缓存在浏览器中

    2)浏览器关闭 关联被切断

    3)由于服务器不能检查浏览器何时关闭 并不会销毁HttpSession

    4)解决此问题 服务器会为每个HttpSession设置一个空闲时间默认30分钟 时间到 删除

  3. HttpSession空闲时间手动设置

    <!--在当前网站/web/WEB-INF/web.xml-->
    <!-- 分钟 -->
    <session-config>
        <session-timeout>5</session-timeout>
    </session-config>
    

10.4 HttpServletRequest接口

  1. 介绍

    1)同一个网站下 两个Servlet通过请求转发 会共享同一个请求协议包

    一个请求协议包对应一个请求对象 所以可以通过请求对象完成数据共享

    2)请求作用域对象

  2. 命令实现

    //将数据添加进请求作用域对象req.setAttribute("key",数据);//数据类型 Objeit//向服务器申请调用第二个Servletreq.getRequestDispatcher("/资源文件").report.forward(req,resp);//Two获取数据Object 数据 = req.getAttribute("key");
    

十一、监听器

11.1 介绍

​ 1. 来自Servlet规范中的一个接口

​ 共有8个接口 在Tomcat servlet-api.jar中

​ 2. 监听器接口需要自己写 服务器没有提供对应的实现类

​ 3. 监控【作用域对象生命周期变化时刻】与【作用域对象共享数据变化时刻】

11.2 作用域对象

  1. Servlet规范中,认为在服务器内存中 某些条件为Servlet之间提供共享服务的对象 称作用域对象

  2. Servlet规范下作用域对象:

    ServletContext:全局作用域对象

    HttpSession:会话作用域对象

    HttpServletRequest:请求作用域对象

  3. 监听器接口实现类开发规范:三步

    1)根据监听的实际情况,选择对应的监听器接口进行实现

    2)重写监听时间处理方法

    3)在web.xml 文件将监听器接口实现类注册到服务器

    <!--注册--><listener>	<listener-class>实现类</listener-class></listener>
    

11.3 ServletContextListener接口

  1. 作用:监听全局作用域对象被初始化和销毁时刻

  2. 监听时间处理方法:

//全局作用域对象初始化时刻contextInitlized();//销毁时刻contextDestory();

11.4 ServletContextAttributeListener接口

1)作用:监听全局作用域对象被初始化和销毁时刻

//在全局作用域对象添加共享数据contextAdd()://在全局作用域对象更新共享数据contextReplaced();//在全局作用域对象删除共享数据contextRemove();

十二、Filter接口(过滤器)

12.1. 介绍

​ 1. 来自Servlet规范中的一个接口

​ 在Tomcat servlet-api.jar中

  1. 由开发人员负责 服务器不负责
  2. 在服务器调用资源文件之前 对服务器进行拦截

12.2 具体作用

  1. 拦截服务器,帮助服务器检测请求合法性

  2. 拦截服务器,对当前请求进行增强操作

  3. 开发步骤:三步

    1)创建Fileter接口实现类

    2)重写doFiletter方法

    //在上面可以对请求头功增强能 filterChain.doFilter(请求对象,响应对象); //放行	
    

    3)在web.xml文件实现类注册服务器

<!--将过滤器类文件路径交给服务器--><filter>	<filter-name>变量名</filter-name>    <filter-class>类路径</filter-class></filter><!--通知服务器调用何种资源文件需要被当前过滤器拦截--><filter-mapping>	<filter-name>变量名</filter-name>    <url-pattern>/文件</url-pattern></filter-mapping>//对所有文件过滤拦截文件格式 //所有文件 /*//某个文件 /xxx.xxx//某文件下所有文件 /xxx/*//某类型文件 /*.xxx<filter-mapping>	<filter-name>变量名</filter-name>    <url-pattern>xxxx</url-pattern></filter-mapping>

12.3 过滤器防止恶意登录

//合法用户 创建一个会话作用域对象HttpSission session = req.getSession();//在Servlet实现类中 判断if(getSssion(false) == null){}

缺点:1.增加开发难度 2.不能对静态文件进行保护

流程图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4o4jZlju-1631945809888)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210918102306313.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值