day33 过滤器filter & 监听器listener & 利用反射创建BaseServlet实现调用自定义业务方法
2024-10-21 06:05:04
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();
}
}
最新文章
- [LeetCode] Remove Invalid Parentheses 移除非法括号
- DOS命令(可查看本机IP地址各个网卡号)
- jquery导航栏
- C++中调用Python脚本
- MyEclipse for Spring启动时报错";An internal error occurred during: &#39;Updating indexes&#39;.Java heap space";的解决办法
- python socket 选项
- 【学习笔记】【C语言】二维数组
- SSAS 实例重命名
- 找不到类型“IBatisService.boxManageService”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。
- filestream 读取视频文件
- /usr/bin/env: node: no such file or directory
- android 背景图片的设置
- Equals()和GetHashCode()方法深入了解
- 2017-2018-1 1623 bug终结者 冲刺005
- Java Map 及相应的一些操作总结
- 外网访问内网Docker容器
- 【LeetCode每天一题】Length of Last Word(字符串中最后一个单词的长度)
- springboot读取配置文件的顺序(转)
- Luogu3760 TJOI2017 异或和 树状数组
- 来不及说什么了,Python 运维开发剁手价仅剩最后 2 天
热门文章
- nginx+uwsgi+flask
- 使用kubectl命令删除某个目录下所有的yaml文件
- Ingress
- 使用Kuboard界面在k8s上部署SpringCloud项目
- 洛谷P2860 [USACO06JAN]Redundant Paths G (tarjan,边双缩点)
- DVWA File Upload level high 通关
- Linux安装中文字体(已验证)
- 会话跟踪技术 - Cookie 和 Session 快速上手 + 登陆注册案例
- 十大 CI/CD 安全风险(三)
- 2022-08-14-esp32把玩记-③_轻轻松松显示个二维码(esp32+ssd1306显示图片)