day33 过滤器filter & 监听器listener & 利用反射创建BaseServlet实现调用自定义业务方法
Filter过滤器
Fileter可以实现:
1)客户端的请求访问servlet之前拦截这些请求,对用户请求进行预处理
2)对HttpServletResponse进行后处理;
注意
多个Filter的执行顺序在web.xml配置文件中的配置顺序一致,一般把feilter配置在servlet之前


代码示例
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("过滤器拦截成功");
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("GBK");
//放行请求
chain.doFilter(request, response);
}
}
web.xml配置Filter
<!-- 配置filter过滤器 -->
<filter>
<!-- 别名 -->
<filter-name>my</filter-name>
<!-- 地址 -->
<filter-class>code.filter.MyFilter</filter-class>
</filter>
<!-- 配置filter映射关系 -->
<filter-mapping>
<filter-name>my</filter-name>
<!-- 设置拦截路径 ,路径为/* 为拦截所有路径-->
<url-pattern>/m</url-pattern>
</filter-mapping>
执行顺序

在web.xml设置初始化参数
getInitParameter()方法可以获取在web.xml配置文件中配置的init-param参数

//在MyFilter内的init方法验证
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter-init");
String site = filterConfig.getInitParameter("Site");
System.out.println(site);
}
listener监听器
定义
用于监听web项目的常见对象
HttpServletRequest/HttpSession/ServltContext/HttpServletResponse
作用
1)监听web对象的创建与销毁
2)监听web对象属性的变化
3)监听session绑定javabean的操作(Java类)
代码
package code.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class ReqListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("listener-req-destroy");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("listener-req-init");
}
}
web.xml配置Listener

运行顺序


filter过滤器和listener监听器的区别

WEB-INF目录

利用反射创建BaseServlet实现调用自定义业务方法
BaseServlet不需要再配置web.xml,因为只需要其提供doGet()doPost()方法
public class BaseServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//获取请求中的method参数,该参数的值,表示业务方法的名字
String mName = req.getParameter("method");//在路径后加?method=xxx
//this当前类对象,创建反射的Class类对象
Class c = this.getClass();
try {
//创建反射method对象
Method method = c.getDeclaredMethod(mName, HttpServletRequest.class,HttpServletResponse.class);
//执行方法
method.invoke(this, req, res);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doGet(req, res);
}
public void test(HttpServletRequest req, HttpServletResponse res) throws IOException{
PrintWriter out = res.getWriter();
out.write("baseservlet-function-test()");
out.flush();
if(out!=null) out.close();
}
public void test2(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
req.getRequestDispatcher("page/demo.jsp").forward(req, res);
}
}
可以将BaseServlet设置doGet()方法,然后其他的servlet类都可以继承这个类实现调用自定义业务方法
public class BaseServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//获取请求中的method参数,该参数的值,表示业务方法的名字
String mName = req.getParameter("method");
//this当前类对象,创建反射的Class类对象
Class c = this.getClass();
//创建反射method对象
try {
Method method = c.getDeclaredMethod(mName, HttpServletRequest.class,HttpServletResponse.class);
//执行方法
method.invoke(this, req, res);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doGet(req, res);//如果post方法接收的话,也跳转到doGet方法
}
}
//
//因为 MyServlet 继承 BaseServlet,所以继承了baseservlet的doget方法,所以在运行时BaseServlet内的this关键字相当于指代MyServlet类对象
public class MyServlet extends BaseServlet{
public void run(HttpServletRequest req, HttpServletResponse res){
PrintWriter out = res.getWriter();
out.write("MyServlet-function test()");
out.flush();
if(out != null) out.close();
}
}
day33 过滤器filter & 监听器listener & 利用反射创建BaseServlet实现调用自定义业务方法的更多相关文章
- 利用反射创建User类的对象
package com.bjpowernode; public class User { private int age; public String name; public void m1() { ...
- DataTable和DataRow利用反射直接转换为Model对象的扩展方法类
DataTable和DataRow利用反射直接转换为Model对象的扩展方法类 /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...
- 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...
- ASP.NET5 MVC6 利用Middleware 创建可访问HttpContext 的业务类工厂。(代替HttpContext.Current)
我们的目标是在后台业务处理类中,能够很容易的取得用户信息或者其它HTTP请求相关的信息. 所以,首先我们需要一个存储这些信息的类: public class RequestData { public ...
- 【Java】利用反射执行Spring容器Bean指定的方法,支持多种参数自动调用
目录 使用情景 目的 实现方式 前提: 思路 核心类 测试方法 源码分享 使用情景 将定时任务录入数据库(这样做的好处是定时任务可视化,也可以动态修改各个任务的执行时间),通过反射执行对应的方法: 配 ...
- .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性
了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...
- C#反射实例化类并调用类的方法
反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力. 它允许程序创建和控制任何类的对象,无需提前硬编码目标类: SalBLL a = (SalBLL)Assembly.Load("B ...
- Mysql5.7创建存储过程中调用自定义函数报错Not allowed to return a result set from a function
因为很多存储过程都会共用一段sql语句,所以我把共用的sql封装成一个自定义函数 AddCapital(); 然后通过存储过程调用,创建存储过程会报错1415,Not allowed to retur ...
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
- 利用反射及JDBC元数据编写通用查询方法
元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...
随机推荐
- Spring 后置处理器【1】
Spring 后置处理器[1] 简单介绍 一句话:bean 在初始化前或初始化后的瞬间,我自己添加一些业务逻辑 bean 后置处理器类的内容 简单代码 package com.hspedu.sprin ...
- ProxySQL(6):管理后端节点
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9286922.html 配置后端节点前的说明 为了让ProxySQL能够找到后端的MySQL节点,需要将后端的 ...
- kubeadm 使用 Calico CNI 以及外部 etcd 部署 kubernetes v1.23.1 高可用集群
文章转载自:https://mp.weixin.qq.com/s/2sWHt6SeCf7GGam0LJEkkA 一.环境准备 使用服务器 Centos 8.4 镜像,默认操作系统版本 4.18.0-3 ...
- 220501 T1 困难的图论 (tarjan 点双)
求满足题目要求的简单环,做出图中所有的点双,用vector存储点双中的边,如果该点双满足点数=边数,就是我们想要的,求边的异或和即可:如果该点双点数小于边数,说明有不只一个环覆盖,不满足题意. 1 # ...
- SQL基础语句入门
SQL语句入门 起因 学校开设数据库相关的课程了,打算总结一篇关于基础SQL语句的文章. SQL介绍 SQL最早版本是由IBM开发的,一直发展到至今. SQL语言有如下几个部分: 数据定义语言DDL: ...
- @Transactional注解真的有必要声明rollbackFor属性吗?
@Transactional注解真的有必要声明rollbackFor属性吗? 今天在看spring的事务底层源码时,想到一个问题,@Transactional注解真的有必要声明rollbackFo ...
- ubuntu20.04详细安装教程
1.运行虚拟机,加载一段时间后弹出"安装"界面.语言栏倒数第三个是中文.点击[安装 Ubuntu]. 2.键盘布局,[继续] 3.更新和其他软件,取消[安装Ubuntu时下载更新] ...
- 2021年9月28日,老是遇到一些非常奇葩的问题。就离谱、好好的一个web项目就莫名奇妙坏了。
起因是这样的:我前几天用idea2020编辑器,用ssm框架搭建了一个图书管理系统.只是将图书信息的增删改查实现,还有用户的注册和登录功能实现.本来想着今天将用户信息的删除和修改完善以下,本来是很简单 ...
- 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...
- python-windows下如何将单个py文件生成exe文件
这需要pyinstaller,在cmd执行pip install pyinstaller命令 安装完成后,执行 pyinstaller -F 目录 可执行文件于是就在同个目录下的dist目录顺利生成了 ...