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.youkuaiyun.com/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.youkuaiyun.com/u013201439/article/details/54311305
http://www.imooc.com/article/281230?block_id=tuijian_wz
https://www.cnblogs.com/stulzq/p/7845026.html
https://bbs.youkuaiyun.com/topics/310037600
https://www.cnblogs.com/lonelyxmas/p/9724217.html
https://blog.youkuaiyun.com/shuair/article/details/86645707