`
JokerT
  • 浏览: 22970 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

WebX源码研读

    博客分类:
  • Java
阅读更多
    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,则执行handleRequest
            if (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方法,这个方法默认实现如下:
 @Override
    protected 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查找component
        WebxComponent 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这些实践是公司网站发展过程中解决所遇到问题的一个框架上的反映。换句话说,按照公司目前的网站规模与稳定性要求,它应该比较适合于大型网站,因为整个框架还是显得比较重的。
 
  • 大小: 75.9 KB
分享到:
评论

相关推荐

    webx总结

    虽然描述信息为空,但我们可以从“博文链接”中推测,该文档可能包含了一篇关于Webx框架的博主个人经验总结,可能涉及了Webx的实际应用案例、源码解析和使用技巧。通过阅读博主的文章,读者可以了解到Webx在实际项目...

    webx

    WebX 是一个开源的、基于Java的企业级Web应用框架,主要设计用于构建企业信息系统和B/S架构的应用。这个框架提供了一整套开发工具和技术支持,包括数据库操作、表单处理、权限控制、模板引擎等功能,旨在提高开发...

    webx框架指南

    Webx是一个由阿里巴巴开源的Java企业级应用开发框架,它是Spring框架的一种扩展和深化。Webx的设计理念建立在层次化架构之上,提倡页面驱动、约定优于配置等设计原则。它的出现为Java开发者提供了一个可以替代传统...

    webx3文档——web开发

    Webx是基于Java的Web应用框架,它具有高成熟度和可靠性,并且具备强大的开放性和扩展性。Webx框架的文档详细介绍了该框架的设计理念、历史、优势以及与Spring框架的集成等方面。文档内容主要分为两大部分:Webx框架...

    webx总结 项目实践总结

    在本文中,我们将深入探讨WebX项目实践总结,包括WebX的启动顺序、WebX的使用技巧以及WebX中的表单提交机制。 **一、WebX启动顺序** WebX的启动过程涉及多个阶段,理解这一过程对于调试和优化应用至关重要。首先,...

    WebX入门指南示例程序

    安装WebX通常涉及下载源码或发布版,然后配置项目环境,包括JDK、Tomcat或Jetty等Web服务器、数据库驱动等。在配置完成后,可以通过简单的启动脚本来运行示例程序。 3. **项目结构**: WebX项目的典型结构包括src...

    Webx及框架简介

    【Webx及框架简介】 Webx是一个开源的Java Web应用程序框架,它旨在简化Web开发,提供一种高效且灵活的方式来构建动态、数据驱动的Web应用。Webx的核心设计理念是将业务逻辑、数据访问和用户界面紧密地集成在一起,...

    淘宝WEBX框架详解

    **淘宝WEBX框架详解** 淘宝WEBX框架是一个专为大型电子商务平台设计的高效、可扩展的Web应用程序开发框架。这个框架由阿里巴巴技术部门研发,旨在提高开发效率,保证系统的稳定性和可维护性,同时降低新手入门的...

    webx_guide

    Webx是一个轻量级的Java Web框架,它是一个开源项目,旨在提供快速且高效的方式来开发Web应用程序。Webx框架指南是一本由Michael Zhou撰写的手册,详细介绍了Webx框架的使用方法和设计理念。 在讨论Webx框架之前,...

    Webx介绍_PDF

    ### Webx3.0框架概览 #### 一、引言 随着互联网技术的飞速发展,企业级应用的需求越来越复杂多样。为了更好地满足这些需求,阿里巴巴集团旗下的淘宝团队开源了Webx3.0框架。这是一个面向Web开发的Java框架,它在...

    webx2.7绿色安装

    WEBX是阿里巴巴的内部框架,“就是把页面与Service层之间的一些Servlet等公共的东西抽象出来,提供相应的服务以提高开发效率(《接口测试之Webx简介》—何晓峰 )”,可以看出,webx和传统的servlet-action模式的...

    创建简单的WEBX应用

    llerServlet 是 Webx 框架的核心组件,它负责处理所有以 .htm 和 .do 结尾的请求。...对于初学者来说,理解 Webx 的核心概念,如 ControllerServlet 和服务配置,是进一步学习和使用 Webx 的关键。

    Webx3.0小结

    webx3.0学习小结

    webx-springExt整合eclipse插件

    Webx-SpringExt是Webx框架的一个扩展,它与Spring框架进行了深度集成,旨在提供更高效、更灵活的Web应用程序开发环境。Eclipse是一个广泛使用的Java集成开发环境(IDE),而这里的"webx-springExt整合eclipse插件"是...

    阿里巴巴J2EE Webx框架简介

    阿里巴巴的J2EE Webx框架是一个企业级的Java应用程序框架,专为构建高效、可扩展且易于维护的Web应用程序而设计。Webx框架的核心理念是模块化,这使得开发过程更加灵活,允许开发者将应用程序的不同部分(如业务逻辑...

    webx3学习的demo,以及留言板的小例子

    WebX3是一个强大的开源Web应用程序框架,主要用于构建企业级的Web应用系统。它以其灵活性、高效性和可扩展性而受到开发者的青睐。本压缩包包含了WebX3学习的示例和一个简单的留言板应用,这对于初学者理解WebX3的...

    通用WEB框架 Webx.zip

    【通用WEB框架 Webx】 Webx是一个基于Java Servlet API构建的通用WEB框架,它为开发者提供了构建高效、可扩展的Web应用程序的工具和方法。Webx的核心理念是简化Web应用开发,通过提供丰富的组件和模式,让开发者...

Global site tag (gtag.js) - Google Analytics