WebX源码研读

article/2025/9/29 6:33:19
    WebX是公司应用最为广泛的web框架,目前已经开源。一直以为webX是基于spring MVC的,但其实并不是,那么不同之处到底在何处,又是为什么这样实现?看过了源码,在这里梳理下思路
    我以为,在业务层面上来讲web框架解决的核心事情是web请求处理,那么下面就从这个主线出发来看看这个框架是怎么做的:


    这是WebX官网的一张图,我们看到流程中有这么三个关键的节点:WebxFrameWorkFilter , WebxRootController以及WebxController 。然后还有两个关键词,request context 和pipeline  。下面一一从源码来看下它们分别作了什么事情,有啥功能。
1.WebxFrameWorkFilter
    注释是这样写的:“初始化spring容器的filter。”
    那么他本质上是一个servlet的filter,实现了filter接口,我们知道servlet filter 有两个主要方法,init(),doFilter(),init()来做初始化,doFilter()完成当前filter要做的主要事情,下面是doFilter源码
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {String path = getResourcePath(request);if (isExcluded(path)) {log.debug( "Excluded request: {}", path);chain.doFilter(request, response);return;} else {log.debug( "Accepted and started to process request: {}", path);}try {getWebxComponents().getWebxRootController().service(request, response, chain);} catch (IOException e) {throw e;} catch (ServletException e) {throw e;} catch (Exception e) {throw new ServletException(e);}}
    这个方法做了两件事:
    1.检查当前request的path是不是处在排除列表中,就立即放弃控制,将请求控制还给filterchain
    2. 获取已经初始化好的Webx容器,把控制权交给相应的WebxRootController的service方法。注意,webx是有个子容器的概念的,这种划分在业务复杂的时候可以保证良好的业务隔离性。
