三层架构:软件设计架构
需求:用户信息的增删改查操作
设计:
技术选型: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)
);
开发:
测试
部署
概念:
步骤:
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();
}
}
<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>
拦截路径配置:
/index.jsp
只有访问index.jsp
资源时,过滤器才会被执行/user/*
访问/user
下的所有资源时,过滤器都会被执行*.jsp
访问所有后缀名为jsp资源时,过滤器都会被执行/*
访问所有资源时,过滤器都会被执行拦截方式配置:资源被访问的方式
注解配置:
设置dispatcherTypes
熟悉
@WebFilter(value = "/*",dispatcherTypes = DispatcherType.REQUEST)
web.xml配置
<dispatcher></dispatcher>
标签即可需求:
《敏感词汇.txt》
***
分析:
增强对象的功能:
装饰模式
代理模式
代理对象 = 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() {
}
}
概念:web的三大组件之一
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被销毁了.....");
}
}