`
winnie825
  • 浏览: 120211 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts国际化研究(二)——工厂模式

 
阅读更多

 

抽象工厂模式

      在struts国际化研究(一)中介绍了struts的默认国际化的默认实现类,但是在国际化的过程中,大多方法使用是MessageResources类中的方法,这里就是struts国际化的核心。

 

      抽象工厂模式定义:提供一个接口,用于创建相关或依赖的对象家族,而不需要指定具体类。

 

      MessageResources是一个抽象类(特殊的接口),其中仅有一个抽象方法public abstract String getMessage(Locale locale, String key),这个正式国际化的入口。

      PropertyMessageResources(struts默认国际化类)继承MessageResources并实现的getMessage(Locale locale, String key)方法,当然自定义的国际化类也实现该接口,从而形成国际化文件家族。

 

    public String getMessage(Locale locale, String key) {

        if (log.isDebugEnabled()) {
            log.debug("getMessage(" + locale + "," + key + ")");
        }

        // Initialize variables we will require
        String localeKey = localeKey(locale);
        String originalKey = messageKey(localeKey, key);
        String messageKey = null;
        String message = null;
        int underscore = 0;
        boolean addIt = false;  // Add if not found under the original key

        // Loop from specific to general Locales looking for this message
        while (true) {

            // Load this Locale's messages if we have not done so yet
            loadLocale(localeKey);

            // Check if we have this key for the current locale key
            messageKey = messageKey(localeKey, key);
            synchronized (messages) {
                message = (String) messages.get(messageKey);
                if (message != null) {
                    if (addIt) {
                        messages.put(originalKey, message);
                    }
                    return (message);
                }
            }

            // Strip trailing modifiers to try a more general locale key
            addIt = true;
            underscore = localeKey.lastIndexOf("_");
            if (underscore < 0) {
                break;
            }
            localeKey = localeKey.substring(0, underscore);

        }

        // Try the default locale if the current locale is different
        if (!defaultLocale.equals(locale)) {
            localeKey = localeKey(defaultLocale);
            messageKey = messageKey(localeKey, key);
            loadLocale(localeKey);
            synchronized (messages) {
                message = (String) messages.get(messageKey);
                if (message != null) {
                    messages.put(originalKey, message);
                    return (message);
                }
            }
        }

        // As a last resort, try the default Locale
        localeKey = "";
        messageKey = messageKey(localeKey, key);
        loadLocale(localeKey);
        synchronized (messages) {
            message = (String) messages.get(messageKey);
            if (message != null) {
                messages.put(originalKey, message);
                return (message);
            }
        }

        // Return an appropriate error indication
        if (returnNull) {
            return (null);
        } else {
            return ("???" + messageKey(locale, key) + "???");
        }

    }
 

 

 

工厂方法模式

工厂方法模式:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

 

      struts的工厂类MessageResourcesFactory,他是一个抽象类,包含一个抽象方法public abstract MessageResources createResources(String config),它的作用正如起名创建资源,怎么创建?看默认实现类。

      MessageResourcesFactory的factoryClass指定了默认实现类PropertyMessageResourcesFactory

protected static String factoryClass = "org.apache.struts.util.PropertyMessageResourcesFactory";

PropertyMessageResourcesFactory很简单,就一个方法

 

    public MessageResources createResources(String config) {

        return new PropertyMessageResources(this, config, this.returnNull);

    }
 

 

 

 

现在看一下struts是如何运用这个工程类创建MessageResources

struts的核心加载类是ActionServlet,他的initModuleMessageResources(ModuleConfig config)方法对国际化类进行初始化

 

    protected void initModuleMessageResources(ModuleConfig config)
        throws ServletException {

        MessageResourcesConfig mrcs[] = config.findMessageResourcesConfigs();
        for (int i = 0; i < mrcs.length; i++) {
            if ((mrcs[i].getFactory() == null)
                || (mrcs[i].getParameter() == null)) {
                continue;
            }
            if (log.isDebugEnabled()) {
                log.debug(
                    "Initializing module path '"
                        + config.getPrefix()
                        + "' message resources from '"
                        + mrcs[i].getParameter()
                        + "'");
            }

            // 读取struts-config.xml中message-resources的属性
            String factory = mrcs[i].getFactory();
            // 该方法将覆盖factoryClass值(factoryClass上文中提到,工厂初始化类路径)
            MessageResourcesFactory.setFactoryClass(factory);
            // 调用createResources方法了,默认使用的是PropertyMessageResourcesFactory的,如果在struts-config.xml中定义了工厂类,这里将使用用户自定义的创建方法
            MessageResourcesFactory factoryObject =
                MessageResourcesFactory.createFactory();
            factoryObject.setConfig(mrcs[i]);

            // 通过factory创建MessageResources后,设置基本属性,这些属性是抽象工厂创建国际化家族所需的基本属性
            MessageResources resources =
                factoryObject.createResources(mrcs[i].getParameter());
            resources.setReturnNull(mrcs[i].getNull());
            resources.setEscape(mrcs[i].isEscape());
            getServletContext().setAttribute(
                mrcs[i].getKey() + config.getPrefix(),
                resources);
        }

    }

      这里还有一个实现细节需要注意PropertyMessageResourcesFactory的createResources方法在创建MessageResources的同时,将自己注入到了新创建的MesageResources中 ,MessageResources可以通过getFactory()方法轻松获取工厂类。

 

 

分享到:
评论

相关推荐

    struts1和struts2的区别

    - **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...

    轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发电子书1

    此外,书中可能还会涉及一些最佳实践和设计模式,如单例模式、工厂模式等,以及如何使用JUnit进行单元测试,确保代码质量。对于想要提升Java EE开发能力的程序员来说,这本书无疑是一份宝贵的资源。 总的来说,《轻...

    struts.properties配置详解

    该文件主要用来存储一些Struts2的核心配置属性,通过键值对的方式设置框架的行为模式、国际化设置以及其他高级配置等。 #### struts.properties文件的作用 `struts.properties`文件通常位于项目的`WEB-INF/classes...

    Struts2+Spring+Hibernate框架技术与项目实战——上

    Struts2、Spring和Hibernate是Java开发中常用的三大框架,它们各自解决了一部分软件开发中的问题,而将它们集成在一起,通常称为“SSH2”框架(Struts2、Spring、Hibernate第二代)。这个框架组合提供了完整的MVC...

    JSP实例开发源码——车辆管理系统(struts+hibernate+spring+oracle).zip

    该压缩包文件“JSP实例开发源码——车辆管理系统(struts+hibernate+spring+oracle).zip”是一个基于Java Web技术实现的车辆管理系统的完整源代码。这个系统利用了四大框架——Struts、Hibernate、Spring和Oracle...

    struts2写的用户管理

    通过这个项目,你可以学习到如何利用Struts2和Hibernate进行基本的Web开发,理解MVC模式,以及在实际应用中如何处理用户管理相关的业务需求。同时,这也为你提供了实践Struts2拦截器、参数校验、页面交互等技术的...

    struts2工作流程

    - **对象工厂**:Struts2可以通过集成Spring或PicoContainer等依赖注入框架,来负责Action及其他组件的实例化过程,这样可以更好地管理对象生命周期。 - **视图技术**:除了JSP之外,Struts2还支持Freemarker等多种...

    hibernate,Struts开发指南整合

    【hibernate,Struts开发指南整合】是一个针对初学者的综合教程,旨在帮助读者掌握两种主流的Java Web开发框架——Hibernate和Struts。Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用面向对象的方式...

    一些jar包spring/struts

    - `spring-context`:扩展了bean工厂,提供了与应用上下文相关的服务,支持国际化、事件传播、AOP等。 - `spring-web`:提供了基础的Web功能,如Servlet监听器、HTTP上下文等。 - `spring-webmvc`:Spring MVC,用于...

    技术文档——应用技术等等等等等

    7. **设计模式**:了解MVC模式、工厂模式、单例模式、接口模式和适配器模式,表明他在软件设计上有良好的理论基础,能够写出可维护、可扩展的代码。 8. **Python脚本**:Python作为一种简洁高效的脚本语言,常用于...

    Struts+Spring+Hibernate框架说明文档

    Web.xml文件——工程初始化配置文件 - **Servlet配置**:WebRoot文件夹下的Web.xml文件是整个Web项目的配置文件,其中包含了对各个Servlet的配置。例如,Struts框架中的ActionServlet就是在此处定义的。Action...

    会员管理系统(struts+hibernate+spring)-project

    "会员管理系统(struts+hibernate+spring)_project"就是一个典型例子,它展示了如何将三个主流的Java EE框架——Struts、Hibernate和Spring有效地集成在一起,构建出一个完整的会员管理系统。本文将深入探讨这三个...

    spring struts2 jpa集成

    标题“spring struts2 jpa集成”涉及到的是Java开发中常用的三个框架——Spring、Struts2和JPA的整合应用。这些技术都是企业级Java应用开发的重要组成部分,它们各自负责不同的职责,共同构建出高效、稳定的后端系统...

    .Struts2整合Hibernate深入详解

    《Struts2整合Hibernate深入详解》是一篇针对Java开发者的重要教程,主要探讨如何在Web应用程序中有效地结合两个流行的技术框架——Struts2和Hibernate。Struts2是一个强大的MVC(Model-View-Controller)框架,提供...

    ssh struts2.1.6 spring hibernate所有需要的jar包

    在这个压缩包中,包含了这三个框架的特定版本——Struts2.1.6、Spring以及Hibernate的所有必需的JAR文件,使得开发者可以快速地在项目中引入这些框架,而无需逐一查找和添加依赖。 1. **Struts2.1.6**:Struts2是一...

    gea 整合struts2+jpa+spring实例

    通过这样的整合,我们可以利用GAE的云服务优势,结合Struts2的MVC设计模式、JPA的数据持久化以及Spring的依赖管理和事务控制,构建出高效且可扩展的Web应用。同时,这种架构也便于代码的维护和团队协作。

    JAVA试题0618——.doc

    【JAVA试题0618——.doc】是一个包含多种Java相关知识的问题集,涵盖了面向对象、I/O流、集合框架、EJB、HTTP协议、JSP、数据库操作、邮件发送、JNDI、JMS、事务管理和WebLogic Server等多个方面。以下是这些问题的...

    jsp源码车辆管理系统(struts+hibernate+spring+oracle)130225

    它提供了一系列的工具和服务,如表单验证、国际化支持等。 #### 关键知识点: - **控制器**:Struts的核心是控制器组件`ActionServlet`,它是实现MVC模式中的控制器部分。 - **视图层**:主要由JSP页面构成,用于...

Global site tag (gtag.js) - Google Analytics