`

Struts2中的setDefaultLocale的实现

阅读更多

在struts2中可以在struts.properties文件中设置default local。如:struts.locale=zh_CN

查看源代码发现他是通过annotation Inject来设置的。

    @Inject(value=StrutsConstants.STRUTS_LOCALE, required=false)
    public static void setDefaultLocale(String val) {
        defaultLocale = val;
    }

    public static final String STRUTS_LOCALE = "struts.locale";

 接下来我们看一下它是怎么通过annotation来设置的呢。先调用addInjectorsForMembers()方法拿到有inject标签的方法,然后调用 injector.inject(context, null);方法。

 

 
void injectStatics(List<Class<?>> staticInjections) {
    final List<Injector> injectors = new ArrayList<Injector>();

    for (Class<?> clazz : staticInjections) {
      addInjectorsForFields(clazz.getDeclaredFields(), true, injectors);
      addInjectorsForMethods(clazz.getDeclaredMethods(), true, injectors);
    }

    callInContext(new ContextualCallable<Void>() {
      public Void call(InternalContext context) {
        for (Injector injector : injectors) {
          injector.inject(context, null);
        }
        return null;
      }
    });
  }

  void addInjectorsForFields(Field[] fields, boolean statics,
      List<Injector> injectors) {
    addInjectorsForMembers(Arrays.asList(fields), statics, injectors,
        new InjectorFactory<Field>() {
          public Injector create(ContainerImpl container, Field field,
              String name) throws MissingDependencyException {
            return new FieldInjector(container, field, name);
          }
        });
  }

//通过member.getAnnotation(Inject.class);方法拿到那些有Inject标签的方法,然后保存在
injectors里面。
  <M extends Member & AnnotatedElement> void addInjectorsForMembers(
      List<M> members, boolean statics, List<Injector> injectors,
      InjectorFactory<M> injectorFactory) {
    for (M member : members) {
      if (isStatic(member) == statics) {
        Inject inject = member.getAnnotation(Inject.class);
        if (inject != null) {
          try {
            injectors.add(injectorFactory.create(this, member, inject.value()));
          } catch (MissingDependencyException e) {
            if (inject.required()) {
              throw new DependencyException(e);
            }
          }
        }
      }
    }
  }

 然后在inject方法里面调用 method.invoke()方法,此处method是定义了inject的标签,此处是setDefaultLocale方法getParameters(method, context, parameterInjectors)返回参数,此处为‘zh_CN’。这样就通过反射设置进去了。

 public void inject(InternalContext context, Object o) {
      try {
        method.invoke(o, getParameters(method, context, parameterInjectors));
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
  }

 总结:此处涉及了两个方面,一是annotation的使用,二是反射的使用。这两个知识点都很常用。比如我上次做的为了减少struts的配置,用annotation标识那些类是Action类。struts.locale=zh_CN 中的配置应该和用户浏览器的配置一样,不然就会发生将string转成时间格式不匹配的错误

分享到:
评论

相关推荐

    struts2实现的中英文切换

    本教程将深入讲解如何在Struts2框架中实现中英文切换功能。 1. **创建资源文件**: 在Struts2国际化过程中,关键在于使用资源文件来存储不同语言的文本。资源文件通常命名为`XX.properties`,其中`XX`代表语言代码...

    Struts2属性文件详解

    若需要实现自定义的配置管理器,则需创建一个实现了`Configuration`接口的类,并在类中实现Struts 2配置文件的加载逻辑。 #### struts.locale 此属性指定了Web应用的默认Locale设置,用于确定应用的语言环境和区域...

    Struts2的常量详解

    在Struts2中,配置是至关重要的,因为它们定义了框架的行为和交互方式。以下是一些关于Struts2常量的详细解释: 1. **struts.configuration**: 这个属性定义了配置文件管理器,负责加载Struts2的配置文件。默认值是...

    STRUTS2国际化的问题

    - 使用`&lt;package&gt;`中的`defaultLocale`属性来指定包级别的默认语言环境。 - 可以通过`&lt;result&gt;`标签中的`type`属性设置国际化资源文件,以便在特定的结果类型下使用相应的语言资源。 #### 三、后端实现国际化 1....

    Struts2 in action中文版

    6.7.2 Struts 2中常用的表达式语言特性 131 6.7.3 表达式语言的高级特性 135 6.8 小结 137 第7章 UI组件标签 139 7.1 为什么需要UI组件标签 139 7.2 标签、模板和主题 144 7.2.1 标签 146 7.2.2 模板 146 7.2.3 ...

    struts.properties详解

    - **默认值**:`org.apache.struts2.config.DefaultConfiguration`,这是Struts2默认使用的配置文件管理器。 - **自定义**:如果需要实现自定义的配置管理器,开发者需要创建一个实现了`Configuration`接口的类来...

    Struts2 国际化 多语言切换

    下面我们将深入探讨如何在Struts2中实现国际化和多语言切换。 **一、国际化(i18n)基础** 国际化是指软件设计时考虑到不同地区的文化差异,使得软件可以通过简单的配置和扩展就能适应各种语言环境。在Java中,我们...

    Struts2常用常量.doc

    本文将重点介绍Struts2中常用的配置常量,这些常量在项目的初始化配置文件(通常是`struts.xml`)中定义,用于控制框架的行为和功能。 #### 二、Struts2常用配置常量 1. **`struts.i18n.encoding`** - **作用**...

    Struts 2 属性

    本文将深入解析Struts 2中的关键属性,这些属性在项目配置中扮演着核心角色,对理解框架行为、优化性能以及定制化需求具有重要意义。 ### Struts 2 的关键属性详解 #### 1. struts.configuration 此属性用于指定...

    struts2语言国际化

    如果你还没有集成,需要在项目的`pom.xml`或者`build.gradle`文件中添加Struts2的依赖。Struts2的核心库包含了处理国际化需求的组件。 二、创建资源文件 1. 创建资源文件:在src/main/resources目录下创建一个名为`...

    struts1.x 最简洁国际化 源代码

    - 测试国际化功能时,可以模拟不同的浏览器设置,或者使用`java.util.Locale.setDefault()`临时改变应用的默认`Locale`。 以上就是关于Struts1.x国际化的基本概念和实现方式。通过理解这些知识点,开发者能够构建...

    Struts入门教程

    - `struts.configuration`: 指定Struts 2的配置类,默认为`DefaultConfiguration`。 - `struts.locale`: 设置默认的国际化地区信息,例如`en_US`。 - `struts.i18n.encoding`: 设置国际化信息的编码,如`UTF-8`。 - ...

    struts处理中文乱码问题总结

    ResourceBundle bundle = ResourceBundle.getBundle("com.example.messages", Locale.getDefault(), new UTF8Control()); ``` 其中`UTF8Control`是一个自定义的`PropertiesControl`实现,用于指定加载`....

    struts.xml中constent属性参数配置大全

    在Struts2框架中,`struts.xml` 文件扮演着至关重要的角色,它不仅负责配置应用的基本信息,还允许开发者通过一系列的常量(constant)来定制Struts2的行为。这些常量能够帮助我们更加灵活地控制框架的行为特性,...

    实现图片上传且具有压缩功能

    在JSP(JavaServer Pages)环境中,结合Struts框架,我们可以实现用户端上传图片并进行压缩的功能。以下是对这个主题的详细阐述: 一、图片上传原理 图片上传的核心在于前端与后端的交互。前端通过HTML表单提供一个...

    struts_2.3.12GA_API文档(chm版本)

    所有已实现的接口: Action, LocaleProvider, TextProvider, Validateable, ValidationAware, Serializable 直接已知子类: DefaultActionSupport ----------------------------------------------------------...

    Mysql中文乱码问题解决

    如果使用的是Struts2框架,还需要调整其默认字符集以支持UTF-8。可以在`struts.xml`配置文件中添加如下配置: ```xml &lt;constant name="struts.multipart.parser" value="commons" /&gt; &lt;constant name="struts....

Global site tag (gtag.js) - Google Analytics