首先org.apache.struts2.dispatcher. FilterDispatcher.java 中的init()方法,
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
String param = filterConfig.getInitParameter("packages");//由此可以看出可以增加参数packages
String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
if (param != null) {
packages = param + " " + packages;
}
this.pathPrefixes = parse(packages);
dispatcher = new Dispatcher(filterConfig.getServletContext());
}
org.apache.struts2.dispatcher. Dispatcher.java
首先执行静态代码块:
static {
ObjectFactory.setObjectFactory(new StrutsObjectFactory());
ActionProxyFactory.setFactory(new StrutsActionProxyFactory());
}
执行构造方法
public Dispatcher(ServletContext servletContext) {
init(servletContext);
}
然后执行init()方法:
boolean reloadi18n = Boolean.valueOf(
(String) Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();
上面的语句读取了properties文件。
读取properties文件的流程:
首先执行Org.apache.struts2.dispatcher.Dispatcher.java 类的方法init()中的语句
boolean reloadi18n = Boolean.valueOf((String)
Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();
然后执行了org.apacher.struts2.config.Setting.java类中的方法
public static String get(String name) throws IllegalArgumentException {
String val = getInstance().getImpl(name);
return val;
}
然后执行了
public static Settings getInstance() {
return (settingsImpl == null) ? getDefaultInstance() : settingsImpl;
}
然后执行了
private static Settings getDefaultInstance() {
if (defaultImpl == null) {
// Create bootstrap implementation
defaultImpl = new DefaultSettings(); //产生了一个DefaultSettings对象
// Create default implementation
try {
String className = get(StrutsConstants.STRUTS_CONFIGURATION);
if (!className.equals(defaultImpl.getClass().getName())) {
try {
// singleton instances shouldn't be built accessing request or session-specific context data
defaultImpl = (Settings) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null);
} catch (Exception e) {
LOG.error("Could not instantiate settings", e);
}
}
} catch (IllegalArgumentException ex) {
// ignore
}
}
return defaultImpl;
}
然后首先执行了语句defaultImpl = new DefaultSettings();
public DefaultSettings() {
// Create default implementations
// Use default properties and struts.properties
ArrayList list = new ArrayList();
try {
list.add(new PropertiesSettings("struts"));//从这里加载struts.properties文件
} catch (Exception e) {
log.warn("Could not find or error in struts.properties", e);
}
try {
list.add(new PropertiesSettings("org/apache/struts2/default")); //加载默认的defualt.properties文件
} catch (Exception e) {
log.error("Could not find org/apache/struts2/default.properties", e);
}
Settings[] configList = new Settings[list.size()];//定义了Settings对象数组
config = new DelegatingSettings((Settings[]) list.toArray(configList));
// Add list of additional properties settingss
try {
StringTokenizer configFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_PROPERTIES), ",");
加载了用户自己定义的properties文件。
while (configFiles.hasMoreTokens()) {
String name = configFiles.nextToken();
try {
list.add(new PropertiesSettings(name));
} catch (Exception e) {
log.error("Could not find " + name + ".properties. Skipping");
}
}
configList = new Settings[list.size()];
config = new DelegatingSettings((Settings[]) list.toArray(configList));
} catch (IllegalArgumentException e) {
// thrown when Settings is unable to find a certain property
// eg. struts.custom.properties in default.properties which is commented
// out
}
// Add additional list of i18n global resource bundles
try {
LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages");
StringTokenizer bundleFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES), ", ");
while (bundleFiles.hasMoreTokens()) {
String name = bundleFiles.nextToken();
try {
log.info("Loading global messages from " + name);
LocalizedTextUtil.addDefaultResourceBundle(name);
} catch (Exception e) {
log.error("Could not find " + name + ".properties. Skipping");
}
}
} catch (IllegalArgumentException e) {
// struts.custom.i18n.resources wasn't provided
}
}
看看org.apache.struts2.config.DelegatingSettings.java下面的方法。
/**
* Gets the specified property - calls getImpl(String) method on config objects in config list
* until successful.
*
* @see #get(String)
*/
public String getImpl(String name) throws IllegalArgumentException {
// Delegate to the other settings
IllegalArgumentException e = null;
for (int i = 0; i < configList.length; i++) {
try {
return configList[i].getImpl(name);
} catch (IllegalArgumentException ex) {
e = ex;
// Try next config
}
}
throw e;
}
分享到:
相关推荐
### Struts2的工作流程及配置文件详解 #### 一、Struts2简介 Struts2是基于MVC设计模式的Java Web开发框架之一,它继承了Struts1的优点,并在此基础上进行了大量的改进和扩展。Struts2框架的核心是拦截器...
Struts2是一个强大的MVC框架,其配置文件是实现应用程序逻辑和控制流程的关键部分。本文将详细介绍Struts2的核心配置文件及其元素。 首先,我们来看一下Struts2的主要配置文件: 1. **web.xml**: 这是Web应用程序...
`struts.xml`是Struts2的核心配置文件,它定义了动作(Actions)、结果(Results)、拦截器(Interceptors)等,控制着请求的流程。以下是其主要内容: 1. **package**: 包的概念是Struts2配置的组织方式,每个包...
Struts2是一个强大的MVC框架,其配置文件对于理解和配置应用程序的行为至关重要。本文将深入探讨Struts2的主要配置文件,以及它们各自的功能和用途。 首先,我们来看一下核心的配置文件: 1. **web.xml**: 这是Web...
ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类。例如,用户注册示例将找到UserReg类。 ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过...
- **struts-plugin.xml**: 插件配置文件,用于加载特定插件,扩展Struts2的功能。 - **struts.xml**或**struts-config.xml**: 应用程序的主配置文件,可以在这里定义Action类、结果、拦截器等。 - **package.xml**...
- `src/main/resources`:可能包含配置文件,如Struts2的配置文件`struts.xml`。 - `src/main/webapp`:Web应用的根目录,包括静态资源(如HTML、CSS、JavaScript)、Web-INF目录(含有web.xml配置文件)等。 - `...
### Struts1多模块多配置文件的开发流程详解 #### 一、引言 在大型项目的开发过程中,为了更好地组织代码结构,提高系统的可维护性和扩展性,通常会采用多模块的设计模式。对于使用Struts1框架进行开发的项目而言,...
配置相关的内容位于`org.apache.struts2.config`包中,Struts2使用WebWork的解析器来处理XML和properties文件,实现配置文件的读取和解析。`org.apache.struts2.dispatcher`包包含了Struts2的核心类,如Dispatcher,...
"Struts2 零配置"是Struts2的一种特性,允许开发者在不编写大量XML配置文件的情况下,快速搭建和运行应用程序。这主要得益于Struts2的插件机制和注解支持。 首先,Struts2的零配置主要依赖于以下两个核心概念: 1....
本章学习目标 struts2 的概念和作用 struts2 的HelloWorld ... struts2 配置文件加载 struts.xml 配置文件详解 struts2 常量文件修改 Action 动作类的三种写法 Action 动作类的三种访问方式
`Dispatcher`是Struts2的核心,负责处理请求、解析XML配置文件以及创建Action和ActionConfig。 5. `PrepareOperations`类被实例化,它的主要职责是在每个请求开始时创建`ActionContext`,并在请求结束时清除`...
- **配置文件**:在`WEB-INF/`目录下编写`web.xml`文件,用以拦截所有用户的请求并加载Struts的配置文件`struts-config.xml`。 **2. web.xml 配置** 在`web.xml`中,需要配置以下内容: - **拦截器**:通过`...
### Struts配置文件详解 #### 一、Struts配置文件的重要性与作用 Struts框架作为Java Web开发领域中的一种流行MVC(Model-View-Controller)框架,它提供了一种结构化的方式来构建Web应用程序。在Struts框架中,`...
- **struts-default.xml**:这是Struts2的默认配置文件,提供了许多预定义的配置,比如默认的拦截器栈。将其复制到`src`目录并重命名为`struts.xml`,根据项目需求进行自定义配置。 - **default.properties**:这...
- **Struts2的默认配置文件**:Struts2默认会加载一个名为`struts-default.xml`的配置文件,这个文件包含了Struts2的核心配置信息。开发者可以通过自定义的配置文件来覆盖或扩展这些默认配置。 #### Struts2的请求...