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();
}
}

最新文章

  1. [LeetCode] Remove Invalid Parentheses 移除非法括号
  2. DOS命令(可查看本机IP地址各个网卡号)
  3. jquery导航栏
  4. C++中调用Python脚本
  5. MyEclipse for Spring启动时报错&quot;An internal error occurred during: &#39;Updating indexes&#39;.Java heap space&quot;的解决办法
  6. python socket 选项
  7. 【学习笔记】【C语言】二维数组
  8. SSAS 实例重命名
  9. 找不到类型“IBatisService.boxManageService”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。
  10. filestream 读取视频文件
  11. /usr/bin/env: node: no such file or directory
  12. android 背景图片的设置
  13. Equals()和GetHashCode()方法深入了解
  14. 2017-2018-1 1623 bug终结者 冲刺005
  15. Java Map 及相应的一些操作总结
  16. 外网访问内网Docker容器
  17. 【LeetCode每天一题】Length of Last Word(字符串中最后一个单词的长度)
  18. springboot读取配置文件的顺序(转)
  19. Luogu3760 TJOI2017 异或和 树状数组
  20. 来不及说什么了,Python 运维开发剁手价仅剩最后 2 天

热门文章

  1. nginx+uwsgi+flask
  2. 使用kubectl命令删除某个目录下所有的yaml文件
  3. Ingress
  4. 使用Kuboard界面在k8s上部署SpringCloud项目
  5. 洛谷P2860 [USACO06JAN]Redundant Paths G (tarjan,边双缩点)
  6. DVWA File Upload level high 通关
  7. Linux安装中文字体(已验证)
  8. 会话跟踪技术 - Cookie 和 Session 快速上手 + 登陆注册案例
  9. 十大 CI/CD 安全风险(三)
  10. 2022-08-14-esp32把玩记-③_轻轻松松显示个二维码(esp32+ssd1306显示图片)