對比asp.net和javaweb的啓動流程和url規則

1.asp.net mvc項目的啓動流程和url規則
通過VS創建的asp.net mvc項目的模板框架如下圖
在這裏插入圖片描述
程序入口爲Global.asax文件下的Application_Start()方法,程序部署到服務器後,第一次訪問該程序時執行該方法,而非啓動服務器時執行,源碼如下:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

Application_Start()方法其下四個方法的作用和源碼分別爲:

AreaRegistration.RegisterAllAreas()方法的作用是註冊 ASP.NET MVC應用程序中的所有區域。

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)方法的作用是註冊全局篩選器,傳入全局篩選器集合,並在該篩選器集合中添加HandleErrorAttribute實例。源碼如下:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }
}

BundleConfig.RegisterBundles(BundleTable.Bundles)方法的作用是註冊捆綁包,源碼如下:

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new ScriptBundle("~/bundles/jquery").Include("~/Scripts/jquery-{version}.js"));
        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include("~/Scripts/jquery.validate*"));
        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*"));
        bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include("~/Scripts/bootstrap.js"));
        bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/bootstrap.css","~/Content/site.css"));
    }
}

RouteConfig.RegisterRoutes(RouteTable.Routes)方法的作用是註冊路由,傳入集合中所有路由的對象,路由地址配置默認爲{controller}/{action}/{id},對應controller控制器中的action方法以及需要傳入的URLID,源碼如下:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults:new
        {
            controller="Home",
            action="Index", 
            id = UrlParameter.Optional }
        );
    }
}

路由地址設置方法:routes.MapRoute()的傳入參數具體如下:
name: 要映射的路由的名稱。
url: 路由的 URL 模式。
defaults: 一個包含默認路由值的對象。

引入路由表概念:在Web應用中,我們都會通過URL(俗稱網址)來發送我們對頁面的請求,打開瀏覽器,輸入我們將要訪問網站的網址,然後等待瀏覽器加載我們期待的頁面。
 傳統的Web Form開發,URL映射到的是一個具體的處理程序,磁盤上的物理文件,如一個aspx文件。
 MVC中多數情況下是將URL映射到Controller和Controller下的Action。
注:因爲asp.net mvc項目中的路由映射原因,控制器的命名必須要添加Controller後綴,Controller和Controller下的Action都會在路由表中存在,供url訪問匹配。

上述源碼中設置的默認路由映射爲:
第一部分——Controller
第二部分——Controller下的Action
第三部分——名爲id的參數

一個MVC應用程序首次運行時(第一個用戶訪問網站時運行,而不是啓動服務器的時候運行),會調用Application_Start()方法,這個方法隨後調用了RegisterRoutes()方法。RegisterRoutes()方法創建了路由表,MapRoute()方法在路由表中添加了名爲“Default”的默認路由,使得用戶訪問網站指定端口時能跳轉到默認路由下。

所謂默認路由,表明如果不填寫Controller,會默認定位HomeController,如果不填寫Action,會默認調用Index方法,如果不填寫id,那麼默認爲空字符串。

上述源碼中設置的默認路由映射爲例,以下這些URL都會定位到HomeController.Index()方法,返回Index View視圖。
http://localhost:38226/
http://localhost:38226/Home
http://localhost:38226/Home/Index

2.asp.net creo mvc項目的啓動流程和url規則
通過VS創建的asp.net creo mvc項目的模板框架如下圖:
在這裏插入圖片描述

程序入口爲program類下的Main函數,源碼如下:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
}

//改造模板源碼如下:
//一般版
public static void Main(string[] args)
{
    IWebHostBuilder webHostBuilder = WebHost.CreateDefaultBuilder(args);
    webHostBuilder.UseStartup<Startup>();
    IWebHost webHost = webHostBuilder.Build();
    webHost.Run();
}
//極簡版
public static void Main(string[] args)
{
    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build().Run();
}

程序執行過程:使用預先配置的默認值初始化microsoft.AspNetCore.Hosting.WebHostBuilder類的新實例。爲該實例指定web主機要使用的啓動類爲Startup。爲該實例構建承載web應用程序的Microsoft.AspNetCore.Hosting.IWebHost。運行web應用程序並阻止調用線程,直到主機關閉。

上述main函數中運行的web應用程序指定的啓動類用於配置應用程序各種數據,源碼如下:

public class Startup 
{
        public Startup(IConfiguration configuration) 
        {
                Configuration = configuration;
        }

        public IConfiguration Configuration {get;}

