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

Servlet与设计模式

 1 过滤器和包装器

过滤器可以拦截请求及控制响应,而servlet对此毫无感知。过滤器有如下作用:

1)请求过滤器:完成安全检查、重新格式化请求首部或体、建立请求审计日志。

2)响应过滤器:压缩响应流、追加或修改响应流、创建一个完全不同的响应。

1.1 声明和确定过滤器顺序

当多个过滤器映射到一个给定资源时,容器会使用先URL模式后servlet-name的规则。

<filter-mapping>

      <filter-name>filter3</filter-name>

      <servlet-name>helloServlet</servlet-name>

</filter-mapping>

<filter-mapping>

      <filter-name>filter1</filter-name>

      <url-pattern>/*</url-pattern>

</filter-mapping>

<filter-mapping>

      <filter-name>filter2</filter-name>

      <url-pattern>*.action</url-pattern>

</filter-mapping>

过滤器的顺序为: filter1、filter2、filter3

1.2 过滤器实战

需求:1)项目只接受/hello 请求的GET方法,对于其他请求则返回“404没有找到对应资源”。2)对所有响应,返回内容结尾都追加“filter实战”。

public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter();writer.print("你好 Servlet");writer.close();}}public class RequestFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("拦截器初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;String method = request.getMethod();String servletPath = request.getServletPath();HttpServletResponse response = (HttpServletResponse) servletResponse;CustomResponseWrapper responseWrapper = new CustomResponseWrapper(response);responseWrapper.setContentType("text/html;charset=UTF-8");if ("GET".equalsIgnoreCase(method) && "/hello".equalsIgnoreCase(servletPath)) {filterChain.doFilter(request,responseWrapper);} else {PrintWriter writer = responseWrapper.getWriter();writer.print("404没有找到对应资源");writer.close();}}@Overridepublic void destroy() {System.out.println("拦截器销毁");}
}public class CustomResponseWrapper extends HttpServletResponseWrapper {private CustomPrintWriter pw;public CustomResponseWrapper(HttpServletResponse response) {super(response);}@Overridepublic PrintWriter getWriter() throws IOException {if (pw == null) pw = new CustomPrintWriter(super.getWriter());return pw;}
}public class CustomPrintWriter extends PrintWriter {public CustomPrintWriter(Writer out) {super(out);}@Overridepublic void print(String s) {super.print(s + "——filter实战");}
}
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4"><servlet><servlet-name>helloServlet</servlet-name><servlet-class>HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>helloServlet</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><filter><filter-name>reqFilter</filter-name><filter-class>RequestFilter</filter-class></filter><filter-mapping><filter-name>reqFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

web.xml 

2 企业设计模式

Web系统要求着良好的性能,让用户得到更快的响应时间及支持更多的并发用户;为了让应用不同部分能同时在不同主机上运行,要以适当方式模块化;同时系统还要有一定的灵活性、可维护性和可扩展性。

2.1 处理远程对象

在对象跨网络通信时存在一些常见的问题:查找远程对象及处理本地和远程对象之间的底层网络I/O通信。也就是如何找到远程对象,以及如何调用其方法。

JNDI和RMI可以解决上述的问题。

2.1.1 JNDI

Java Naming and Directory Interface,Java命名和目录接口。可以在网络上的一个集中位置上完成查找。想被查找并访问的对象,要先向JNDI注册,再通过JNDI来查找。

2.1.2 为控制器增加JNDI。

图 WEB服务请求调用远程服务器服务过程

业务委托:完成请求的业务处理。

服务定位器:从JDNI查找需要调用的远程服务。

2.2 MVC

Model-View-Controller(模型-视图-控制器)。

模型:真正的业务逻辑和状态。了解获取和更新状态的规则。

视图:从控制器得到模型的状态。发起请求及接受响应。

控制器:从请求取得用户输入,并向模型明确输入用户的含义。

2.2.1 改进MVC控制器

控制器的3大任务及处理方案:

1)获得和处理请求参数,将这个任务交给另外一个单独的表单验证组件,由它获得表单参数、完成转换、进行验证、处理错误并创建一个对象保存参数值。

2)调用模型,采用声明方式,在定制部署描述文件中列出一些模型,控制器可以读取这些模型,并且根据请求来决定要使用哪些模型。

3)分派到视图,采用声明方式,根据URL控制器就能区分要分派到哪个视图。

前端控制器:应用所有的请求都会通过一个控制器,由它处理,并将请求分派到适当地方。

相关文章:

Servlet与设计模式

1 过滤器和包装器 过滤器可以拦截请求及控制响应&#xff0c;而servlet对此毫无感知。过滤器有如下作用&#xff1a; 1&#xff09;请求过滤器&#xff1a;完成安全检查、重新格式化请求首部或体、建立请求审计日志。 2&#xff09;响应过滤器&#xff1a;压缩响应流、追加或…...

Python学习基础笔记六十五——布尔值

布尔对象&#xff1a; Python中有一种对象类型称之为布尔对象&#xff08;英文叫bool&#xff09;。 布尔对象只有两种取值&#xff0c;True和False。对应的是真和假&#xff0c;或者说是和否。True对应的是&#xff0c;False对应的是否。 我觉得这句话是一个关键&#xff1a…...

ChatGPT生产力|实用指令(prompt)

GPT已经成为一个不可或缺的科研生产力了&#xff0c;但是大多数人只知晓采用直接提问、持续追问以及细节展开的方式来查阅相关资料&#xff0c;本文侧重于探讨“限定场景限定角色限定主题”、“可持续追问细节展开”等多种方式来获取更多信息&#xff0c;帮人们解决更多问题。 …...

【大数据Hive】hive select 语法使用详解

目录 一、前言 二、Hive select 完整语法树 三、Hive select 操作演示 3.1 数据准备 3.1.1 创建一张表 3.1.2 将数据load加载到t_usa_covid19表 3.1.3 再创建一张分区表 3.1.4 使用动态分区插入数据 3.2 select 常用语法 3.2.1 查询所有字段或者指定字段 3.2.2 查询…...

Android---java线程优化 偏向锁、轻量级锁和重量级锁

java 中的线程是映射到操作系统原生线程之上的&#xff0c;如果要阻塞或唤醒一个线程就需要操作系统的帮忙&#xff0c;这就需要从用户态转换到核心态。状态转换需要花费很多时间&#xff0c;如下代码所示&#xff1a; private Object lock new Object();private int value;p…...

处理机调度

目录 处理机调度概述 处理机调度的层次 低级调度 中级调度 高级调度 进程调度 进程调度的时机 进程调度的方式 非抢占式调度方式 抢占式调度方式 调度算法的评价指标 调度算法 先来先服务调度算法&#xff08;FCFS&#xff0c;First Come First Serve&#xff09; …...

Webpack 解决:ReferenceError: dist is not defined 的问题

1、问题描述&#xff1a; 其一、报错为&#xff1a; ReferenceError: dist is not defined 中文为&#xff1a; ReferenceError&#xff1a;dist 未定义 其二、问题描述为&#xff1a; 想在 webpack 的配置中&#xff0c;创建一个 dist 文件夹来存放 npm run build 打包后…...

MySQL的index merge(索引合并)导致数据库死锁分析与解决方案 | 京东云技术团队

背景 在DBS-集群列表-更多-连接查询-死锁中&#xff0c;看到9月22日有数据库死锁日志&#xff0c;后排查发现是因为mysql的优化-index merge&#xff08;索引合并&#xff09;导致数据库死锁。 定义 index merge(索引合并)&#xff1a;该数据库查询优化的一种技术&#xff0…...

第四章 网络层 | 计算机网络(谢希仁 第八版)

文章目录 第四章 网络层4.1 网络层提供的两种服务4.2 网际协议IP4.2.1 虚拟互连网络4.2.2 分类的IP地址4.2.3 IP地址与硬件地址4.2.4 地址解析协议ARP4.2.5 IP数据报的格式4.2.6 IP层转发分组的流程 4.3 划分子网和构造超网4.3.1 划分子网4.3.2 使用子网时分组的转发4.3.3 无分…...

课题学习(八)----卡尔曼滤波动态求解倾角、方位角

一、 卡尔曼滤波 卡尔曼滤波的应用要求系统和底层过程的测量模型都是线性的。离散时间线性状态空间系统的描述为: x k Φ k , k − 1 x k − 1 G k − 1 w k − 1 x_k\Phi_{k,k-1}x_{k-1}G_{k-1}w_{k-1} xk​Φk,k−1​xk−1​Gk−1​wk−1​    式中 Φ k , k − 1 \Phi_{…...

仿真软件Proteus8.9 SP2 Pro 下载、安装、汉化详细图文教程

Proteus8.9 安装教程 视频教程一、安装软件解压二、软件安装常见问题及解决方法&#xff1a;三、汉化 Proteus8.9 SP2 Pro 安装教程 本破解教程仅供个人及 proteus 8.9粉丝们交流学习之用&#xff0c;请勿用于商业用途&#xff0c; 谢谢支持。此版本为Proteus8.9 SP2 Pro。其他…...

振弦传感器和无线振弦采集仪在隧道安全监测的解决方案

振弦传感器和无线振弦采集仪在隧道安全监测的解决方案 隧道作为交通工程的重要组成部分&#xff0c;具有极高的安全风险&#xff0c;因此隧道安全监测是必不可少的。振弦传感器和无线振弦采集仪作为隧道安全监测的两种重要设备&#xff0c;能够有效地监测隧道的振动情况&#…...

c# xml 参数读取的复杂使用

完整使用2 生产厂家里面包含很多规格型号,一个规格型号里面包含很多出厂序列号,点击下一步如果检测到填充的和保存的不一样 就新增一条(如检测到生产厂家相同,但是规格型号不同,就新增一组规格型号)。 界面一:新增界面 界面2 删除界面 界面一:新增界面 load 其中…...

在Mac中使用 brew services start redis 命令启动、停止Redis服务报错

一、问题现象 启动Redis服务命令&#xff1a; brew services start redis异常信息如下&#xff1a; Error: uninitialized constant Homebrew::Service::System /opt/homebrew/Library/Homebrew/macos_version.rb:150:in const_missing /opt/homebrew/Library/Taps/homebrew…...

iapp源码-----比较经典

2.0底部菜单导航栏.rar: https://url18.ctfile.com/f/7715018-958700751-6096bd?p6511 (访问密码: 6511) 2.0涟漪_拖动条控制音乐播放.rar: https://url18.ctfile.com/f/7715018-958700754-4cec13?p6511 (访问密码: 6511) 2.0手电筒.rar: https://url18.ctfile.com/f/7715018…...

为什么手机会莫名多出许多软件?

许多手机用户都曾遭遇过这样的问题&#xff0c;他们在使用手机的过程中&#xff0c;突然发现手机屏幕上出现了一些未知的软件。这些软件并非他们主动下载的&#xff0c;但它们却显现在屏幕上。这些软件从何而来&#xff1f; 其实&#xff0c;这些软件往往是在浏览网页、阅读小…...

测试自动化的边缘:DevTestOps 和 DevSecOps

什么是 DevOps&#xff1f; DevOps 允许企业通过自动化基础设施、工作流程和持续测量应用程序的性能来提高开发人员和运营团队之间的协作和生产力。通过 DevOps&#xff0c;开发人员可以以小块的形式编写代码&#xff0c;以便在几个小时内集成、测试、监控和部署代码&#xff…...

fatal:Could not read from remote repository解决方法

Linux服务器如何连接GitHub&#xff1f; 生成SSH密钥 ssh-keygen -C “邮箱” -t rsa 存放位置一般是/root/.ssh/id_rsa 登录个人github&#xff0c;添加客户端生成的公钥 打开Settings&#xff0c;点击SSH and GPG keys&#xff0c;点击New SSH Key。Key中粘贴id_rsa.pub…...

数学基础

线性代数 关键词&#xff1a;线性方程组、矩阵、增广矩阵&#xff08;系数矩阵、常数项矩阵&#xff09;、阶梯型矩阵、行最简矩阵、最简形矩阵、向量系统、向量加法、向量空间、基本单位向量、线性相关、线性无关、Span张成空间、 向量乘法&#xff08;点积、内积、外积、叉积…...

【Python】Python语言基础(上)

第一章 前言 1. Python简介 Python语言并不是新的语言&#xff0c;它早于HTTP 1.0协议5年&#xff0c;早于Java语言 4年。 ​ Python是由荷兰人Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;于1989年圣诞节期间在阿姆斯特丹休假时为了打发无聊的假期而编写的一个脚本…...

C#设计模式六大原则之依赖倒置原则

C#设计模式六大原则是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。它们不是要我们刻板的遵守&#xff0c;而是根据实际需要灵活运用。只要对它们的遵守程度在一个合理的范围内&#xff0c;努为做到一个良好的设计。以下介绍C#依赖倒置原则…...

IDEA的使用(二)快捷键 (IntelliJ IDEA 2022.1.3版本)

1. IDEA中的常用快捷键 1.1 通用型快捷键 1.2 提高编写速度 ctrl shift ↑或↓ 只能在方法里面移动代码。 alt shift ↑或↓ 可以向方法外移动代码。 设置过自动导包&#xff0c;所以不用批量导包啦。 1.3 类结构、查找和查看源码 1.4 查找、替换和关闭 1.5 调整格式 1.6 De…...

微信小程序个人账号申请和配置详细教程

一、注册小程序管理账号 1、注册方法 在微信公众平台官网首页&#xff08;mp.weixin.qq.com&#xff09;&#xff0c;点击右上角的“立即注册”按钮。 2、选择注册的账号类型 选择“小程序”&#xff0c;点击“查看类型区别”可查看不同类型账号的区别和优势。 3、填写邮箱和…...

opencv定位图片中的图案?

import cv2 as cv2def find_positions(image_path, small_image_path):# 读取大图和小图large_image cv2.imread(image_path)small_image cv2.imread(small_image_path)# 小图规格small_image_h, small_image_w small_image.shape[:2]# 对比大图与小图# 匹配模板res cv2.ma…...

高防CDN:网络安全的不可或缺之选

在当今数字化时代&#xff0c;网络攻击已经成为互联网上的一种不可避免的风险。为了应对不断升级的网络威胁&#xff0c;许多企业和组织正在采用高防御CDN&#xff08;Content Delivery Network&#xff09;技术&#xff0c;以确保他们的在线资产得到保护&#xff0c;用户体验得…...

flutter 常用组件:文本、图片和按钮

文章目录 文本控件富文本控件图片本地图片网络图片按钮文本控件 ##一’码’当先 Text(这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本,textAlign:TextAlign.center,style: TextStyle(fontWeight: FontWeight.bold, font…...

BI工具:让数据分析井然有序一望而知

BI&#xff08;Business Intelligence&#xff09;工具是一类专门用于数据分析和决策支持的软件工具。 它们能够将企业内部和外部的数据进行整合、处理和可视化&#xff0c;帮助用户从海量数据中获取有价值的见解和洞察&#xff0c;并以直观、易懂的方式展示给决策者和相关人员…...

2024级199管理类联考之逻辑核心基础

且与或 含义 A且B(A^B):同时存在 常见形式 A并且B既A又B不但A而且B虽然A但是BA或B:二者至少有一个成立(即A且非B,非A且B,A且B) 否定形式 且的否定 A且B否定形式&#xff1a;非(A^B) 非A 或 非B非A且非B否定形式&#xff1a;非(非A^非B) A 或 B非A且B否定形式&#xff1a;…...

第二次课,文件校验(预习)

hash 计算接口 Crypto API &#xff08;证书&#xff0c;对称加密&#xff0c;非对称加密&#xff0c;编码和解码&#xff09; CryptAcquireContext CryptCreateHash CryptReleaseContext CryptHashData CryptDestroyHash CryptGetHashParam 注册表操作接口 RegEnumKeyEx RegE…...

京东官方平台API接口获得JD商品详情页信息数据采集产品价格、原价、销量、商品属性名等

京东商品详情API接口的作用是获取京东平台上某个商品的详细信息&#xff0c;包括商品标题、价格、图片、规格、参数、店铺信息等。开发者可以通过该接口获取到商品的原始数据&#xff0c;方便进行数据分析、价格比较、爬取等操作。 通过该接口获取到的商品详情数据可以结合其他…...