程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> MVC AOP面向切面編程復雜引見及實例

MVC AOP面向切面編程復雜引見及實例

編輯:關於JAVA

MVC AOP面向切面編程復雜引見及實例。本站提示廣大學習愛好者:(MVC AOP面向切面編程復雜引見及實例)文章只能為提供參考,不一定能成為您想要的結果。以下是MVC AOP面向切面編程復雜引見及實例正文


MVC AOP面向切面編程

AOP這個詞置信大家都沒有接觸太多過,但是實踐上你們曾經有所接觸了,就在設計形式中。AOP所用的思想其實和設計形式是一樣的,即在不修正原代碼的狀況下一致添加或許修正功用。還有,AOP大多用在spring外面,但是本文所寫的只是在MVC中的使用,要留意。

一、簡介

   所謂AOP(Aspect Oriented Programming的縮寫)意為面向切面的編程,經過預編譯方式和運轉期靜態代理完成順序功用的一致維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。應用AOP可以對業務邏輯的各個局部停止隔離,從而使得業務邏輯各局部之間的耦合度降低,進步順序的可重用性,同時進步了開發的效率。

   以上是百度百科的官方解釋,但是在我看來,其實AOP更多的是一種思想,一種可以動一發而通全身的思想,AOP其實面對的更多是一種贊同的功用或許調用進程來停止編寫的一種順序體,從它的第一個詞Aspect(切面)也就是指的一個方面,也可以理解到這種方式也就是針對一個方面的完成,這一點其實和mvc中的global文件很像,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。應用AOP可以對業務邏輯的各個局部停止隔離,從而使得業務邏輯各局部之間的耦合度降低,進步順序的可重用性,同時進步了開發的效率。

   其次就是它的預編譯性質可以很好的處置一些錯誤或許是事後判別一些狀況,這也招致了它在設計的時分在判別權限,一致輸入某個東東方面變得比擬罕見。“可以經過預編譯方式和運轉期靜態代理完成在不修正源代碼的狀況下給順序靜態一致添加功用的一種技術。AOP實踐是GoF設計形式的延續,設計形式孜孜不倦追求的是調用者和被調用者之間的解耦,進步代碼的靈敏性和可擴展性,AOP可以說也是這種目的的一種完成。”下面這句話也是關於AOP的很好的诠釋。

二、在MVC中的完成

   說了這麼多了,讓我們來實戰一下吧,首先我們需求在vs新建一個mvc的項目,選擇MVC3或許是4都OK,然後樹立一個controller,命名隨意,然後樹立他的視圖,在視圖上寫上最復雜的HelloWorld。

<!DOCTYPE html> 
 
<html> 
<head> 
  <title>Index</title> 
</head> 
<body> 
  <div> 
    <a>Hello! World</a> 
  </div> 
</body> 
</html> 

   右圖是我創立好的MVC處理方案和添加好的controller還有view,在view中寫入下面的代碼以顯示Hello!World。

    運轉之後(不會運轉的自行百度)是不是就顯示出了一個HelloWorld的字樣在網頁上呢?

    好,接上去我們開端新建AOP的一個文件然後去運用,首先在本項目中新添加一個類,名字叫FilterPublic,在援用的中央添加using  System.Web.Mvc這個援用,然後讓這個類承繼於ActionFilterAttribute,大家要留意Action這個詞,闡明這個東西是基於舉措的。

   然後我們寫入以下代碼:

public string Message { get; set; } 
 
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
  base.OnActionExecuting(filterContext); 
  filterContext.HttpContext.Response.Write("Action執行之前" + Message + "<br />"); 
} 
 
public override void OnActionExecuted(ActionExecutedContext filterContext) 
{ 
  base.OnActionExecuted(filterContext); 
  filterContext.HttpContext.Response.Write("Action執行之後" + Message + "<br />"); 
} 
 
public override void OnResultExecuting(ResultExecutingContext filterContext) 
{ 
  base.OnResultExecuting(filterContext); 
  filterContext.HttpContext.Response.Write("前往Result之前" + Message + "<br />"); 
} 
 
public override void OnResultExecuted(ResultExecutedContext filterContext) 
{ 
  base.OnResultExecuted(filterContext); 
  filterContext.HttpContext.Response.Write("前往Result之後" + Message + "<br />"); 
} 

   這個外面就是Filter觸發的各種舉措,然後我們在controller外面的默許辦法做以下修正:

[<span >FilterPublic</span>(Message = "Action")] 
public ActionResult Index() 
{ 
  HttpContext.Response.Write("Action正在執行···<br />"); 
  return Content("正在前往Result···<br />"); 
} 

然後在controller的class類下面也添加一句[FilterPublic(Message = "Controller")],然後運轉,會呈現什麼後果呢?

Action執行之前Action 
Action正在執行··· 
Action執行之後Action 
前往Result之前Action 
正在前往Result··· 
前往Result之後Action 

   可以看到controller外面的辦法在執行之前會去先執行以下我們設置的FilterPublic外面的代碼,而且隨著外面舉措發作時間不同也可以看出了都是哪個辦法被觸發了。 

  但是在controller下面寫的基於controller的辦法卻沒有觸發,這是為什麼呢?

    其實這個問題很復雜,就是我們在設置我們的AOP順序的時分沒有停止參數的設置,沒有讓filter停止疊加的運轉,這個時分我們只需在寫的FilterPublic類的下面加上:[AttributeUsage(AttributeTargets.All, AllowMultiple = true)],就可以讓你設置的各種filter或許疊加的filter停止觸發了,這個時分我們再運轉一下試試:

Action執行之前Controller 
Action執行之前Action 
Action正在執行··· 
Action執行之後Action 
Action執行之後Controller 
 
前往Result之前Controller 
前往Result之前Action 
正在前往Result··· 
前往Result之後Action 
前往Result之後Controller 

  這樣一來,在controller上的Filter也被觸發了,所以我們運用AOP的辦法只需求在我們自己的寫的辦法或許頁面默許的加載辦法下面寫上一個filter類的標簽就可以了。

  那麼,假如我們有個功用需求一切的頁面都觸發,這樣豈不是也很費事麼?別擔憂,這個時分就輪到我們的global文件發揚作用了。在global.asax文件上面的RegisterGlobalFilters辦法上面注冊自己寫的Filter就可以了:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
  filters.Add(new HandleErrorAttribute()); 
  //把自己的filter定義成全局的filter 
  filters.Add(new <span >FilterPublic</span>() { Message = "全局<br/>" }); 
 
} 

然後運轉,看後果:

Action執行之前全局 
 
Action執行之前Controller 
Action執行之前Action 
Action正在執行··· 
Action執行之後Action 
Action執行之後Controller 
Action執行之後全局 
 
前往Result之前全局 
 
前往Result之前Controller 
前往Result之前Action 
正在前往Result··· 
前往Result之後Action 
前往Result之後Controller 
前往Result之後全局 

這樣全局的觸發也就做好了(filter中的message只是用於標識層級的,正式用的時分可以不必定義。)

   這樣一看,假如想要疾速的添加一個全局都用的辦法,只需求新建一個Filter,然後再改一下global文件就可以辦到了,是不是很方便呢。

    以上均為自己關於AOP的一些淺淺的研討,如有錯誤的中央還請讀者指正。

感激閱讀,希望能協助到大家,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved