`

webwork源码分析(一)FilterDispatcher和DispatcherUtils

    博客分类:
  • Java
阅读更多

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        String param = filterConfig.getInitParameter("packages");
        String packages = "com.opensymphony.webwork.static template com.opensymphony.webwork.interceptor.debugging";
        if (param != null) {
            packages = param + " " + packages;
        }
        this.pathPrefixes = parse(packages);
        DispatcherUtils.initialize(filterConfig.getServletContext());
    }

ps:

DispatcherUtils进行了初始化,参数为servletcontext,采用 单例模式。

初始化方法中对packages进行了parse,目前我还不知道在哪需要用到

DispatcherUtils.initialize(filterConfig.getServletContext());


方法中进行了xwork的一些处理 text的loacl处理  ObjectFactory的初始化处理

webwork 的Configuration 的处理

总而言之,这一句简简单单的initialize方法,让我们根据web.xml中得到的基本信息中初始化了

application级别的相关东西,xwork所需要的全局的东西也得到初始化,webwork 下的config目录也发挥了他的作用

 

接下来,我们看看dofilter 这个起核心作用的方法

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {


        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        ServletContext servletContext = filterConfig.getServletContext();

        // prepare the request no matter what - this ensures that the proper character encoding
        // is used before invoking the mapper (see WW-9127)


        DispatcherUtils du = DispatcherUtils.getInstance();


        du.prepare(request, response);//正如这个方法名字一样进行locale、encoding以及特殊request parameters设置


        try {
         // Wrap request first, just in case it is multipart/form-data
         // parameters might not be accessible through before encoding (ww-1278)
            request = du.wrapRequest(request, servletContext);//对request进行包装
        } catch (IOException e) {
            String message = "Could not wrap servlet request with MultipartRequestWrapper!";
            LOG.error(message, e);
            throw new ServletException(message, e);
        }
       

        ActionMapperIF mapper = ActionMapperFactory.getMapper();//得到action的mapper
        ActionMapping mapping = mapper.getMapping(request);// 得到action 的 mapping

        if (mapping == null) {
            // there is no action in this request, should we look for a static resource?
            String resourcePath = RequestUtils.getServletPath(request);

            if ("".equals(resourcePath) && null != request.getPathInfo()) {
                resourcePath = request.getPathInfo();
            }

            if ("true".equals(Configuration.get(WebWorkConstants.WEBWORK_SERVE_STATIC_CONTENT))
                    && resourcePath.startsWith("/webwork")) {
                String name = resourcePath.substring("/webwork".length());
                findStaticResource(name, response);
            } else {
                // this is a normal request, let it pass through
                chain.doFilter(request, response);
            }
            // WW did its job here
            return;
        }


        Object o = null;
        try {

            //setupContainer(request);

            o = beforeActionInvocation(request, servletContext);

//最核心的方法,这里通过ActionProxyFactory生成ActionProxy(包含actioninvocation actioncontext的信息供拦截器配合result一起发挥ww和xwork的作用)

            du.serviceAction(request, response, servletContext, mapping);


        } finally {
            afterActionInvocation(request, servletContext, o);
            ActionContext.setContext(null);
        }
    }

 

这里注意几个factory的使用

1、ActionMapperFactory

        ActionMapperIF mapper = ActionMapperFactory.getMapper();
        ActionMapping mapping = mapper.getMapping(request);

2、ActionProxyFactory

ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext, true, false);
得到该action的代理实例

特别要注意的actioninvocation也是在proxy生成的时候初始化好了,

proxy包含了 action所需要的所有东西,完成接下来的一系列工作,

感觉其实这些东西也是比较简单的,通过传引用解决了哪需要就设置到哪去这种方式,不用担心对象的内容改变。



du.serviceAction(request, response, servletContext, mapping);该方法如下:

 public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, ActionMapping mapping) throws ServletException {
        Map extraContext = createContextMap(request, response, mapping, context);

        // If there was a previous value stack, then create a new copy and pass it in to be used by the new Action
        OgnlValueStack stack = (OgnlValueStack) request.getAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY);
        if (stack != null) {
            extraContext.put(ActionContext.VALUE_STACK, new OgnlValueStack(stack));
        }

        try {
            String namespace = mapping.getNamespace();
            String name = mapping.getName();
            String method = mapping.getMethod();

            String id = request.getParameter(XWorkContinuationConfig.CONTINUE_PARAM);
            if (id != null) {
                // remove the continue key from the params - we don't want to bother setting
                // on the value stack since we know it won't work. Besides, this breaks devMode!
                Map params = (Map) extraContext.get(ActionContext.PARAMETERS);
                params.remove(XWorkContinuationConfig.CONTINUE_PARAM);

                // and now put the key in the context to be picked up later by XWork
                extraContext.put(XWorkContinuationConfig.CONTINUE_KEY, id);
            }

            ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, name, extraContext, true, false);
            proxy.setMethod(method);
            request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, proxy.getInvocation().getStack());

            // if the ActionMapping says to go straight to a result, do it!
            if (mapping.getResult() != null) {
                Result result = mapping.getResult();
                result.execute(proxy.getInvocation());
            } else {
                proxy.execute();
            }

            // If there was a previous value stack then set it back onto the request
            if (stack != null) {
                request.setAttribute(ServletActionContext.WEBWORK_VALUESTACK_KEY, stack);
            }
        } catch (ConfigurationException e) {
            LOG.error("Could not find action", e);
            sendError(request, response, context, HttpServletResponse.SC_NOT_FOUND, e);
        } catch (Exception e) {
            String msg = "Could not execute action";
            LOG.error(msg, e);
            sendError(request, response, context, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
        }
    }


ps:webwork 其实是一个很简单的框架,实现servlet协议,包装httpreques\httpresponse\httpsession\\httpservletcontext进行解偶,通过xwork来处理核心逻辑,不过感觉其包结构不够好,框架虽简单新手入门却不容易。
 

 


 

分享到:
评论

相关推荐

    webwork源码底层实现

    通过分析`webwork-default.xml`,你可以掌握配置文件的结构和配置项的作用,这对于定制和扩展WebWork框架至关重要。 WebWork虽然现在已经被Struts2和Spring MVC等更现代的框架取代,但其设计理念和实现方式对于理解...

    剖析webwork源码

    通过对源码的分析,开发者可以更全面地掌握WebWork的架构设计、关键技术和实现细节,这对于优化应用性能、解决复杂问题以及进行定制化开发都有不可估量的价值。 #### 结论 WebWork作为Struts2.0的关键组成部分,其...

    剖析Webwork源码.pdf

    ### 剖析WebWork源码 #### WebWork框架概述 WebWork是一个开源的Java Web应用框架,由OpenSymphony组织开发。它采用MVC(Model-View-Controller)架构模式,旨在帮助开发者构建可扩展、易于维护的Web应用程序。...

    webwork,tomcat源码

    WebWork是一个基于Action的MVC(模型-视图-控制器)框架,它为开发者提供了强大的动态Web应用程序开发能力,而Tomcat则是一个流行的开源Java Servlet容器,它实现了Java EE中的Servlet和JSP规范,用于部署和运行Java...

    webWork 源码, struts2 学习和提升的必需资料,

    WebWork是早期的一个框架,后来发展成为了Struts2的核心,因此深入理解WebWork的源码对于学习和提升Struts2的应用技能至关重要。 首先,让我们来探讨一下WebWork。WebWork是一个轻量级的MVC框架,它引入了许多创新...

    剖析Webwork源码

    值得注意的是,在Webwork 2.2版本后,FilterDispatcher逐渐成为首选,取代了之前的ServletDispatcher,这一变化旨在提升框架的性能与稳定性。Webwork 2支持多视图表示,这意味着开发者可以根据不同的场景选择最适合...

    WebWork2.x源码分析

    WebWork2.x 是一个历史悠久的Java Web框架,它是Struts2的前身。本文将深入探讨WebWork2.x的源码,以理解其...通过对WebWork2.x的源码分析,我们可以更深入地了解Struts2的内部运作,从而更好地利用这个框架进行开发。

    Webwork2开发指南.pdf

    Webwork2是一款基于Java的开源框架,主要用于构建企业级的Web应用程序。这个框架以其强大的MVC(模型-视图-控制器)架构而闻名,能够帮助开发者实现高效、可维护的代码结构。OpenDoc出品的"Webwork2开发指南.pdf"是...

    WEBWORK

    在提供的示例中,`<filter>` 和 `<filter-mapping>` 元素定义了名为 `webwork` 的过滤器,它将所有以 `/` 开头的 URL 映射到 `FilterDispatcher` 类。这使得 WebWork 能够处理所有传入的请求。 2. **Taglib** 配置...

    webwork-2.2.5源码包下载.txt

    ### WebWork-2.2.5源码包下载与解析 #### 一、WebWork框架简介 WebWork是一个开源的Java Web应用开发框架,它基于Java Servlet API,并且支持多种编程模型,包括MVC(Model-View-Controller)模式。WebWork框架的...

    webwork

    此外,查看`displaytag-1.0`源码可以帮助理解如何将一个标签库集成到Web应用程序中,以及它如何与WebWork框架协同工作,优化表格显示和交互。 总的来说,WebWork框架和Display Tag是Web开发中的两个重要工具,它们...

    xwork源代码(webwork源代码,xwork source,)

    《XWork源代码详解——深度剖析WebWork框架基础》 XWork源代码是WebWork框架的核心组成部分,WebWork是一...通过研究XWork源码,开发者可以更好地理解Web应用程序的内部工作原理,从而提升开发技能和解决问题的能力。

    webwork工作机制

    2. 数据复制:`DispatcherUtils`的`serviceAction()`方法创建了一个名为`extraContext`的Map,将HttpServletRequest、HttpSession和ServletContext中的数据复制到其中。这个Map作为参数,为后续创建Action实例提供上...

    webwork-1.4-src.zip_webwork_webwork s_webwork.zip_webwork1.4.zip

    而"webwork"这个文件可能是一个解压后的目录结构,包含了WebWork1.4的源码、配置文件、示例应用等内容。通过深入研究这些源代码,开发者可以更深入地了解WebWork的工作方式,并学习如何将其应用于实际项目中。对于想...

    webwork实例源码 完整的eclipse工程

    本实例源码是针对初学者的一个基础入门项目,通过它我们可以深入理解WebWork的核心概念和工作原理。 WebWork的核心特性包括: 1. **Action与DispatcherServlet**:WebWork中的Action类是处理用户请求的核心,它们...

    webwork类型转换入门一

    WebWork是一个基于Java的开源MVC(模型-视图-控制器)框架,它在早期的Web开发中被广泛使用,特别是在Struts1之后,作为替代方案出现。本篇将介绍WebWork的基础知识,特别是它的类型转换机制,这对于理解Web应用程序...

    WebWork入门教程[创建你第一个WebWork action]

    文档"WebWork入门教程--创建你第一个WebWork action.doc"可能会涵盖这些步骤的详细指南,包括如何配置项目、编写Action类、配置文件的设置以及如何运行和测试。通过这个文档,初学者可以快速理解WebWork的基本工作...

    webwork的jar包

    "webwork2.2.4%2Bspring%2Bhibernate"可能是一个包含了整合WebWork 2.2.4、Spring和Hibernate配置的子目录或文件,这通常包括配置文件(如web.xml、struts-config.xml等)、类库和可能的示例代码,帮助开发者快速...

Global site tag (gtag.js) - Google Analytics