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

消防中队网站建设鸿星尔克的网络营销策略

消防中队网站建设,鸿星尔克的网络营销策略,网站后台登录密码修改,免费引流推广文章目录 前言正文一、设计原理1.1 servlet生命周期简述1.2 设计原理小结 二、启动原理2.1 AbstractHandlerMethodMapping 初始化 --RequestMapping注解解析2.2 DispatcherServlet 的初始化2.3 DispatcherServlet#initHandlerMappings(...) 初始化示例说明 三、工作原理 前言 … 文章目录 前言正文一、设计原理1.1 servlet生命周期简述1.2 设计原理小结 二、启动原理2.1 AbstractHandlerMethodMapping 初始化 --RequestMapping注解解析2.2 DispatcherServlet 的初始化2.3 DispatcherServlet#initHandlerMappings(...) 初始化示例说明 三、工作原理 前言 本系列文章基本环境如下 java8springboot2.7 创建项目使用阿里的源https://start.aliyun.com 创建前请先设置好自己的maven环境java版本。保持网络正常。 选择spring-web的2.7.6 版本 使用阿里的源创建好项目后会自动生成的有控制器Controller启动类以及一个页面。 如此准备工作就做好了。 正文 在Java还没有SpringMvc时使用的是servlet jsp 的方式对外提供接口以及和页面进行数据交互等操作。 但是这种操作毕竟还是不方便功能也不够强大。 曾经的写法需要配置xml文件如果页面够多光配置就是一大堆。 发展到后来servlet3.0的时候出现了完全注解版的写法。 关于servlet的描述这里不做过多解释本文将对对springmvc中使用到的servlet特征进行阐述继而分析它的设计原理springmvc启动原理以及工作原理 等到在Spring框架中的时候就已经是DispatcherServlet了。 而它本身就是一个servlet其类关系图如下 一、设计原理 1.1 servlet生命周期简述 Servlet生命周期分为三个阶段 初始化阶段调用init()方法实现初始化工作。运行阶段处理请求容器创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象并将它们作为参数传递给Servlet的service()方法。销毁阶段Servlet将被销毁生命周期结束。 Servlet本身只是一个接口在HttpServlet实现类中对service()方法进行了实现。 而这里的实现是套用了模版方法设计模式将service的职责拆分了按照请求方法的类型不同划分。 比如如果请求方法是 GET请求则会执行到 HttpServlet的 doGet方法如果是POST请求则会执行到 HttpServlet的 doPost方法。 FrameworkServlet 又对HttpServlet中的service方法进行了重写 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpMethod httpMethod HttpMethod.resolve(request.getMethod());if (httpMethod ! HttpMethod.PATCH httpMethod ! null) {super.service(request, response);} else {this.processRequest(request, response);}}这里判断了请求方法默认执行 HttpServlet的 service方法。 但是实际调用的是 doGetdoPost这类方法。而同时这类方法也被FrameworkServlet重写了 也就是说servlet 会触发执行到 FrameworkServlet 的 processRequest 方法。如下图所示 这里会执行FrameworkServlet 的 doService方法。而这是一个抽象方法。其子类DispatcherServlet 对其进行了实现。如此便贯通了。 1.2 设计原理小结 在1.1小节中的分析中Servlet继承实现的关系如下 也就是说在servlet处理请求时对于springmvc而言就是执行 doService方法。 二、启动原理 这一小节主要分析SpringBoot项目启动时对SpringMvc部分的处理。 2.1 AbstractHandlerMethodMapping 初始化 --RequestMapping注解解析 谈起SpringMvc最先想起来的俩注解应该是 Controller 和 RequestMapping。 而关于启动项目时框架对这俩注解的处理基本都体现在AbstractHandlerMethodMapping中。 public abstract class AbstractHandlerMethodMappingT extends AbstractHandlerMapping implements InitializingBean {// ...省略其他方法public void afterPropertiesSet() {this.initHandlerMethods();} }首先AbstractHandlerMethodMapping是个抽象类它的子类会放到Spring容器中。 而在它的子类 RequestMappingHandlerMapping 中对初始化方法进行了重写具体内容如下 public void afterPropertiesSet() {this.config new RequestMappingInfo.BuilderConfiguration();this.config.setTrailingSlashMatch(this.useTrailingSlashMatch());this.config.setContentNegotiationManager(this.getContentNegotiationManager());if (this.getPatternParser() ! null) {this.config.setPatternParser(this.getPatternParser());Assert.isTrue(!this.useSuffixPatternMatch !this.useRegisteredSuffixPatternMatch, Suffix pattern matching not supported with PathPatternParser.);} else {this.config.setSuffixPatternMatch(this.useSuffixPatternMatch());this.config.setRegisteredSuffixPatternMatch(this.useRegisteredSuffixPatternMatch());this.config.setPathMatcher(this.getPathMatcher());}super.afterPropertiesSet(); }在设置了一堆配置之后最终调用的还是 AbstractHandlerMethodMapping 的initHandlerMethods 方法。 protected void initHandlerMethods() {// 获取spring容器中的beanNameString[] var1 this.getCandidateBeanNames();int var2 var1.length;for(int var3 0; var3 var2; var3) {String beanName var1[var3];if (!beanName.startsWith(scopedTarget.)) {// 通过beanName映射出methodHandlerthis.processCandidateBean(beanName);}}// 初始化handlerMethodsthis.handlerMethodsInitialized(this.getHandlerMethods());}protected void processCandidateBean(String beanName) {Class? beanType null;try {// 通过beanName获取当前的类型beanType this.obtainApplicationContext().getType(beanName);} catch (Throwable var4) {if (this.logger.isTraceEnabled()) {this.logger.trace(Could not resolve type for bean beanName , var4);}}// 当前beanName对应的类定义不为空并且带有Controller 或 RequestMapping注解时对其进行处理if (beanType ! null this.isHandler(beanType)) {this.detectHandlerMethods(beanName);}}可以看到最终处理控制器时是调用了detectHandlerMethods 方法。具体内容如下 protected void detectHandlerMethods(Object handler) {// 通过beanName获取到对应的类型Class? handlerType handler instanceof String ? this.obtainApplicationContext().getType((String)handler) : handler.getClass();if (handlerType ! null) {// 获取你自己定义的控制器类型Class? userType ClassUtils.getUserClass(handlerType);// 将类中符合条件标注了RequestMapping注解的 method 映射为 RequestMappingInfo 对象并放入map中这一步的实现在其子类中。并且聚合它们的请求路径。MapMethod, T methods MethodIntrospector.selectMethods(userType, (method) - {try {return this.getMappingForMethod(method, userType);} catch (Throwable var4) {throw new IllegalStateException(Invalid mapping on handler class [ userType.getName() ]: method, var4);}});// 记录日志if (this.logger.isTraceEnabled()) {this.logger.trace(this.formatMappings(userType, methods));} else if (this.mappingsLogger.isDebugEnabled()) {this.mappingsLogger.debug(this.formatMappings(userType, methods));}// 方法注册methods.forEach((method, mapping) - {Method invocableMethod AopUtils.selectInvocableMethod(method, userType);this.registerHandlerMethod(handler, invocableMethod, mapping);});}}这里对方法的处理分了两步第一步根据类型简单处理注解主要是聚合了请求路径。聚合后的结果如下 可以看到这里的路径属性已经有值了。 然后就是注册方法了。 而真正注册的方法registerHandlerMethod 是在其子类中实现的。具体内容如下 在其父级的实现中注册的结果如下 最后简单处理RequestBody注解如果使用了该注解参数必填。 2.2 DispatcherServlet 的初始化 框架中定义了自动配置类 DispatcherServletAutoConfiguration。其有个内部类 DispatcherServletConfiguration 对 DispatcherServlet 进行了配置。具体如下 Conditional({DefaultDispatcherServletCondition.class}) ConditionalOnClass({ServletRegistration.class}) EnableConfigurationProperties({WebMvcProperties.class}) protected static class DispatcherServletConfiguration {protected DispatcherServletConfiguration() {}Bean(name {dispatcherServlet})public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) {DispatcherServlet dispatcherServlet new DispatcherServlet();dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails());return dispatcherServlet;}BeanConditionalOnBean({MultipartResolver.class})ConditionalOnMissingBean(name {multipartResolver})public MultipartResolver multipartResolver(MultipartResolver resolver) {return resolver;} }在第一节设计原理的时候提到过DispatcherServlet 也是一个servlet 。那么它的初始化也就包含在servlet的生命周期中。 在servlet生命周期中有 init 方法进行初始化。FrameworkServlet 有一个父类HttpServletBean其中定义了初始化方法。虽然不是原生的servlet 初始化方法但是也是会间接调用到的通过模版方法设计模式由子类代为实现 public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware 在FrameworkServlet 触发初始化时会执行到 initServletBean 方法。其中有两个比较关键初始化方法具体如下 篇幅原因这里只拿出关键代码。initWebApplicationContext()内有这样一段在处理请求时会执行到 if (!this.refreshEventReceived) {synchronized(this.onRefreshMonitor) {this.onRefresh(wac);} }而 onRefresh 由子类DispatcherServlet 重写后就成了这样 protected void onRefresh(ApplicationContext context) {this.initStrategies(context); }protected void initStrategies(ApplicationContext context) {// 初始化上传文件解析器initMultipartResolver(context);// 初始化本地解析器initLocaleResolver(context);// 主题处理器initThemeResolver(context);// 映射处理器initHandlerMappings(context);// 处理适配器initHandlerAdapters(context);// 异常处理器initHandlerExceptionResolvers(context);// 请求到视图名的翻译器initRequestToViewNameTranslator(context);// 视图解析器initViewResolvers(context);// 初始化FlashManagerinitFlashMapManager(context); }如果大家想看看这里执行的内容以及初始化后的结果可以自行打断点查看。这里因为东西较多我就不截图了。 PS: 下一小节以 HandlerMappings 为例进行说明 2.3 DispatcherServlet#initHandlerMappings(…) 初始化示例说明 private void initHandlerMappings(ApplicationContext context) {this.handlerMappings null;if (this.detectAllHandlerMappings) {// 获取所有的handlerMappingMapString, HandlerMapping matchingBeans BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);// 对handlerMapping进行排序if (!matchingBeans.isEmpty()) {this.handlerMappings new ArrayList(matchingBeans.values());AnnotationAwareOrderComparator.sort(this.handlerMappings);}} else {try {// 获取名字是 handlerMapping 的handlerMappingHandlerMapping hm (HandlerMapping)context.getBean(handlerMapping, HandlerMapping.class);this.handlerMappings Collections.singletonList(hm);} catch (NoSuchBeanDefinitionException var4) {}}// handlerMappings为空需要设置默认的handlerMappingif (this.handlerMappings null) {this.handlerMappings this.getDefaultStrategies(context, HandlerMapping.class);if (this.logger.isTraceEnabled()) {this.logger.trace(No HandlerMappings declared for servlet this.getServletName() : using default strategies from DispatcherServlet.properties);}}Iterator var6 this.handlerMappings.iterator();while(var6.hasNext()) {HandlerMapping mapping (HandlerMapping)var6.next();if (mapping.usesPathPatterns()) {this.parseRequestPath true;break;}} }默认情况下如果配置了使用全部会有以下handlerMapping 另外补充一句如果使用默认的handlerMapping需要配置DispatcherServlet.properties。 三、工作原理 这一小节以DispatcherServlet 为起点分析SpringMvc的工作原理。 // todo 待完善–预计2024春节后补充春节期间玩去了。
http://www.zqtcl.cn/news/101504/

