当前位置: 首页 > news >正文

【javaweb简单教程】9.Servlet与过滤器超简单教程

9.Servlet与过滤器

初识Servlet

  • Servlet做了什么?
    • 本身不做任何业务处理
    • 只是接收请求并决定调用哪个JavaBean去处理请求
    • 确定用哪个页面来显示处理返回的数据
  • Servlet是什么?
    • Server+Applet,是一种服务器端的Java应用程序
    • 只有当一个服务器端的程序使用了Servlet API的时候,这个服务端
    • 的程序才能称之为Servlet
  • JSP与Servlet之间的关系
    • Servlet是运行在服务器端的Java应用程序

Servlet API

  • 主要Servlet API介绍
    • javax.servlet.Servlet接口
      • 所有Java Servlet的基础接口类,规定了必须由Servlet具体类实现的方法集
    • javax.servlet.GenericServlet类
      • 是Servlet的通用版本,是一种与协议无关的Servlet
    • javax.servlet.http.HttpServlet类
      • 在GenericServlet基础上扩展的基于Http协议的Servlet
  • 如何创建Servlet
    • 实现Servlet接口
    • 继承GenericServlet类
    • 继承HttpServlet类

Servlet

  • Servlet中主要方法
    • init():Servlet的初始化方法,仅仅会执行一次
    • service():处理请求和生成响应
    • destroy():在服务器停止并且程序中的Servlet对象不再使用的时
    • 候调用,只执行一次
  • ServletRequest
    • 封装客户的请求信息
    • 作用相当于JSP内置对象request
  • ServletResponse
    • 创建响应信息,将处理结果返回给客户端
    • 作用相当于JSP内置对象response
  • ServletConfig
    • 包含了Servlet的初始化参数信息

Servlet生命周期

  • Servlet生命周期各个阶段
    • 加载和实例化
    • 初始化
    • 处理请求
    • 销毁
生命周期谁来做何时做
实例化Servlet 容器当Servlet容器启动或者容器检测到客户端请求时
初始化Servlet 容器实例化后,容器调用Servlet的init()初始化对象
处理请求Servlet 容器得到客户端请求并做出处理时
销毁Servlet 容器当程序中的Servlet对象不再使用的时候, 或者Web服务器停止运行的时候

部署运行Servlet

  • Servlet部署与运行

    • 修改web.xml(部署描述文件)
      • 添加< servlet >:把Servlet内部名映射到一个Servlet类名
      • 添加< servlet-mapping >:把用户访问的URL映射到Servlet的内部名
  • 注意:

    <servlet-mapping><servlet>中的<servlet-name>必须一致
    
    • 通过URL访问Servlet

Servlet配置

  • 配置Servlet

    • 配置< servlet >元素
    <servlet>
    	<servlet-name>myServlet3</servlet-name>
    	<servlet-class>demo.web.servlet.MyServlet3</servlet-class>
    </servlet>
    /*
    myServlet3: Servlet名称唯一
    demo.web.servlet.MyServlet3: Servlet类所在路径
    */
    
    • 配置 < servlet-mapping >元素
    <servlet-mapping>
    	<servlet-name>myServlet3</servlet-name>
    	<url-pattern>/myServlet3</url-pattern>
    </servlet-mapping>
    /*
    myServlet3: 与<servlet>的<servlet-name>设置相同
    /myServlet3: 访问Servlet的URL,相对于Web应用的路径,有三种配置方式
    */
    
  • 初始化参数设置

    • 配置< init-param >元素
<servlet>
    ……
<init-param>
<param-name>charSetContent</param-name>
<param-value>utf-8</param-value>
</init-param>  
</servlet>
/*
charSetContent: 参数名称
utf-8: 参数值
*/
    
public void init(ServletConfig config) throws ServletException {
	String initParam=config.getInitParameter("charSetContent");		//通过ServletConfig对象读取初始化参数
	System.out.println(initParam);
}

过滤器

  • 过滤器
    • 是向Web应用程序的请求和响应添加功能的Web服务组件
    • 过滤器可以统一地集中处理请求和响应
    • 使用过滤器技术实现对请求数据的过滤

使用步骤

  • 过滤器的使用步骤

    • 建立实现javax.servlet.Filter接口的类,实现过滤行为
    doFilter(...)  {
    //过滤请求
    chain.doFilter(request, response); //调用下一个过滤器或Web资源
    //过滤响应
    }
    
    • 在web.xml中配置过滤器
<filter>
    <filter-name>过滤器名</filter-name>
    <filter-class>过滤器的完全限定名</filter-class>
</filter>
<filter-mapping>
    <filter-name>过滤器名</filter-name>
    <url-pattern>过滤器映射的Web资源</url-pattern>	
    /*
    完全匹配:/index.jsp
    目录匹配:/admin/*
    扩展名匹配:*.do
    全部匹配:/*
    */
</filter-mapping>

过滤器的生命周期

  • 实例化
  • 初始化:init()
  • 过滤:doFilter()
  • 销毁:destroy()

初始化参数

  • 配置过滤器的初始化参数
    • 配置< init-param >元素
<filter>
<init-param>
    <param-name>Encoding</param-name>	<!-- 参数名称 -->
    <param-value>UTF-8</param-value>	<!-- 参数值 -->
  </init-param>
</filter>
  • 读取过滤器的初始化参数
init(FilterConfig fConfig)  {
    String encoding=fConfig.getInitParameter("Encoding");	//通过FilterConfig对象读取初始化参数
}

过滤器链

  • 多个过滤器会形成过滤器链。根据过滤器的配置,按照先后顺序执行

过滤器的应用场合

  • 对请求和响应进行统一处理
  • 对请求进行日志记录和审核
  • 对数据进行屏蔽和替换
  • 对数据进行加密和解密

相关文章:

  • 猛淦,阿里大老纯手撸Spring高级源码手册,啃起来真TM香啊
  • ES6导入与导出(module)
  • 【opencv-c++】cv::imshow和cv::waitKey函数显示图像
  • 第二课 我的第一个程序 hello world
  • 消息队列实现分布式事务
  • 前端性能优化指标 + 检测工具
  • CubeMx笔记 --pwm输出+输入捕获
  • 轻松玩转树莓派Pico之一、新手上路
  • 目前我国网络安全人才市场状况
  • Redis源码解读之用RedisAe实现一个简单的HTTP服务器
  • 【极简python】第一章 print与变量
  • HAL库与Cubemx\rt-thread Nano系列教程-01-新建HAL工程及移植RT-Nano到Alios Developer Kit
  • 论文阅读_知识蒸馏_MobileBERT
  • No2.搭建基本的资源端解析token(资源服务端)
  • Vue入门【四】-- 事件机制与双向数据绑定
  • .pyc 想到的一些问题
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 5、React组件事件详解
  • Java方法详解
  • js正则,这点儿就够用了
  • learning koa2.x
  • Mocha测试初探
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • MySQL的数据类型
  • OSS Web直传 (文件图片)
  • rabbitmq延迟消息示例
  • vue 配置sass、scss全局变量
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 全栈开发——Linux
  • 人脸识别最新开发经验demo
  • 如何使用 JavaScript 解析 URL
  • 我感觉这是史上最牛的防sql注入方法类
  • 小程序 setData 学问多
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 在weex里面使用chart图表
  • ​2020 年大前端技术趋势解读
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​虚拟化系列介绍(十)
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #Lua:Lua调用C++生成的DLL库
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (11)MSP430F5529 定时器B
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (六)c52学习之旅-独立按键
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (四) Graphivz 颜色选择
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .describe() python_Python-Win32com-Excel
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET和.COM和.CN域名区别