抽象工厂模式
在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()方法轻松获取工厂类。
分享到:
相关推荐
- **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...
此外,书中可能还会涉及一些最佳实践和设计模式,如单例模式、工厂模式等,以及如何使用JUnit进行单元测试,确保代码质量。对于想要提升Java EE开发能力的程序员来说,这本书无疑是一份宝贵的资源。 总的来说,《轻...
该文件主要用来存储一些Struts2的核心配置属性,通过键值对的方式设置框架的行为模式、国际化设置以及其他高级配置等。 #### struts.properties文件的作用 `struts.properties`文件通常位于项目的`WEB-INF/classes...
Struts2、Spring和Hibernate是Java开发中常用的三大框架,它们各自解决了一部分软件开发中的问题,而将它们集成在一起,通常称为“SSH2”框架(Struts2、Spring、Hibernate第二代)。这个框架组合提供了完整的MVC...
该压缩包文件“JSP实例开发源码——车辆管理系统(struts+hibernate+spring+oracle).zip”是一个基于Java Web技术实现的车辆管理系统的完整源代码。这个系统利用了四大框架——Struts、Hibernate、Spring和Oracle...
通过这个项目,你可以学习到如何利用Struts2和Hibernate进行基本的Web开发,理解MVC模式,以及在实际应用中如何处理用户管理相关的业务需求。同时,这也为你提供了实践Struts2拦截器、参数校验、页面交互等技术的...
- **对象工厂**:Struts2可以通过集成Spring或PicoContainer等依赖注入框架,来负责Action及其他组件的实例化过程,这样可以更好地管理对象生命周期。 - **视图技术**:除了JSP之外,Struts2还支持Freemarker等多种...
【hibernate,Struts开发指南整合】是一个针对初学者的综合教程,旨在帮助读者掌握两种主流的Java Web开发框架——Hibernate和Struts。Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者用面向对象的方式...
- `spring-context`:扩展了bean工厂,提供了与应用上下文相关的服务,支持国际化、事件传播、AOP等。 - `spring-web`:提供了基础的Web功能,如Servlet监听器、HTTP上下文等。 - `spring-webmvc`:Spring MVC,用于...
7. **设计模式**:了解MVC模式、工厂模式、单例模式、接口模式和适配器模式,表明他在软件设计上有良好的理论基础,能够写出可维护、可扩展的代码。 8. **Python脚本**:Python作为一种简洁高效的脚本语言,常用于...
Web.xml文件——工程初始化配置文件 - **Servlet配置**:WebRoot文件夹下的Web.xml文件是整个Web项目的配置文件,其中包含了对各个Servlet的配置。例如,Struts框架中的ActionServlet就是在此处定义的。Action...
"会员管理系统(struts+hibernate+spring)_project"就是一个典型例子,它展示了如何将三个主流的Java EE框架——Struts、Hibernate和Spring有效地集成在一起,构建出一个完整的会员管理系统。本文将深入探讨这三个...
标题“spring struts2 jpa集成”涉及到的是Java开发中常用的三个框架——Spring、Struts2和JPA的整合应用。这些技术都是企业级Java应用开发的重要组成部分,它们各自负责不同的职责,共同构建出高效、稳定的后端系统...
《Struts2整合Hibernate深入详解》是一篇针对Java开发者的重要教程,主要探讨如何在Web应用程序中有效地结合两个流行的技术框架——Struts2和Hibernate。Struts2是一个强大的MVC(Model-View-Controller)框架,提供...
在这个压缩包中,包含了这三个框架的特定版本——Struts2.1.6、Spring以及Hibernate的所有必需的JAR文件,使得开发者可以快速地在项目中引入这些框架,而无需逐一查找和添加依赖。 1. **Struts2.1.6**:Struts2是一...
通过这样的整合,我们可以利用GAE的云服务优势,结合Struts2的MVC设计模式、JPA的数据持久化以及Spring的依赖管理和事务控制,构建出高效且可扩展的Web应用。同时,这种架构也便于代码的维护和团队协作。
【JAVA试题0618——.doc】是一个包含多种Java相关知识的问题集,涵盖了面向对象、I/O流、集合框架、EJB、HTTP协议、JSP、数据库操作、邮件发送、JNDI、JMS、事务管理和WebLogic Server等多个方面。以下是这些问题的...
它提供了一系列的工具和服务,如表单验证、国际化支持等。 #### 关键知识点: - **控制器**:Struts的核心是控制器组件`ActionServlet`,它是实现MVC模式中的控制器部分。 - **视图层**:主要由JSP页面构成,用于...