在这里,每一个ConfigurationProvider的#init(),#register(),和#loadPackages()都被调用了一遍,下面我们来看一下之前的七步操作中载入的几个ConfigurationProvider都注册和载入了什么
-------------------------------------------------------------------------------------------------
●第一个是DefaultPropertiesProvider
他的#init()为一个空函数,表明初始化时并没有执行任何操作。#loadPackages()并没有覆盖,使用的是直接基类的实现,而它的基类也定义了一个空的方法。
所以只剩下#register()方法了。
public void register(ContainerBuilder builder, LocatableProperties props)
throws ConfigurationException {
Settings defaultSettings = null;
try {
defaultSettings = new PropertiesSettings("org/apache/struts2/default");
} catch (Exception e) {
throw new ConfigurationException("Could not find or error in org/apache/struts2/default.properties", e);
}
loadSettings(props, defaultSettings);
}
很明显,它载入了org/apache/struts2/default.properties。它默认在struts2-core-2.x.xx.jar的org/apache/struts2/下边。它定义了Struts2的默认属性,包括国际化,或者i18n等等,它可以被struts.properties覆盖。
-------------------------------------------------------------------------------------------------
●第二个是XmlConfigurationProvider和StrutsXmlConfigurationProvider。负责载入在web.xml中FilterDispatcher的参数path配置的xml文件。XmlConfigurationProvider专门负责载入xwork.xml,而StrutsXmlConfigurationProvider负责载入其他的xml配置文件。其中StrutsXmlConfigurationProvider是XmlConfigurationProvider的子类,主要的操作都是在XmlConfigurationProvider中实现的。这两个类实现了struts2主要的配置文件struts.xml(默认名称)等的读取。
#register()方法主要是注册框架需要的很多bean和常量(constant)。
而在#loadPackages()中,则载入了<package>标签中定义的配置内容。
一个完整的配置文件见下边:
<?xml version="1.0" encoding="UTF-8"?>
<struts>
<!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
<include file="struts-default.xml"></include>
<!-- package提供了将多个Action组织为一个模块的方式。 package的名字必须是唯一的 package可以扩展 当一个package扩展自另一个package时该package会在本身配置的基础上加入扩展的package的配置 父package必须在子package前配置; name:package名称; extends:继承的父package名称; abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false; namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action -->
<package name="cn.test.struts2" extends="struts-default"
namespace="/test">
<interceptors>
<!-- 定义拦截器 name:拦截器名称 class:拦截器类路径 -->
<interceptor name="inter1" class="cn.test.Inter1"></interceptor>
<interceptor name="inter2" class="cn.test.Inter2"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="inter1"></interceptor-ref>
<interceptor-ref name="inter2"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器 每个Action都会自动引用 如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<!-- 全局results配置 -->
<global-results>
<result name="input">/error.jsp</result>
</global-results>
<!-- 全局exception配置 -->
<global-exception-mappings>
<exception-mapping result="input"
exception="java.sql.SQLException">
</exception-mapping>
</global-exception-mappings>
<!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同) name:action名称 class: 对应的类的路径 method: 调用Action中的方法名 -->
<action name="test" class="cn.test.TestAction">
<!-- 引用拦截器 name:拦截器名称或拦截器栈名称 -->
<interceptor-ref name="inter1"></interceptor-ref>
<!-- 节点配置 name : result名称 和Action中返回的值相同 type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher -->
<result name="success" type="dispatcher">
/success.jsp
</result>
<result name="failure" type="dispatcher">
/failure.jsp
</result>
<!-- 参数设置 name:对应Action中的get/set方法 -->
<param name="param">param</param>
<!-- 异常配置 -->
<exception-mapping result="failure"
exception="java.lang.Exception">
</exception-mapping>
<!-- 此package默认的Action配置 -->
<default-action-ref name="test">
<param name="param">default_param</param>
</default-action-ref>
</action>
</package>
</struts>
-------------------------------------------------------------------------------------------------
●第三个是LegacyPropertiesConfigurationProvider,载入struts.properties中的配置,这个文件中的配置可以覆盖default.properties中的。
-------------------------------------------------------------------------------------------------
●第四个是ClasspathConfigurationProvider,负责载入在web.xml中FilterDispatcher的参数actionPackages配置的Action。它负责将此配置中提到的包下所有以"Action"结尾的类和继承com.opensymphony.xwork2.Action的类作为Action载入框架。
-------------------------------------------------------------------------------------------------
●第五个是载入自定义的ConfigurationProvider,在web.xml中FilterDispatcher的参数configProviders配置
-------------------------------------------------------------------------------------------------
●第六个是props.putAll(initParams);将FilterDispatcher的参数载入了进去,不太清楚作用。
-------------------------------------------------------------------------------------------------
●第七个是BeanSelectionProvider。它的#register()方法中将配置文件中的bean与具体的类映射。默认使用的全是name为"struts"的bean。
-------------------------------------------------------------------------------------------------
下面再次回到FilterDispatcher的#init()方法中,
String param = filterConfig.getInitParameter("packages");
String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
if (param != null) {
packages = param + " " + packages;
}
this.pathPrefixes = parse(packages);
这个步骤载入了packages标签下定义的静态资源。
例如web.xml中进行了如下定义
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>packages</param-name>
<param-value>cn.static.resource</param-value>
</init-param>
</filter>
FilterDispatcher会将cn.static.resource包下的文件当作静态资源处理,即直接在页面上显示文件内容,不过会忽略扩展名为class的文件。比如在cn.static.resource包下有一个test.txt的文本文件,其内容为“test”,访问http://localhost:8081/Struts2Demo/struts/test.txt时会显示:test
另外,对org.apache.struts2.static,template,org.apache.struts2.interceptor.debugging这三个包空间下边的资源也会作为静态资源载入。
分享到:
相关推荐
1. **struts-default.xml**:这是Struts2的核心配置文件,位于`struts2-core.jar`库的`/org/apache/struts2/defaults`包内。它包含了框架的基本设置,如拦截器栈、默认Action配置等。 2. **struts-plugin.xml**:这...
### Struts2 配置文件详解 #### 一、引言 在Struts2框架的应用开发过程中,配置文件起到了至关重要的作用。Struts2主要依赖于两种基于XML的配置文件:`web.xml` 和 `struts-config.xml`(通常命名为 `struts.xml`)...
本文将围绕“Struts2配置文件传值中文乱码”这一主题,深入探讨其成因、解决方案以及相关的配置细节,旨在帮助开发者有效解决中文乱码问题,提升用户体验。 ### Struts2框架简介 Struts2是Apache组织下的一个开源...
确保配置文件的路径相对于`WEB-INF/classes`是可访问的,这样才能使Struts2成功读取并解析配置,从而正常运行应用程序。 总结一下,当遇到Struts2配置文件位置更改问题时,应遵循以下步骤: 1. 确保新的`struts....
### 二、Struts配置文件struts-config.xml #### 1. **Struts-config元素** - 这是Struts配置文件的根元素,其配置类为org.apache.struts.config.ModuleConfig。该元素下有8个子元素,每个都扮演着不同的角色,如...
在Struts2的配置文件(struts.xml)中添加相应的配置。 3. **设置Content-Type和Content-Disposition**: - 在Action类中,使用`ValueStack`或`ActionContext`来设置HTTP响应的`Content-Type`和`Content-...
文件上传需要配置Struts2的配置文件,通常为`struts.xml`。在这个配置文件中,需要定义一个或多个与Action类对应的Action配置,设置`result`来指定成功后跳转的页面。同时,我们还需要配置`struts.multipart.saveDir...
2.能够对上传路径进行配置文件指定(upload.properties),使用了一些类似单例模式的静态代码块 3.Struts2进行下载处理,能对上传的所有文件进行下载(多个) 4.文件保存的名称UUID生成,不过显示并下载的名称都是原...
2. **配置struts.xml**:在Struts2的配置文件中,我们需要为这个Action添加相应的配置,指定返回的`StreamingResult`结果类型和对应的视图。 ```xml <param name="contentType">application/octet-stream ...
自己学会的,保存的学习网页,给大家分享 struts2 国际化
然后,在struts.xml配置文件中启用`struts.multipart.parser`参数为`copy`,这样Struts2会自动处理文件上传。 ```xml <constant name="struts.multipart.parser" value="copy"/> ``` 在Action类中,你可以这样...
接着,我们需要在Struts配置文件(struts.xml)中配置Action,确保它能够处理文件上传的请求。配置通常包括Action的名称、对应的类以及结果页面。例如: ```xml <result name="success">/success.jsp ...
在`struts.xml`配置文件中添加以下配置: ```xml <constant name="struts.multipart.enabled" value="true"/> <constant name="struts.multipart.maxSize" value="20971520"/> <!-- 20MB --> ``` 这里我们启用了...
首先,要在`struts.xml`配置文件中启用文件上传支持,设置`struts.multipart.parser`为`jakarta`或`native2ascii`。然后,在Action类中创建一个`java.io.File`或者`org.apache.struts2.dispatcher.multipart....
#### 二、Struts配置文件解析与存储机制 **2.1 org.apache.struts.config包的作用** 在Struts框架中,`org.apache.struts.config`包承担了配置文件解析与信息存储的重要任务。当应用启动时,框架会读取配置文件,...
Struts2是一个强大的Java EE平台上的MVC框架,它的设计目标是简化Web应用程序的...以上便是Struts2配置文件的使用和代码详解,通过理解这一框架的工作原理和优势,开发者可以更加高效地利用Struts2来构建Web应用程序。
#### 二、Struts配置文件概述 ##### 1. Struts配置文件格式 Struts配置文件是以XML格式编写的。这种格式易于理解和维护,并且可以利用现有的XML工具进行解析和验证。Struts框架会在应用程序启动时加载并解析`...
在Java编程中,读取配置文件是常见的任务,主要用于存储应用程序的设置或环境变量,以方便管理和维护。Java提供了一个内置的`java.util.Properties`类,用于处理`.properties`文件,这种格式通常用来存储键值对,即...
首先,你需要在项目的配置文件(如struts.xml)中启用文件上传的支持,并配置相应的拦截器。接着,在Action类中创建一个字段来接收上传的文件,Struts2会自动将文件内容绑定到这个字段上。 例如,你可以创建一个名...