栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ServletContainer源码分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ServletContainer源码分析

代码流程分析 这个 类和 springmvc差不多 解析类上的 Path注解和方法上的Path 就像mvc 解析RequestMapping 一样
这个 类和 springmvc差不多
解析类上的 Path注解和方法上的Path
就像mvc 解析RequestMapping 一样

ServletContainer解析类,拦截对应的路径,找到对应的方法 ,执行方法,返回结果

类分析

体系结构
ServletContainer extends HttpServlet implements Filter
方法
构造方法--app构建保存了 一些class对象
public ServletContainer() {
	this.app = null;
}
//这里传入的类 会在初始化的时候解析
public ServletContainer(Class appClass) {
	this.app = new DeferredResourceConfig(appClass);
}

public ServletContainer(Application app) {
	this.app = app;
}

初始化 解析构造函数传入的类

过滤器初始化
Filter.init(FilterConfig filterConfig)   filterConfig==ApplicationFilterConfig
	this.filterConfig = filterConfig;
	init(new WebFilterConfig(filterConfig));
		webComponent = (app == null) ? new InternalWebComponent() : new InternalWebComponent(app);
        webComponent.init(webConfig); 为WebComponent.init
			config = webConfig;
			load();
				WebApplication _application = create(); 最后得到 WebApplicationImpl
				configure(config, resourceConfig, _application); 配置资源
				initiate(resourceConfig, _application); 定制自己的web
					ServletContainer.this.initiate(rc, wa);
						 wa.initiate(rc);
							initiate(resourceConfig, null);
							\\\\\\\\\\\\
								 Errors.processWithErrors(new Errors.Closure() {
															@Override
															public Void f() {
																Errors.setReportMissingDependentFieldOrMethod(false);
																_initiate(rc, _provider);
																return null;
															}
														});
							\\\\\\\\\\\ 调用 processWithErrors 在调用上面的f()方法 到 _initiate(rc, _provider);
								  _initiate(rc, _provider); 执行的是 WebApplicationImpl._initiate(final ResourceConfig rc, final IoCComponentProviderFactory _provider)
										执行了一大堆看不懂的东西后到达这
										    createAbstractResourceModelStructures();
													for (final Class c : resourceConfig.getRootResourceClasses()) {
														rootARs.add(getAbstractResource(c));
														=======================
														getAbstractResource(c)
															ar = IntrospectionModeller.createResource(c);解析类 就像解析 mvc一样
																final Class annotatedResourceClass = getAnnotatedResourceClass(resourceClass);
																final Path rPathAnnotation = annotatedResourceClass.getAnnotation(Path.class);找类上有没有 Path注解
																resource = new AbstractResource(resourceClass);生成资源类
																final MethodList methodList = new MethodList(resourceClass);
                                                                workOutSetterMethodsList(resource, methodList, isEncodedAnotOnClass);解析方法 
																--------------------解析方法注解
																	for (AnnotatedMethod m : methodList.
																			hasNotMetaAnnotation(HttpMethod.class).              -------HttpMethod
																			hasNotAnnotation(Path.class).						-------Path
																			hasNumParams(1).
																			hasReturnType(void.class).
																			nameStartsWith("set")) {

																		final AbstractSetterMethod asm = new AbstractSetterMethod(resource, m.getMethod(), m.getAnnotations());
																		Parameter p = createParameter(
																				resource.getResourceClass(),
																				m.getMethod().getDeclaringClass(),
																				isEncoded,
																				m.getParameterTypes()[0],
																				m.getGenericParameterTypes()[0],
																				m.getAnnotations());
																		if (null != p) {
																			asm.getParameters().add(p);
																			resource.getSetterMethods().add(asm);把方法的解析结果也放到类的解析的结果里面
																		}
																	}
																------------------
																return resource
															abstractResourceMap.put(c, ar);添加进来保存着
														========================
													}
											RulesMap rootRules = new RootResourceUriRules(this, resourceConfig, wadlFactory, injectableFactory).getRules(); 把上面的数据取出来
											this.rootsRule = new RootResourceClassesRule(rootRules);  下面用到
										          this.rules = UriRulesFactory.create(rulesMap);存起来
									
								  
								  
				application = _application;

拦截对应的端口 执行方法

过滤器执行
ApplicationFilterChain 创建  ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);
	for (int i = 0; i < filterMaps.length; i++) { filterMaps 保存过滤器名字的与过滤路径大的关系
            if (!matchDispatcher(filterMaps[i] ,dispatcher)) {
                continue;
            }
            if (!matchFiltersURL(filterMaps[i], requestPath)) 过滤路径
                continue;
            ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) context.findFilterConfig(filterMaps[i].getFilterName());
            if (filterConfig == null) {
                // FIXME - log configuration problem
                continue;
            }
            filterChain.addFilter(filterConfig);
	}

执行过滤器
filterChain.doFilter(request.getRequest(), response.getResponse());
最后到
	ServletContainer.doFilter(request.getRequest(), response.getResponse());
	    一直doFilter 最后到 这
		final int status = service(baseUri, requestUri, request, response);最后执行方法
			return webComponent.service(baseUri, requestUri, request, response);上面初始化 的 InternalWebComponent(app)
				final WebApplication _application = application; 上面初始化的 application WebApplicationImpl
				_application.handleRequest(cRequest, w); 
					handleRequest(request, response);
						final WebApplicationContext localContext = new WebApplicationContext(this, request, response);       this=WebApplicationImpl
						_handleRequest(localContext, request, response);
							_handleRequest(localContext, request);
								rootsRule.accept(path, null, localContext) --保存了所有接口配置类
									    final Iterator matches = rules.match(path, context);从这些个类里面得到 路径匹配的类
										while(matches.hasNext()) {if(matches.next().accept(path, resource, context)) return true;} 执行他
											return rule.accept(rhpath, resource, context); 这个rule里面保存了 是那个类来处理   ResourceClassRule
												resource = context.getResource(resourceClass);实例化出来
												final Iterator matches = context.getRules(resourceClass).match(path, context);找到是那个方法
								                matches.next().accept(path, resource, context) 
													 return rule.accept(rhpath, resource, context);    
													        当执行的方法返回值不是 Response 执行代码rule=SubLocatorRule
															===========================================================================
															Object subResource = invokeSubLocator(resource, context);调用方法
																	return dispatch(resource, context);
																		return m.invoke(resource, params);jdk反射调用
																		
															//开始执行业务方法了 真正的结果
															final Iterator matches = context.getRules(subResource.getClass()).match(path, context);
															----
															while(matches.hasNext())
																if(matches.next().accept(path, subResource, context))
																	return true;
															----
															matches.next().accept(path, subResource, context) 去执行 业务方法
																	method.getDispatcher().dispatch(resource, context);   ===ResourceJavaMethodDispatcher.dispatch
																		_dispatch(resource, context);  ===ResourceJavaMethodDispatcher._dispatch
																			final Response r = (Response)invoker.invoke(method, resource, params);
																				 return m.invoke(o, parameters); ;jdk反射调用
																			context.getResponse().setResponse(r);
														    ==============================================================================
															当执行的方法返回值是 Response 执行代码rule=HttpMethodRule
															===========================================================================
															method.getDispatcher().dispatch(resource, context); ===ResourceJavaMethodDispatcher.dispatch
																		_dispatch(resource, context);  ===ResourceJavaMethodDispatcher._dispatch
																			final Response r = (Response)invoker.invoke(method, resource, params);
																				 return m.invoke(o, parameters); ;jdk反射调用
																			context.getResponse().setResponse(r);
															===========================================================================
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035310.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号