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

Webwork2.2.6 源码解读之Configuration

    博客分类:
  • Java
阅读更多

在webwork2.2.6版本中,不管是用ServletDispatcher还是FilterDispatcher充当请求转发器(可在web.xml中配置),都会调用到相关Servlet的init或Filter的init方法。

在init方法中,DispatcherUtils.initialize(getServletContext())的调用完成了配置文件的读取、ObjectFactory的设置(也是根据配置文件)。类Configuration充当了读取配置文件的功能。其子类包括:

webwork提供了默认资源文件类型、property资源文件类型,还有DelegatingConfiguration资源文件类型 ,你也可以实现自己的XMLConnfiguration。
查看Configuration类代码,我们可以看到非静态方法,包括isSetImpl(String name)直接返回false,setImpl(String name, Object value)直接抛出异常,这是一种变态的abstract类设计,在需要使用该类的静态方法,却又不愿意调用者实例化该类并调用非静态方法时候,用这种变通的做法也是不错的选择。(因为我们不能同时让static和abstract修饰一个类)。

另外,该做法实现了多态,在这种多态中,子类可以被任意更换,确只保证只有一个之类实例存在。实现方法是在Configuration中建立静态变量static Configuration configurationImpl;调用端可以通过实例化不同的子类赋予configurationImpl。最后通过Configuration.getConfiguration() 获取唯一的实例。


这样的设计在webwork其他地方也经常可见。如ActionProxyFactory及其子类,但是不同的是ActionProxyFactory是absctract的,因为ActionProxyFactory没有设计有静态方法。


这种设计在策略互换且只允许单个策略的情况下相当有用,今天看了这段代码,且做一个笔记。

代码如下:::
public class Configuration {

    static Configuration configurationImpl;
    static Configuration defaultImpl;
    static Locale locale; // Cached locale
    private static final Log LOG = LogFactory.getLog(Configuration.class);


    /**
     * Sets the current configuration implementation. Can only be called once.
     *
     * @param config a Configuration implementation
     * @throws IllegalStateException if an error occurs when setting the configuration implementation.
     */
    public static void setConfiguration(Configuration config) throws IllegalStateException {
        configurationImpl = config;
        locale = null; // Reset cached locale
    }

    /**
     * Gets the current configuration implementation.
     *
     * @return the current configuration implementation.
     */
    public static Configuration getConfiguration() {
        return (configurationImpl == null) ? getDefaultConfiguration() : configurationImpl;
    }

    /**
     * Returns the WebWork2 locale. Keys off the property <tt>webwork.locale</tt> which should be set
     * as the Java {@link java.util.Locale#toString() toString()} representation of a Locale object (i.e.,
     * "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "fr_MAC", etc). <p>
     * <p/>
     * If no locale is specified then the default VM locale is used ({@link java.util.Locale#getDefault()}).
     *
     * @return the WebWork2 locale if specified or the VM default locale.
     */
    public static Locale getLocale() {
        if (locale == null) {
            try {
                StringTokenizer localeTokens = new StringTokenizer(getString(WebWorkConstants.WEBWORK_LOCALE), "_");
                String lang = null;
                String country = null;

                if (localeTokens.hasMoreTokens()) {
                    lang = localeTokens.nextToken();
                }

                if (localeTokens.hasMoreTokens()) {
                    country = localeTokens.nextToken();
                }

                locale = new Locale(lang, country);
            } catch (Throwable t) {
                // Default
                LOG.warn("Setting locale to the default locale");
                locale = Locale.getDefault();
            }
        }

        return locale;
    }

    /**
     * Determines whether or not a value has been set. Useful for testing for the existance of parameter without
     * throwing an IllegalArgumentException.
     *
     * @param name the name of the property to test.
     * @return <tt>true</tt> if the property exists and has a value, <tt>false</tt> otherwise.
     */
    public static boolean isSet(String name) {
        return getConfiguration().isSetImpl(name);
    }

    /**
     * Returns a property as a String. This will throw an <tt>IllegalArgumentException</tt> if an error occurs
     * while retrieveing the property or if the property doesn't exist.
     *
     * @param name the name of the property to get.
     * @return the property as a String
     * @throws IllegalArgumentException if an error occurs retrieveing the property or the property does not exist.
     */
    public static String getString(String name) throws IllegalArgumentException {
        String val = get(name).toString();

        return val;
    }

    /**
     * Returns a property as an Object. This will throw an <tt>IllegalArgumentException</tt> if an error occurs
     * while retrieveing the property or if the property doesn't exist.
     *
     * @param name the name of the property to get.
     * @return the property as an Object.
     * @throws IllegalArgumentException if an error occurs retrieveing the property or the property does not exist.
     */
    public static Object get(String name) throws IllegalArgumentException {
        Object val = getConfiguration().getImpl(name);

        return val;
    }

    /**
     * Returns an Iterator of all properties names.
     *
     * @return an Iterator of all properties names.
     */
    public static Iterator list() {
        return getConfiguration().listImpl();
    }

    /**
     * Implementation of the {@link #isSet(String)} method.
     *
     * @see #isSet(String)
     */
    public boolean isSetImpl(String name) {
        // this is dumb.. maybe it should just throw an unsupported op like the rest of the *Impl
        // methods in this class.
        return false;
    }

    /**
     * Sets a property. Throws an exception if an error occurs when setting the property or if the
     * Configuration implementation does not support setting properties.
     *
     * @param name  the name of the property to set.
     * @param value the property to set.
     * @throws IllegalArgumentException      if an error occurs when setting the property.
     * @throws UnsupportedOperationException if the config implementation does not support setting properties.
     */
    public static void set(String name, Object value) throws IllegalArgumentException, UnsupportedOperationException {
        getConfiguration().setImpl(name, value);
    }

    /**
     * Implementation of the {@link #set(String, Object)} method.
     *
     * @see #set(String, Object)
     */
    public void setImpl(String name, Object value) throws IllegalArgumentException, UnsupportedOperationException {
        throw new UnsupportedOperationException("This configuration does not support updating a setting");
    }

    /**
     * Implementation of the {@link #get(String)} method.
     *
     * @see #get(String)
     */
    public Object getImpl(String aName) throws IllegalArgumentException {
        return null;
    }

    /**
     * Implementation of the {@link #list()} method.
     *
     * @see #list()
     */
    public Iterator listImpl() {
        throw new UnsupportedOperationException("This configuration does not support listing the settings");
    }

    private static Configuration getDefaultConfiguration() {
        if (defaultImpl == null) {
            // Create bootstrap implementation
            defaultImpl = new DefaultConfiguration();

            // Create default implementation
            try {
                String className = getString(WebWorkConstants.WEBWORK_CONFIGURATION);

                if (!className.equals(defaultImpl.getClass().getName())) {
                    try {
                        // singleton instances shouldn't be built accessing request or session-specific context data
                        defaultImpl = (Configuration) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null);
                    } catch (Exception e) {
                        LOG.error("Could not instantiate configuration", e);
                    }
                }
            } catch (IllegalArgumentException ex) {
                // ignore
            }
        }

        return defaultImpl;
    }

    public static void reset() {
        defaultImpl = null;
        configurationImpl = null;
    }
}


  • 大小: 22.2 KB
分享到:
评论

相关推荐

    webwork 2.2.6中文文档

    webwork 2.2.6 中文版本,然后编译生成chm格式,方面查看。

    WebWork 2.2.6 API

    WebWork 2.2.6 API 是一个针对Java Web应用程序的框架,它提供了一种模型-视图-控制器(MVC)架构,帮助开发者构建可维护、可扩展且易于调试的Web应用。WebWork的核心特性包括强大的动作映射、类型安全的参数绑定、...

    webwork 2.2.7.zip打包下载

    WebWork是一个基于Java的MVC(Model-View-Controller)框架,它在早期的Web开发中扮演了重要的角色,提供了强大的Action和表单处理能力。WebWork 2.2.7是该框架的一个版本,其主要目的是为了简化企业级Web应用的开发...

    webwork源码底层实现

    在深入理解WebWork源码之前,我们首先需要了解一些基本概念。 1. **MVC模式**:WebWork基于MVC模式设计,它将应用程序的逻辑分为三部分:模型负责业务处理,视图负责数据展示,控制器负责接收请求并调用模型进行...

    webwork,tomcat源码

    WebWork源码分析: WebWork的核心在于它的Action系统,它通过处理用户请求并调用相应的业务逻辑来驱动应用程序。源码中包含了Action、Interceptor、Result等关键组件的实现。Action是处理用户请求的入口点,...

    webwork实例源码 完整的eclipse工程

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

    webworkinaction.zip_action _oscore-2.2.6.jar_webwork_webwork in

    通过阅读和分析`oscore-2.2.6.jar`中的源码,我们可以深入理解WebWork如何在后台处理请求,如何将动作映射到具体的业务逻辑,并最终如何将结果呈现给用户。 压缩包中的`webwork`目录可能包含WebWork框架的具体实现...

    webwork使用的jar包

    是webwork中的一个jar包

    webwork-2.2.5源码包下载.txt

    WebWork框架的特点之一是其灵活性,它允许开发者根据项目需求选择最适合的技术栈。此外,WebWork还提供了丰富的插件和扩展机制,使得定制化变得更加容易。 #### 二、WebWork-2.2.5版本概述 WebWork-2.2.5是该框架...

    剖析Webwork源码.pdf

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

    webwork-2.1.6.jar

    webwork-2.1.6.jar

    Webwork2开发指南.pdf

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

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

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

    剖析webwork源码

    ### 剖析webwork源码:深入了解Struts2.0核心技术 #### WebWork与Struts2.0的关系 WebWork框架,作为Struts2.0的核心技术之一,源自于OpenSymphony组织的开源项目,旨在提供一种组件化和代码重用的MVC模式解决方案...

    webwork in action(源码)

    博文链接:https://melet.iteye.com/blog/102700

    剖析Webwork源码

    ### 剖析Webwork源码:深入了解Webwork框架的核心机制 #### Webwork框架概览 Webwork,作为OpenSymphony旗下的一款开源项目,自2004年起便以其独特的设计理念吸引了众多开发者的眼球。其核心目标在于提供一种组件...

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

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

    SWFupload_文件批量上传

    下面将详细探讨SWFupload的工作原理、主要特性、使用方法以及与Struts1和WebWork2.2.6框架的集成。 ### 1. 工作原理 SWFupload利用了Adobe Flash技术,因为Flash支持在浏览器中处理大文件和多文件上传,而...

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

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

Global site tag (gtag.js) - Google Analytics