当前位置: 首页 > news >正文

湖北创研楚商网站建设销售人员网页搜索快捷键ctrl加什么

湖北创研楚商网站建设销售人员,网页搜索快捷键ctrl加什么,想学做网站从哪里入手,常州网络公司联系方式背景 spring mvc作为优秀的web框架#xff0c;从2003年问世#xff08;根据changelog#xff09;到现在已经经历了21年。springframework框架里#xff0c;web相关的类从1.0版本的25个#xff0c;发展到现在6.1版本#xff0c;已经有103个。还不包括spring-boot里web相关…背景 spring mvc作为优秀的web框架从2003年问世根据changelog到现在已经经历了21年。springframework框架里web相关的类从1.0版本的25个发展到现在6.1版本已经有103个。还不包括spring-boot里web相关的代码。初学者使用spring-boot-starter-web 能很快启动一个web服务但是要理清内部的运行逻辑和理解作者的设计思路就要花费很大力气。 下面我尝试模仿spring mvc从0开始搭建web服务剖析作者的设计意图。 web服务的基础-Tomcat tomcat作为开源轻量级web服务器支持java servlet是spring boot默认的web服务器。通过内嵌的tomcat我们可以很快速的开发web应用。我们通过一个demo看一下开发web应用需要的最小配置。 一个小Demo 引入内嵌tomcat的pom文件 dependencygroupIdjakarta.annotation/groupIdartifactIdjakarta.annotation-api/artifactIdversion2.1.1/versionscopecompile/scope /dependency dependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-core/artifactIdversion10.1.18/versionscopecompile/scope /dependency然后注册一个servlet就可以对外提供服务。 public static void main(String[] args) throws LifecycleException { Tomcat tomcat new Tomcat();String path C:\\\\Users\\\\admin\\\\AppData\\\\Local\\\\Temp\\\\tomcat.default.9999;tomcat.setBaseDir(path);Context context tomcat.addContext(, path);tomcat.addServlet(context.getPath(), defaultServlet, new HttpServlet() {Overridepublic void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(get request req.getRequestURL());resp.setStatus(200);PrintWriter writer resp.getWriter();writer.println(System.currentTimeMillis());}});context.addServletMappingDecoded(/*, defaultServlet);Connector connector new Connector(HTTP/1.1);connector.setPort(9999);tomcat.setConnector(connector);tomcat.start();tomcat.getServer().await(); }这里做了几件事情 初始化Tomcat实例并设置根目录创建一个Context创建一个Servlet并添加url路径到Servlet的映射关系添加Connector监听9999端口这里支持HTTP/1.1协议启动tomcat服务 访问http://localhost:9999就能看到正常返回了结果 curl -i http://localhost:9999/abc/dd?xx1 HTTP/1.1 200 Content-Length: 15 Date: Wed, 24 Jan 2024 04:05:39 GMT1706069139905Spring boot里的tomcat配置 了解完tomcat的基本使用方式再对比spring boot里tomcat的用法。下面是spring boot初始化tomcat的逻辑 // org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory Override public WebServer getWebServer(ServletContextInitializer... initializers) {if (this.disableMBeanRegistry) {Registry.disableRegistry();}Tomcat tomcat new Tomcat();File baseDir (this.baseDirectory ! null) ? this.baseDirectory : createTempDir(tomcat);tomcat.setBaseDir(baseDir.getAbsolutePath());for (LifecycleListener listener : this.serverLifecycleListeners) {tomcat.getServer().addLifecycleListener(listener);}Connector connector new Connector(this.protocol);connector.setThrowOnFailure(true);tomcat.getService().addConnector(connector);customizeConnector(connector);tomcat.setConnector(connector);tomcat.getHost().setAutoDeploy(false);configureEngine(tomcat.getEngine());for (Connector additionalConnector : this.additionalTomcatConnectors) {tomcat.getService().addConnector(additionalConnector);}prepareContext(tomcat.getHost(), initializers);return getTomcatWebServer(tomcat); }它这里干了几个事 初始化Tomcat实例并设置根目录添加Server容器的LifecycleListener作为一个扩展点开放出来添加默认Connector这里支持自定义Connector的属性包括设置端口、协议等又是一个扩展点配置tomcat的Engine的backgroundProcessorDelay 属性和添加自定义engineValves添加用户定义的Connector创建一个Context类型是spring自己定义的继承了tomcat的Context将Tomcat对象包装成spring的TomcatWebServer 对象 在不考虑内部细节的情况下spring boot初始化tomcat的步骤基本和demo里的步骤是一样的。主要增加了很多扩展点可以添加Server容器、自定义Connector、添加Engine的Valve管道处理类。还封装了tomcat的Context在自己的Context里也加了很多扩展点。 另外有一点很大的不同就是spring boot的初始流程里没用看到注册Servlet的地方。我们都知道spring mvc核心的Servlet是DispatcherServlet它会代理所有请求。下面分析DispatcherServlet是怎么注册到tomcat的Context。 DispatcherServlet注册到tomcat容器 spring boot是通过ServletContextInitializer来注册tomcat的Servlet、Filter、Listener等对象到ServletContext里。所以第一步要先将DispatcherServlet转成ServletContextInitializer对象。 DispatcherServlet怎么转成ServletContextInitializer对象 DispatcherServlet是一个Servlet类型要转成ServletContextInitializer需要一个包装类DispatcherServletRegistrationBean就是这个包装类。 DispatcherServletRegistrationBean是ServletContextInitializer的子类在spring boot启动时通过自动装配机制注册了DispatcherServletRegistrationBean。并且将DispatcherServlet对象放到了DispatcherServletRegistrationBean对象里。 DispatcherServletRegistrationBean的注册流程 DispatcherServletAutoConfiguration配置类先初始化了DispatcherServlet、DispatcherServletRegistrationBean对象在DispatcherServletRegistrationBean对象里放入注册Servlet需要的信息 public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet,WebMvcProperties webMvcProperties, ObjectProviderMultipartConfigElement multipartConfig) {DispatcherServletRegistrationBean registration new DispatcherServletRegistrationBean(dispatcherServlet,webMvcProperties.getServlet().getPath());registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());multipartConfig.ifAvailable(registration::setMultipartConfig);return registration; } 在得到ServletContextInitializer后就要考虑什么时候去执行它并将DispatcherServlet注册到tomcat容器。这时先看一下tomcat的初始化过程。 tomcat创建时机 SpringApplication.run()方法在执行refreshContext(context)时会调用AnnotationConfigServletWebServerApplicationContext.refresh()方法一直会调用到web容器的父类ServletWebServerApplicationContext的createWebServer()。 生成tomcat对象 createWebServer()会调用TomcatServletWebServerFactory.getWebServer()来初始化tomcat对象。 初始化tomcat对象需要设置一个tomcat上下文对应类型是StandardContext。这里spring自定义了StandardContext的子类TomcatEmbeddedContext作为tomcat上下文。 这时spring会预定义3个ServletContextInitializer并封装到TomcatStarter里。TomcatStarter是ServletContainerInitializer的子类ServletContainerInitializer是tomcat的对象和ServletContextInitializer不一样后者是spring的对象。 然后调用TomcatEmbeddedContext.addServletContainerInitializer(TomcatStarter)把TomcatStarter添加到tomcat上下文的initializers属性里。initializers属性在启动tomcat时会用到。 tomcat初始化后会被包装成TomcatWebServer对象然后在构造函数里启动tomcat。之后tomcat就会从上下文对象里拿到ServletContextInitializer进行初始化。 tomcat初始化流程 tomcat.start()调用server.start()server又调用service.start()service又调用engine.start()engine通过线程池调用host.start()host通过线程池调用TomcatEmbeddedContext.start()这会执行父类方法StandardContext.startInternal()方法里会把上面initializers里的ServletContainerInitializer对象拿出来也就是上面的TomcatStarter对象调用它的onStartup()方法TomcatStarter又会调用它里面的几个ServletContextInitializer.onstartup(servletContext) TomcatStarter默认包含3个ServletContextInitializer我们关注的是ServletWebServerApplicationContext.selfInitialize()方法对应的匿名ServletContextInitializer代码如下 private void selfInitialize(ServletContext servletContext) throws ServletException {prepareWebApplicationContext(servletContext);registerApplicationScope(servletContext);WebApplicationContextUtils.registerEnvironmentBeans(getBeanFactory(), servletContext);for (ServletContextInitializer beans : getServletContextInitializerBeans()) {beans.onStartup(servletContext);} }核心逻辑在getServletContextInitializerBeans()里方法返回ServletContextInitializerBeans对象。 ServletContextInitializerBeans是ServletContextInitializer的集合它会把beanFactory里的ServletContextInitializer对象加进来并且还把Servlet、Fileter、Listerner等spring bean包装成RegistrationBeanRegistrationBean是ServletContextInitializer的子类也加进来。这样就得到一个ServletContextInitializer列表默认会加载的对象有 DispatcherServletRegistrationBeanCharacterEncodingFilterOrderedFormContentFilterOrderedRequestContextFilter 然后调用每个ServletContextInitializer的onStartup(servletContext)方法。 DispatcherServletRegistrationBean注册DispatcherServlet 注册DispatcherServlet要执行这两行代码 // 添加servlet servletContext.addServlet(servletName, servlet);// 添加映射关系 context.addServletMappingDecoded(urlPattern, servletName);DispatcherServletRegistrationBean里onStratup方法会调用register()方法。register()方法会做两个事情 执行addRegistration()方法会把里面的DispatcherServlet对象注册到ServletContext并返回ServletRegistration对象。 protected ServletRegistration.Dynamic addRegistration(String description, ServletContext servletContext) {String name getServletName();return servletContext.addServlet(name, this.servlet); }执行configure()方法注册url到DispatcherServlet对象的映射逻辑在registration.addMapping(urlMapping)里 // org.springframework.boot.web.servlet.ServletRegistrationBean#configure protected void configure(ServletRegistration.Dynamic registration) {// ...if (!ObjectUtils.isEmpty(urlMapping)) {registration.addMapping(urlMapping);}// ... }// org.apache.catalina.core.ApplicationServletRegistration#addMapping public SetString addMapping(String... urlPatterns) {// ...for (String urlPattern : urlPatterns) {context.addServletMappingDecoded(UDecoder.URLDecode(urlPattern, StandardCharsets.UTF_8), wrapper.getName());}return Collections.emptySet(); }到这里DispatcherServlet就成功注册到了toncat的上下文上并且和url建立了映射关系默认url是/。 总结 spring boot的基础是tomcat就要遵循tomcat的servlet规范。它通过ServletContextInitializer实现了Servlet的自动注册机制用DispatcherServlet代理所有请求内部实现了请求的路由、类型转换等。将开发者和tomcat解耦也方便框架去替换不同的web容器。
http://www.zqtcl.cn/news/164758/