        public void ConfigureServices(IServiceCollection services) 
        {
                services.Configure < CookiePolicyOptions > (options = >
                {
                        options.CheckConsentNeeded = context = >true;
                        options.MinimumSameSitePolicy = SameSiteMode.None;
                });
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
        {
                if (env.IsDevelopment()) 
                {
                        app.UseDeveloperExceptionPage();
                } 
                else 
                {
                        app.UseExceptionHandler("/Home/Error");
                        app.UseHsts();
                }

                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseCookiePolicy();
                app.UseMvc(routes = >
                {
                        routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
                });
        }
}

Startup類必須包含Configure方法,並可以選擇包含ConfigureServices方法,這兩個方法在應用程序啓動時調用。ConfigureServices(如果存在)在Configure之前調用。
在啓動時可用的服務ASP.NET Core依賴注入在應用程序啓動期間提供服務。可以通過在Startup類的構造方法或其Configure方法中包含適當的接口作爲參數來請求這些服務。

ConfigureServices 方法是可選的; 但是如果使用的話,它會在WebHost的Configure方法之前被調用。 WebHost可能會在調用啓動方法之前配置一些服務。 按照慣例,在這個方法中設置配置選項。

Configure方法主要是配置ASP.NET Core的中間件(配置app對象的中間件),相當於我們在ASP.NET中所說的管道,ConfigureServices主要是配置依賴注入(DI)。Configure方法用於指定ASP.NET應用程序如何響應HTTP請求。 通過將中間件組件添加到由依賴注入提供的IApplicationBuilder實例來配置請求管道。其中的每個Use擴展方法將一箇中間件組件添加到請求管道。 例如,UseMvc擴展方法將路由中間件添加到請求管道,並將MVC配置爲默認處理程序,同時設置默認路由,訪問網站時,路由訪問執行流程如下圖。
在這裏插入圖片描述

:c#拓展方法,例如可以爲int擴展一些方法,此方法需要在靜態類中,不止可以爲類拓展方法,也可以爲接口拓展方法。


public static class StringE
{
    public static int Add(this int p_Int)
    {
        p_Int++;
        return p_Int;
    }
}

使用的時候就可以發現int多了個擴展方法 Add
int a = 0;
int b=a.Add();

3. javaweb項目啓動流程和servlet配置
javaweb項目有大神寫了,詳細的內容可以看下面的鏈接
https://blog.csdn.net/shuair/article/details/86645707

javaweb項目一般都在配置到tomcat服務器,tomcat啓動時,會讀取web.xml文件,項目中的web.xml以及tomcat自帶的(位置:apache-tomcat-8.5.43\conf\web.xml),tomcat自帶兩個servlet,下面是這兩個servlet的映射規則(web.xml裏面寫的)


<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet --> 
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

tomcat自帶的web.xml的最下面配置了welcome-file-list節點,該節點的子節點即爲默認訪問頁面(welcome-file),welcome-file配置的順序會影響到實際的默認訪問,我們可以在自己的web.xml文件中配置welcome-file-list節點以覆蓋tomcat自帶的,tomcat自帶的web.xml中配置的welcome-file-list節點如下


<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

如果是默認訪問,即請求根路徑(ip:port/項目名/) 時,如果我們自定義的servlet沒有配置“/*”前綴匹配,那麼請求路徑無法依據精確匹配、前綴匹配及擴展名匹配被任何servlet匹配到,此時會增加一個資源文件(welcomeResources)匹配方式,先拼接welcome-file的值再進行如上三種匹配,具體規則如下:
1、如果只有一個welcome-file時,直接將welcome-file的值拼接到根目錄後面進行匹配
2、如果存在多個welcome-file時,按照順序依次嘗試,如果依據精確匹配、前綴匹配方式可以找到對應的servlet或者物理真實存在該文件,則使用該welcome-file的值拼接到根目錄後面進行匹配,如果不存在這樣的welcome-file,則使用第一個welcome-file的值拼接到根目錄後面進行匹配。
注意:這裏說的物理真實存在表示,在項目的webapp文件夾下存在這樣的文件,即文件名和後綴與welcome-file的值相同

水平有限,暫時寫到這,後續發現問題會繼續更改!

參考資料:
https://blog.csdn.net/u013201439/article/details/54311305
http://www.imooc.com/article/281230?block_id=tuijian_wz
https://www.cnblogs.com/stulzq/p/7845026.html
https://bbs.csdn.net/topics/310037600
https://www.cnblogs.com/lonelyxmas/p/9724217.html
https://blog.csdn.net/shuair/article/details/86645707

發佈了13 篇原創文章 · 獲贊 2 · 訪問量 2020
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章