當初用jsp開發程序時,因為很多東西寫在一起混淆的,項目做大或者變更的時候就會很吃力,聯動性太大,有時修改視圖的東西都可能會影響業務邏輯,分層不明確。
后來聽說了Struts MVC,做過幾個示例,層次倒是分清了,每個actionbean或者interceptor都得配置映射,配置弄來弄去很麻煩,當然用配置的方式的話靈活性擴展性會好很多,但做起來實太吃力。再后來看到了Spring MVC 它可以省去很多配置,可以使用注解的方式去直接寫在程序了,實現了零配置。
在dotnet方面原來一直沒有mvc這個概念只有webform,webform相對入門簡單,但要更高級的入門感覺沒那么簡單,而且webform不適合做web app。后來看到了MonoRail MVC,於是研究了一翻以后,決定自己弄一個適合自己的MVC框架,於是乎便產生了我自己的MVC,我命名是Stephen.View 其實名字叫Stephen.MVC更好些,但后來一直沒改,那就一直保持這個名字了。若干年后微軟也出了MVC,現在都已經有好幾個版本了。沒去研究過這個東東,項目中還是用我自制的這個框架。接下來說說我的框架實現原理:
通過在web.config中
<httpHandlers> <add verb="*" path="*.aspx" type="Stephen.View.TemplateHandle,Stephen.View"/> … </httpHandlers>
攔截擴展名為.aspx的請求,讓Stephen.View.TemplateHandle(實現IhttpHandlerFactory接口的類)處理http請求,處理方式有以下幾步:
1.是否有url重寫(可在web.config中寫入配置),有的話根據配置后執行真實的處理url,沒有的話就跳過。
Web.config配置方式為:
<configuration> <configSections> … <section name="RewriterConfig" type="Stephen.View.UrlConfig.RewriterConfigSerializerSectionHandler, Stephen.View"/> … </configSections> <RewriterConfig> <Rules> <RewriterRule> <LookFor>~/article/cat/(\d+).aspx</LookFor> <SendTo>~/integration/info/CommonManageList_.aspx?ClassID=$1</SendTo> </RewriterRule> </Rules> </RewriterConfig> <connectionStrings>
url重寫可參考:http://www.cnblogs.com/netcorner/archive/2009/12/10/2912045.html
2.通過真實的url地址配置需調用哪個控制器(可通過web.config中配置控制組件前綴包名,默認控制層名字為Netcorner.Controllers)
<appSettings> <add key="Controller" value="Netcorner.Controllers"/> </appSettings>
注:控制層的方法默認是不具有session會話的,如需要會話的話控制層方法必須加入HasSessionAttribute 特性。
在調用控制層方法之前,會向控制層方法傳遞一個Hashtable對象,該對象存放了分別是當前應用路徑(key=applicationPath),當前路徑地址(currentFilePath),視圖應用處理包(key=Tools,視圖處理包可通過配置映射哪個處理包,默認就是Stephen.View.ViewUtility類)
3.調用控制器執行方法
控制器其實就是一個簡單的C#類,如:
namespace Netcorner.Controllers.integration
{
public class User
{
public virtual IDictionary ManageList(IDictionary context)
{
...
}
}
}
當執行/integration/user/managelist.aspx時就會執行User類中ManageList方法,context參數是從Stephen.View.TemplateHandle得到的。
控制器的寫法可有多種方式:
1).采用直接在方法體里面寫代碼
2).是寫插件(我這里把C#特性叫做插件了,這些插件把一些常見的業務封裝起來了,直接可以拿來調用)的方式。每個插件必須實現BeforehandCommonAttribute或ProceedPlugin抽象類。工作方式可參見后面章節。
3).通過配置的動態攔截器。攔截器必須實現AspectInterceptor抽象類,工作方式可參見后面章節。
4).控制器方法處理完成返回相應的值.
不同類型調用的方式不一樣
(1).返回Hashtable時
調用視圖模板。這里我處理的模板引擎用了nvelocity。語法參見:http://www.cnblogs.com/netcorner/archive/2008/07/11/2912125.html
(2).其它類型時,則以字符串形式直接展現不需要模板。
控制層的訪問類是通過url傳遞的,在根目錄的話執行的類名必須是Default,其它的話就會根據包名和類名相匹配找到相應類下面相應方法。比如:/integration/user/login.aspx 它實際是訪問Netconer.Controllers.integration(我這里使用默認設定的控制器)包下的login方法
演示示例:http://files.cnblogs.com/netcorner/%E7%A4%BA%E4%BE%8B1.rar
接下來我會講一下插件及攔截器原理及開發方法。
