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实现调用自定义业务方法的更多相关文章

  1. 利用反射创建User类的对象

    package com.bjpowernode; public class User { private int age; public String name; public void m1() { ...

  2. DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

    DataTable和DataRow利用反射直接转换为Model对象的扩展方法类   /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...

  3. 反射工具类.提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,被AOP过的真实类等工具函数.java

    import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.ap ...

  4. ASP.NET5 MVC6 利用Middleware 创建可访问HttpContext 的业务类工厂。(代替HttpContext.Current)

    我们的目标是在后台业务处理类中,能够很容易的取得用户信息或者其它HTTP请求相关的信息. 所以,首先我们需要一个存储这些信息的类: public class RequestData { public ...

  5. 【Java】利用反射执行Spring容器Bean指定的方法,支持多种参数自动调用

    目录 使用情景 目的 实现方式 前提: 思路 核心类 测试方法 源码分享 使用情景 将定时任务录入数据库(这样做的好处是定时任务可视化,也可以动态修改各个任务的执行时间),通过反射执行对应的方法: 配 ...

  6. .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性

    了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...

  7. C#反射实例化类并调用类的方法

    反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力. 它允许程序创建和控制任何类的对象,无需提前硬编码目标类: SalBLL a = (SalBLL)Assembly.Load("B ...

  8. Mysql5.7创建存储过程中调用自定义函数报错Not allowed to return a result set from a function

    因为很多存储过程都会共用一段sql语句,所以我把共用的sql封装成一个自定义函数 AddCapital(); 然后通过存储过程调用,创建存储过程会报错1415,Not allowed to retur ...

  9. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  10. 利用反射及JDBC元数据编写通用查询方法

    元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...

随机推荐

  1. 【To B产品怎么做?】泛用户体验

    目录 - 什么是泛用户体验? - 如何做好泛用户体验? - 泛用户体验有什么用? *预计阅读时间15分钟 不知道你有没有过这种体验,客服妹子的声音软糯,氛围微妙,用词标准,张口就是:给你带来了不好的体 ...

  2. PHP使用ZipArchive压缩、解压缩、加密压缩包等

    <?php use ZipArchive; class Zip { /** * @var array $files 需要压缩的文件或文件夹 */ public $files = []; /** ...

  3. 俄罗斯的 HTTPS 证书问题

    文章转载自:https://mp.weixin.qq.com/s/8EikwCvZgKt2TFsld-nKSA

  4. Minio纠删码快速入门

    官方文档地址:http://docs.minio.org.cn/docs/master/minio-erasure-code-quickstart-guide Minio使用纠删码erasure co ...

  5. 使用KVM的命令行方式安装centos7虚拟机

    前提条件 1.宿主机上已经安装KVM软件,参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/15538881.html 2.已经上传centos7镜像到宿主机里 ...

  6. Allure的简单使用

    Allure的简单使用 1.Allure简介 简单的理解下,可以把Allure当成一个用于生成美观测试报告的开源工具,配合Pytest测试框架使用更佳. 也就是说,Allure是在Pytest执行测试 ...

  7. 媒介查询兼容各种端口的响应式范围取值(移动端、PC端、ipad、移动端侧屏)

    !!!(chrome作者亲测)!!!数据仅供参考 /*ipad*/@media screen and (min-width:760px) and (max-width:1000px) /*移动端*/@ ...

  8. python+request+pymysql+pytest数据驱动

    一.pymysql简单使用 1.安装mysql 下载地址:https://www.mysql.com/,安装教程这里不做介绍了,网上一大推. 2.安装pymysql库 在Terminal终端输入:pi ...

  9. P3261 [JLOI2015]城池攻占 (左偏树+标记下传)

    左偏树还是满足堆的性质,节点距离就是离最近的外节点(无左或者右儿子  或者二者都没有)的距离,左偏性质就是一个节点左儿子的距离不小于右儿子,由此得:节点距离等于右儿子的距离+1. 本题就是对于每个节点 ...

  10. 【C++】从零开始的CS:GO逆向分析3——写出一个透视

    [C++]从零开始的CS:GO逆向分析3--写出一个透视 本篇内容包括: 1. 透视实现的方法介绍 2. 通过进程名获取进程id和进程句柄 3. 通过进程id获取进程中的模块信息(模块大小,模块地址, ...