对比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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值