相关文章:

  • 山东省住房和建设厅网站网站优化大计
  • 大良建网站织梦建设两个网站 视频
  • 用html5制作个人网站航空港建设局网站
  • 祥云平台建站网站备案通过什么可以备案
  • 免费建造网站系统php和wordpress
  • 九脉堂是做网站的网站权重不稳定
  • 网站怎么做来流量门户网站的发布特点
  • 网站设计相似侵权吗免费游戏网站建设
  • 湖北长安建设网站制作一个网站的步骤是什么
  • js网站开发成都房地产最新政策
  • 天津网站制作维护无锡网络推广外包
  • 国外中文网站排行娱乐新闻做的好的网站
  • 零食网站建设需求分析规划设计网址
  • 建立网站备案的法律依据wordpress 招商系统
  • 建设银行全球门户网站网站建设技能
  • 提供企业网站建设价格10元一年的虚拟主机
  • 塔城建设局网站电子商务网站建设方案目录
  • 网站容易被百度收录个人建购物网站怎么备案
  • 中文网站什么意思wordpress电脑访问不了
  • 杨家坪网站建设企业生产erp软件公司
  • 网站模块设计软件河北seo优化_网络建设营销_网站推广服务 - 河北邢台seo
  • 陕西正天建设有限公司网站西安专业网页制作
  • 网站建设工作室介绍范文seo网站排名的软件
  • 上海网站建设-网建知识可编辑个人简历模板
  • 北京新鸿儒做的网站shopify做国内网站
  • 网站怎样做百度推广机关门户网站建设要求
  • 好看的网站后台模板沧州网站群
  • 深圳做网站排名公司哪家好哪些网站seo做的好
  • 国内网站建设推荐网站建设合同标准版
  • 哈尔滨网站制作费用企业成品网站模板