Struts2 配置文件详解
Struts2 的配置体系主要可以分为两大部分:Web 容器层面的配置(web.xml)和框架内部的配置。框架内部又细分为执行环境的全局配置以及具体组件的配置。
1. Web.xml 配置
在 Struts2 中,核心控制器是一个过滤器。早期版本(2.0.x)使用的是 FilterDispatcher,但从 2.1 开始统一为 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。这是整个 Web 应用的基础入口,必须在 web.xml 中注册。
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
对于基础应用,上述配置已足够。剩下的工作就是配置全局环境和组件细节,比如 Action 映射、拦截器等。
2. struts.properties 文件
这个文件用于覆盖框架的默认行为。虽然默认情况下不需要修改,但了解它的机制很有必要。
Struts2 启动时会先加载 jar 包内的 default.properties,然后查找项目中的 struts.properties。如果存在后者,则优先使用其中的配置覆盖前者。如果没有自定义文件,则完全采用默认值。
例如,default.properties 中定义了默认的请求后缀和编码:
# 默认请求后缀
struts.action.extension=action,,
# 默认编码
struts.i18n.encoding=UTF-8
我们可以在项目的 src 根目录下新建 struts.properties 来覆盖这些设置:
## 激活重新载入国际化文件的功能
struts.i18n.reload=true
## 修改请求后缀为 action 或者 do
struts.action.extension=action,do
## 打开开发者模式,修改配置后无需重启服务器
struts.devMode=true
注意:该文件编译后会位于 /WEB-INF/classes 下。
3. 核心 XML 配置文件
除了属性文件,Struts2 还依赖几个关键的 XML 文件:
- struts-default.xml:存放在
struts2-core包内,系统启动时自动加载。它定义了类型转换、拦截器、结果类型等核心组件。我们的业务配置通常继承自这里定义的struts-default包。 - struts-plugin.xml:用于加载第三方插件。当 classpath 中存在包含此文件的 jar 包时,框架会自动识别并加载。
- struts.xml:这是开发者最熟悉的文件,存放具体的 Action 配置、拦截器栈定义以及常量覆盖。文件名不可更改。
3.1 在 struts.xml 中覆盖全局配置
除了使用 struts.properties,我们也可以直接在 struts.xml 中使用 <constant> 标签来覆盖默认属性:
<struts>
<!-- 覆盖 default.properties 中的配置 -->
<constant name="struts.action.extension" value="do" />
<package name="com.wq" extends="struts-default">
<action name="login" class="com.wq.web.action.LoginAction">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
3.2 模块化拆分
随着项目扩大,struts.xml 会变得臃肿。我们可以利用 <include> 标签将其拆分为多个模块文件,提高可读性。
例如,在 struts.xml 中引入 struts-hello.xml:
<struts>
<include file="struts-hello.xml" />
<!-- 其他配置 -->
</struts>
4. 配置文件加载顺序
理解加载顺序有助于排查配置冲突问题。根据源码分析,大致顺序如下:
- default.properties:Jar 包内的全局默认配置。
- struts-default.xml:加载默认组件(拦截器、转换器)。
- struts-plugin.xml:加载插件配置。
- struts.xml:加载自定义组件及常量。
- struts.properties:自定义全局属性。若与 xml 中的常量冲突,通常以 properties 为准(视具体版本而定,建议保持单一来源)。
5. Package 与 Action 配置
在 struts.xml 中,Package 是管理 Action 和拦截器的基本单元。
- name:必填,包的标识符,用于被其他包引用。
- extends:可选,指定父包。大多数情况下应继承
struts-default,以便复用内置功能。 - abstract:可选,标记为抽象包,不能直接包含 Action。
Action 映射
Action 本身不生成响应,而是返回逻辑视图名称,由 <result> 映射到物理资源。
<action name="login" class="com.wq.web.action.LoginAction">
<!-- 默认 result name 为 success -->
<result>/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
通配符匹配
为了减少重复配置,可以使用通配符。例如 SearchUser_* 可以匹配所有以 SearchUser_ 开头的请求。
<package name="cn.ouuo.action" extends="struts-default">
<action name="SearchUser_*" class="searchAction" method="{1}">
<result name="listResult">/listResult.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
在这个例子中,访问 http://localhost:8080/ouuo/SearchUser_Manager.action 时,{1} 会捕获 Manager 并调用 searchAction 类中的 manager() 方法。这种动态映射方式在处理大量相似业务时非常高效。