2.WebxRootController
    WebxRootController是个接口,AbstractWebxRootController对这个接口做了实现,从上面代码来看 WebxFrameWorkFilter 调用了该类的service方法来进一步处理web请求,下面是service的方法源码
 public final void service (HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws Exception {RequestContext requestContext = null;try {requestContext = assertNotNull(getRequestContext(request, response), "could not get requestContext");// 如果请求已经结束,则不执行进一步的处理。例如,当requestContext已经被重定向了,则立即结束请求的处理。if (isRequestFinished(requestContext)) {return;}// 请求未结束,则继续处理...request = requestContext.getRequest();response = requestContext.getResponse();// 如果是一个内部请求,则执行内部请求if (handleInternalRequest(request, response)) {return;}// 如果不是内部的请求,并且没有被passthru,则执行handleRequestif (isRequestPassedThru(request) || !handleRequest(requestContext)) {// 如果请求被passthru,或者handleRequest返回false(即pipeline放弃请求),// 则调用filter chain,将控制交还给servlet engine。giveUpControl(requestContext, chain);}} catch (Throwable e) {handleException(requestContext, e);} finally {commitRequest(requestContext);}}
    service方法首先会获取当前请求的RequestContext。RequestContext是webX一个比较独特的实现,它封装了HttpServletRequest,HttpServletResponse,以及ServletContext。可以说囊括了当前Http请求的各种状态。
    getRequestContext()方法实现了requestContext获取过程,具体来讲,就是如果发现request attributes 里有没有以key为"_outer_webx3_request_context_" 存储的requestContext对象,如果有就拿过来,没有则创建一个SimpleRequestContext并将其置入request attributes
    获取到requestContext后,如果不是内部请求或者不需要进一步处理的请求,接下来就走到handleRequest方法,这个方法默认实现如下:
 @Overrideprotected boolean handleRequest (RequestContext requestContext) throws Exception {HttpServletRequest request = requestContext.getRequest();// Servlet mapping有两种匹配方式:前缀匹配和后缀匹配。// 对于前缀匹配,例如:/servlet/aaa/bbb,servlet path为/servlet,path info为/aaa/bbb// 对于前缀匹配,当mapping pattern为/*时,/aaa/bbb,servlet path为"",path info为/aaa/bbb// 对于后缀匹配,例如:/aaa/bbb.html,servlet path为/aaa/bbb.html,path info为null//// 对于前缀匹配,取其pathInfo;对于后缀匹配,取其servletPath。String path = ServletUtil. getResourcePath(request);// 再根据path查找componentWebxComponent component = getComponents().findMatchedComponent(path);boolean served = false;if (component != null) {try {WebxUtil. setCurrentComponent(request, component);served = component.getWebxController().service(requestContext);} finally {WebxUtil. setCurrentComponent(request, null);}}return served;}
    可以看到,根据path路由到了对应的子容器,并触发WebxController的service方法
3.WebxController
    直接来看service方法
 public boolean service(RequestContext requestContext) throws Exception {PipelineInvocationHandle handle = pipeline.newInvocation();handle.invoke ();// 假如pipeline被中断,则视作请求未被处理。filter将转入chain中继续处理请求。return !handle.isBroken();}
 
    这里看到最终是执行到pipeline。pipeLine是一组顺序执行操作的抽象接口,这里应该是借鉴了tomcat 和struts的实现方法,是一种典型的责任链设计模式。pipline包含了一个valve的概念,valve在源代码里注释说是“如同真实世界的水管中的阀门,可以控制液体流向,也可以控制pipline里后续valves的执行
    代码中PipelineInvocationHandle 实际上保存了当前pipline的状态,触发的invoke方法实际上是pipleImpl里的invokeNext(),这个方法最终触发不同的valve调用invoke()方法,可见,valve是webx整个流程的金字塔底部,处理不同请求的worker。valve的各种实现包括渲染页面、登陆认证、异常处理等等,构建了webx处理请求的基石。
 
    通过上述分析,总体感觉WebX对模块化执行的比较彻底,甚至可以允许产生不同的子容器,每个子容器有不同的配置。requestContext介绍说是对request、response和servletContext进行了封装,但是从上面的请求过程来看,只是对request进行了包装(或者其他地方我还没看到)。pipline是一个很经典的设计,让整个web请求处理过程更加内聚化,流程也比较清晰。但是同时也可能让这个流程比较重。
    相信webx这些实践是公司网站发展过程中解决所遇到问题的一个框架上的反映。换句话说,按照公司目前的网站规模与稳定性要求,它应该比较适合于大型网站,因为整个框架还是显得比较重的。
 

http://chatgpt.dhexx.cn/article/trBIpQrC.shtml

相关文章

WebX框架使用说明

前言 标准MVC开源框架有很多(Struts、SpringMVC、Webx),对于生活在开源世界里面的码农来说SpringMVC、Struts是接触比较多,也是最熟悉的框架。 知己知彼 以配置SpringMVC为例,我们常常关注的点主要有以下几个方面&a…

webx学习总结

webx学习总结 一 Webx的概括 WEBX是阿里巴巴的部框架,“就是把页面与Service之间的一些Servlet等公共的东西抽象出,提供相的服务以提高发效率(《接口之Webx介》—何晓峰 )”,可以看出,webx和统的servlet-ac…

Webx MVC分析

Webx框架&#xff1a;http://openwebx.org/ petstore:webx3/webx-sample/petstore/tags/3.0/petstore 编译之后&#xff1a;mvn jetty:run即可, 访问&#xff1a; http://localhost:8081/ Webx MVC(以webx3为基础) 1、webx3的入口点 <filter> <filter-name>…

Webx MVC

首先在Webx中&#xff0c;使用WebxContextLoaderListener替代Spring的ContextLoaderListener&#xff1a; <listener><listener-class>com.alibaba.citrus.webx.context.WebxContextLoaderListener</listener-class></listener><filter><filt…

Webx学习

六月中就要去阿里巴巴实习了,部门使用的web框架是Webx,喜大普奔的发现Webx是开源的,所以认真学习一下。主要参考指导手册 Webx总体介绍 设计理念 这里有许多框架设计的真知灼见! 一个框架的好坏,往往并不是由他所实现的具体功能好坏所决定的,而是由其所使用的基础框架…

webx mysql_idea使用Maven启动maven项目、 webx框架项目

一、打开 二、点击号选择maven 三、 (1)、Working directory : 选择项目路径 (2)、Command line: clean jetty:run-war -Djetty.port8086 -Dautoconfig.charsetUTF-8 -Dmaven.test.skip (3)、VM Options: -server -XX:PermSize256M -XX:MaxPermSize512M (4)、点击Environment V…

webx mysql_Webx项目的获取与验证

在JavaWeb环境配置后就可进行Webx实例项目的获取与研读了。 1.创建一个初始的Demo工程。 1)下载 Webx Maven 项目的目录结构Artifact插件。 2) 创建WebxDemo项目 打开命令行工具(Windows cmd或Unix/Linux bash)&#xff0c;输入如下命令&#xff1a; mvn archetype:generate -D…

Webx框架

Webx是一个框架&#xff0c;它可用来做下面的事情&#xff1a; 创建一个全功能的Web应用 Webx提供了创建一个Web应用所需要的所有必要功能. 创建一个新的Web框架 Webx允许你定制、甚至重写大部分的Webx框架逻辑&#xff0c;从而实现全新的功能&#xff0c;或者和其它应用框…

Webx简介(转)

经常会到博客来看看大家的一些文章&#xff0c;都写的相当精彩&#xff0c;有水平&#xff0c;感觉大家好像都写了&#xff0c;自己没什么写的&#xff0c;后来跟师傅婉佩沟通&#xff0c;才了解到这样想是错的&#xff0c;每个人针对每个东西可能想法观点都不同&#xff0c;写…

WebX入门指南

[说明] 本文围绕WebX的Web框架展开&#xff0c;试图将整个开发中使用的软件栈或者说生态系统串联起来。本文中不讲解原理性的东西&#xff0c;只是讲解各种场景下如何使用WebX相关的技术。入门指南中涉及到的实践指南和原理指南&#xff0c;不会展开&#xff0c;在后续博文中&a…

WebX框架解析及使用教程

WebX框架是阿里巴巴集团开发的&#xff0c;它建立在SpringEx的基础上&#xff0c;具有超强的扩展能力。 一、Webx的层次结构&#xff08;从里到外&#xff09; &#xff08;1&#xff09;SpringExt&#xff1a;基于Spring&#xff0c;提供扩展组件的能力 &#xff08;2&#xf…

VSCode中Emmet使用

文章目录 HTML部分1. 添加类&#xff0c;id&#xff0c;文本和属性2. 嵌套和分组3. 隐式标签4. 定义多个元素* 和 编号$5. 添加虚拟文字6. 其它 CSS部分1. 属性和属性值的缩写2. 属性值的单位其它 HTML部分 1. 添加类&#xff0c;id&#xff0c;文本和属性 div.box#box > …

linux vim emmet,emmet-vim

最近啊&#xff0c;我投奔了网页的开发&#xff0c;看了一本《head first HTML and CSS》的书&#xff0c;感觉非常不错&#xff0c;然后又配置了一些vim里面用到的插件&#xff0c;现在我把学习到的东西记录下来&#xff01; 首先&#xff0c;我不会在这里写emmet 的具体操作方…

Emmet 语法

Emmet语法前身是Zen coding&#xff0c;来提高html和css的编写速度&#xff0c;vscode内部已经集成该语法了 1、快速生成html结构语法 生成标签&#xff1a; 直接输入标签名&#xff0c;再按TAB键&#xff0c;such as 你打个 div 再按tab&#xff0c;就会直接生成 (这里打不出…

emmet写法

1.写一个递增的img路径 img[srcimage/com/$$.png]*10 效果

6.Emmet 语法与快速格式化代码

Emmet语法可以让我们在写网页的时候速度更快&#xff0c;我当前写网页的工具是pycharm&#xff0c;在pycharm中使用Emmet&#xff0c;我们需要点击File,然后点击Setting 搜索emmet&#xff0c;保证这里是勾选状态 安装后如果不进行其他设置&#xff0c;emmet自动被勾选 目录 …

Emmet语法总结

1 Emmet简介 Emmet是一个Web开发工具&#xff0c;用于加快HTML和CSS代码的编写速度。使用Emmet能够通过简短的表达式生成HTML或CSS代码片段。另外&#xff0c;截至2022年&#xff0c;主流的编辑器工具如Visual Studio Code、WebStorm都已经集成了Emmet工具&#xff0c;无需手动…

Linux 配置全面讲解(安装JDK、Mysql、Nginx)

1 Linux概述 1.1 Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思…

【JAVA秒会技术之ConcurrentHashMap】JDK1.7与JDK1.8源码区别

前言 以前写过介绍HashMap的文章&#xff0c;文中提到过HashMap在put的时候&#xff0c;插入的元素超过了容量&#xff08;由负载因子决定&#xff09;的范围就会触发扩容操作&#xff0c;就是rehash&#xff0c;这个会重新将原数组的内容重新hash到新的扩容数组中&#xff0c;…

安装笔记--eclipse+jdk+neo4j安装与配置

1.eclipse安装2.JDK安装3.环境变量配置4.在eclipse中创建与导入项目4-1 eclipse导入项目 5.neo4j配置 1.eclipse安装 第一步&#xff1a;下载eclipse&#xff0c;并安装。 下载链接: http://www.eclipse.org/downloads/. 点击 Download Packages; 如图&#xff1a;根据自己的…