MVC中的AOP思想——Filter

简介:      一,AOP(Aspect Oriented Programming)           在谈AOP之前,我们先来说OOP(Object Oriented Programming),这是接触每一门编程语言的时候,都会先学的东西。


     一,AOP(Aspect Oriented Programming)


           在谈AOP之前,我们先来说OOP(Object Oriented Programming),这是接触每一门编程语言的时候,都会先学的东西。众所周知,OOP有三个特征:封装,继承,多态。这是从类的角度来说的,如果我们把系统中的关系用UML图来表示的话,会发现有点儿类似树的结构,这棵树是从上到下的或者是从下到上的,是一个竖直的结构。


          但是AOP不同,AOP是一个水平的结构。在一个系统中,我们可能会遇到这样的情况,当我们写了一大段业务逻辑,之后,在方法结尾,我们要将一些操作记入日志中,然而,我们要记入日志的东西很多,很可能我们很多代码都是这个结构:业务逻辑+日志记录。为解耦业务逻辑跟这些与业务逻辑无关的东西,方便系统维护,提高代码清晰度,我们加入AOP。


          如果说OOP是对系统的纵切的话,那么AOP就是对系统的横切,在横切的同时,加入统一的处理,让我们编码的时候,重点还是放在业务逻辑方面,对系统整体的相似的东西(与业务逻辑无关的东西)在横切的同时统一加入。


      

二,Filter实现简单AOP

          

在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter,执行顺序如下:


  • IAuthorizationFilter    最先执行的,在这些Filter中,我们可以说它的执行优先级是最高的,用于身份验证并对控制器中的action进行授等进行逻辑处理

  • IActionFilter    IAuthorizationFilter之后执行,包含两个方法,在controller中的action执行之前、执行之后进行逻辑处理

  • IResultFilter    同样包含两个方法,在IActionFilter之后执行,在返回View之前和返回View之后执行逻辑处理

  • IException      主要用于对异常信息进行处理


   下面我们以IActionFilter与IException为例,来看下filter是如何实现AOP的。


    首先是actionFilter:


  public class LoggerFilter:FilterAttribute,IActionFilter
    {
        /// <summary>
        /// 在被拦截action后执行
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-13 19:47:23</remarks>
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.Controller.ViewData["executedLogger"] = "action之后。。——" + DateTime.Now;
        }

        /// <summary>
        /// 在被拦截Action前执行
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-13 19:47:00</remarks>
        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.Controller.ViewData["executingLogger"] = "action之前。。——" + DateTime.Now;

        }
    }

   我们建立的类要继承FilterAttribute,实现IActionFilter,重写action执行之前和之后的方法。


   测试,如果要使用我们的filter,只需在返回view的方法上面加上标签即可。


     

     [LoggerFilter()]
        public ActionResult Index()
        {
            System.Threading.Thread.Sleep(2000);
            ViewData["Time"] = DateTime.Now;//当前时间
            System.Threading.Thread.Sleep(2000);

            return View();
        }


然后我们在页面上接收下根据打印的时间来判断执行顺序:



@using System.Web.UI.WebControls
@{
    ViewBag.Title = "Index";
}

<h2>测试ActionFilter</h2>

<p>@ViewData["executingLogger"]</p>

<p></p>
<p>@ViewData["Time"]</p>
<p></p>

<p>@ViewData["executedLogger"]</p>




异常处理:


 

 public class ExceptionFilter:FilterAttribute,IExceptionFilter
    {
        /// <summary>
        /// 异常发生时候被调用
        /// </summary>
        /// <param name="filterContext">The filter context.</param>
        /// <remarks>创建者:刘慧超; 创建时间:2015-09-13 19:52:25</remarks>
        public void OnException(ExceptionContext filterContext)
        {
            filterContext.Controller.ViewData["ErrorMessage"] = filterContext.Exception.Message;  //此处Exception是异常类型实例
            filterContext.Result = new ViewResult()
            {
                ViewName = "ExceptionIndex",  //出错后跳转到的错误页面
                ViewData = filterContext.Controller.ViewData
            };
            filterContext.ExceptionHandled = true; //告诉系统,异常已经处理了,不需要再次处理了


        }
    }


   在代码中,我们定义出现异常之后,跳转到异常出错页面。


 测试方法:


 

  public void TestE()
        {
            throw new Exception("这是个被抛出的异常,啦啦啦。。。");
            return;
            ;
        }

        [ExceptionFilter()]
        public ActionResult ExceptionIndex()
        {
            TestE();
            return View();

        }


