JavaWeb之三层架构、过滤器、监听器
2023-12-26 09:20:27
24、三层架构
三层架构:软件设计架构
- 界面层(表示层):用户看的界面。用户可以通过界面上的组件和服务器进行交互
- 业务逻辑层:处理业务逻辑的
- 数据访层:操作数据存储文件
25、案例:用户信息列表展示
需求:用户信息的增删改查操作
设计:
-
技术选型:
Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtils+tomcat
-
数据库设计:
create database day17;-- 创建数据库 use day17;-- 使用数据库 create table user( -- 创建表 id int primary key auto_increment, name varchar(20) not null, gender varchar(5), age int, address varchar(32), qq varchar(20), email varchar(50) );
开发:
- 环境搭建
- 创建数据库环境
- 创建项目,导入需要的jar包
- 编码
测试
部署
26、Filter过滤器
26.1、Filter过滤器的概述
概念:
- 生活中的过滤器:净化器,空气净化器,土匪
- web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
- 过滤器的作用:
- 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…
26.2、Filter快速入门
步骤:
- 定义一个类,实现接口Filter
- 复写方法
- 配置拦截路径
- web.xml
- 注解
package com.example.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDome implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDome被执行了.....");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
26.3、过滤器的细节
26.3.1、web.xml配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.example.Filter.FilterDome</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!--拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
26.3.2、过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下边的代码
26.3.3、过滤器生命周期方法
- init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
- doFilter:每一次请求被拦截资源时,会执行。执行多次
- destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
26.3.4、过滤器配置详解
拦截路径配置:
- 具体资源路径:
/index.jsp
只有访问index.jsp
资源时,过滤器才会被执行 - 拦截目录:
/user/*
访问/user
下的所有资源时,过滤器都会被执行 - 后缀名拦截:
*.jsp
访问所有后缀名为jsp资源时,过滤器都会被执行 - 拦截所有资源:
/*
访问所有资源时,过滤器都会被执行
拦截方式配置:资源被访问的方式
-
注解配置:
-
设置
dispatcherTypes
熟悉@WebFilter(value = "/*",dispatcherTypes = DispatcherType.REQUEST)
- REQUEST:默认值。浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
-
-
web.xml配置
- 设置
<dispatcher></dispatcher>
标签即可
- 设置
26.4、案例:敏感词汇过滤
-
需求:
- 对day17_case案例录入的数据进行敏感词汇过滤
- 敏感词汇参考
《敏感词汇.txt》
- 如果是敏感词汇,替换为
***
-
分析:
- 对request对象进行增强。增强获取参数相关方法
- 放行。传递代理对象
-
增强对象的功能:
- 设计模式:一些通用的解决固定问题的方式
-
装饰模式
-
代理模式
- 概念:
- 真实对象:被代理的对象
- 代理对象:代理真实对象的对象
- 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
- 实现方式:
- 静态代理:有一个类文件描述代理模式
- 动态代理:在内存中形成代理对象
- 实现步骤:
- 代理对象和真实对象实现相同的接口
代理对象 = Proxy.newProxyInstance();
- 使用代理对象调用方法
- 增强方法
- 增强方式
- 增强参数列表
- 增强返回值类型
- 增强方法体执行逻辑
- 实现步骤:
package com.example.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
@WebFilter("/*")
public class FilterDome2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//增强request对象
/*
三个参数:
1.类加载器:真实对象.getClass().getClassLoader()
2.接口数组:真实对象.getClass().getInterfaces()
3.处理器:new InvocationHandler()
*/
ServletRequest req = (ServletRequest) Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.getClass().getInterfaces(), new InvocationHandler() {
/*
代码逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
参数:
1.proxy:代理对象
2.method:代理对象调用的方法,被封装为的对象
3.args:代理对象调用的方法时,传递的实际参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取调用方法的名称并判断是否是getParameter方法
String name = method.getName();
if ("getParameter".equals(name)){
//调用真实对象的方法并对返回值增强
String value = (String) method.invoke(servletRequest, args);
//判断返回值是否包含敏感字符
if (value.contains("笨蛋")){
value = value.replaceAll("笨蛋","***");
return value;
}else {
return value;
}
}else {
return method.invoke(servletRequest, args);
}
}
});
filterChain.doFilter(req,servletResponse);
}
@Override
public void destroy() {
}
}
27、Listener监听器
27.1、Listener监听器概述
概念:web的三大组件之一
- 事件监听机制
- 事件:一件事情
- 事件源:事件发生的地方
- 监听器:一个对象
- 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
27.2、Listener监听器使用
ServletContextListener
:监听ServletContext
对象的创建和销毁
-
方法:
void contextDestroyed(ServletContextEvent sce)
:ServletContext
对象被销毁之前会调用该方法void contextInitialized(ServletContextEvent sce)
:ServletContext
对象创建后会调用该方法
-
步骤:
-
定义一个类,实现
ServletContextListener
接口 -
复写方法
-
配置
-
web.xml
<listener> <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class> </listener>
- 指定初始化参数
<context-param>
- 指定初始化参数
-
注解:
@WebListener
-
-
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<listener>
<listener-class>com.example.Listener.ListenerDome</listener-class>
</listener>
<!-- 配置初始化参数-->
<context-param>
<param-name>application</param-name>
<param-value>/WEB-INF/classes/application.xml</param-value>
</context-param>
</web-app>
package com.example.Listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ListenerDome implements ServletContextListener {
//当ServletContext创建后执行
@Override
public void contextInitialized(ServletContextEvent sce) {
//获取ServletContext对象
ServletContext servletContext = sce.getServletContext();
//获取初始化文件
String application = servletContext.getInitParameter("application");
//获取真实路径
String realPath = servletContext.getRealPath(application);
//将文件加载进内存
try {
FileInputStream fileInputStream = new FileInputStream(realPath);
System.out.println(fileInputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("ServletContext被创建了.....");
}
//当ServletContext销毁前执行
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext被销毁了.....");
}
}
文章来源:https://blog.csdn.net/m0_66967690/article/details/135147012
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!