相关文章:

  • 山东网站建设公司电话全球建筑设计网站
  • wordpress 站点描述国外优秀网页设计赏析
  • php红酒网站建设软件开发外包项目合作
  • 做网站的都改行做什么了上海推牛网络科技有限公司
  • 在哪里建设网站dedecms做网站注意事项
  • 垂直类网站怎么做推广互联网站的建设维护营销
  • 手机网站大全排行江西省赣州市邮政编码
  • 集团网站建设建站模板seo优化工具软件
  • 大连项目备案网站网站建设一下需要多少费用
  • 松溪网站建设做网站外包
  • sdcms网站建设模板WordPress自定义连接菜单
  • 做设计常用的素材网站外贸平台销售
  • 建网站一般最低多少钱地方门户模板
  • 网站开发虚拟主机管理系统星巴克网络营销方式
  • phpnow 搭建网站网站建设一般怎么付款
  • 网站开发三剑客湖州市南浔区建设局网站
  • 江西专业的企业网站建设公司长沙做网站找哪家好
  • 国外互联网资讯网站南宁专业网站建设公司
  • 苏州新区做网站公司pc网站建设费用
  • 做影视网站需要多少钱2003网站建设
  • 河南智能网站建设哪家好重庆在建工程项目
  • 爱站网站长工具网站查看空间商
  • 网站营销活动页面制作wordpress 只显示一个主题
  • 电子网站建设怎么做秦皇岛网站制作公司
  • 网站建站模板样例平台推广怎么做
  • 网站建设首选亿企联盟做网站宣传有用吗
  • 网站建设公司行业苏州高端网站建设咨询
  • 电商平台网站开发过程江苏省建设科技发展中心网站简介
  • 空间租用 网站开发重庆手机网站推广资料
  • 新余 网站建设网站建设行业新闻