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