页面显示出一次信息:



@{
    ViewBag.Title = "ExceptionIndex";
}

<h2>异常拦截测试</h2>

<p>@ViewData["ErrorMessage"]</p>



        可见filter使用方法类似,首先定义继承相应接口和特性标签的类,之后在要处理的返回视图的方法上加上attribute.


       有点儿类似我们以前经常被问道的页面生命周期,但是又不一样,页面生命周期是类自带的,而filter中方法的执行是后期有选择的加入的,感觉很像方法正在从上到下流畅执行,到了特定地方,被横切一刀,切面编程还是蛮形象的。











     

目录
相关文章
|
8月前
|
前端开发 Java 关系型数据库
使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC
使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC
|
开发框架 缓存 JSON
ASP.NET Core MVC 从入门到精通之Filter
ASP.NET Core MVC 从入门到精通之Filter
198 0
|
XML 前端开发 Java
【Spring MVC 系列】Spring MVC 中 Filter 配置的 6 种方式,看看你了解哪些
Filter 简介 过滤器 Filter 在 Servlet 2.3 版本中被首次提出,唯一的作用就是过滤,它不仅可以过滤请求,还可以过滤响应,当请求到达 Servlet 容器,会先经过 Filter ,然后再交给 Servlet,之后 Filter 还可以对 Servlet 的响应进一步处理。并且多个 Filter 还能形成一个链。使用图示表达如下。
1138 0
【Spring MVC 系列】Spring MVC 中 Filter 配置的 6 种方式,看看你了解哪些
|
前端开发
java202304java学习笔记第六十四天-mvc的请求-ssm-interceptor个filter区别
java202304java学习笔记第六十四天-mvc的请求-ssm-interceptor个filter区别
60 0
|
设计模式 前端开发 Java
Spring IOC、DI、AOP以及Spring MVC面试原理(3)
Spring IOC、DI、AOP以及Spring MVC面试原理(3)
200 0
Spring IOC、DI、AOP以及Spring MVC面试原理(3)
|
XML 设计模式 前端开发
Spring IOC、DI、AOP以及Spring MVC面试原理(2)
Spring IOC、DI、AOP以及Spring MVC面试原理(2)
186 0
Spring IOC、DI、AOP以及Spring MVC面试原理(2)
|
XML 缓存 前端开发
Spring IOC、DI、AOP以及Spring MVC面试原理(1)
Spring IOC、DI、AOP以及Spring MVC面试原理(1)
248 0
Spring IOC、DI、AOP以及Spring MVC面试原理(1)
|
前端开发 Java Spring
手写Spring源码分析笔记 (IOC,DI,MVC,AOP)
手写Spring源码分析笔记 (IOC,DI,MVC,AOP)
136 0
|
前端开发
.Net Mvc中Filter过滤器需要注意的坑
<p>  啥也不说,先上代码:</p> <p>  public class ValidateAttribute : ActionFilterAttribute</p> <p>  {</p> <p>  private string _Name=null;</p> <p>  //Action执行前的过滤器</p> <p>  public override void OnActionExecuting(ActionExecutingContext filterContext)</p>
135 0
|
前端开发
mvc的filter
如果想要记录ajax的请求和输出信息、内部发生异常记录日志、需要登录认证、需要权限判断;那mvc的各种filter可以帮助你实现你想要的。Mvc框架支持5种不同类型的过滤器;我会按照执行顺序进行简单的demo,再简单的代码分享,万一对一个人有益,也是值的。
959 0