Struts2 中请求映射到 Action 的配置机制
基于 XML 配置的请求路由
在 Struts2 框架中,通过 <action> 元素将客户端的请求路径映射到具体的业务逻辑类(Action)及其方法。配置示例如下:
<struts>
<package name="main" extends="struts-default">
<action name="login" class="com.example.action.LoginProcessor" method="execute">
<result name="success">/views/success.jsp</result>
<result name="error">/views/error.jsp</result>
</action>
</package>
</struts>
name属性定义了请求的名称,对应 URL 中的 action 名称。class指定处理请求的 Java 类全限定名。method表示该类中具体执行的方法。
Package 包的配置要素
<package> 用于组织一组相关的 Action,其关键属性包括:
name:包的唯一标识,建议与模块或功能对应。namespace:URL 路径前缀,如设置为/admin,则访问路径为http://localhost:8080/app/admin/login.action。extends:继承自父包,通常为struts-default,以获取默认行为。abstract:设为true时,该包不能包含具体 Action,仅用于共享配置。
请求匹配流程解析
当访问地址为 http://localhost:8080/app/section/module/login.action 时,系统按以下顺序查找对应的 Action:
- 优先检查当前命名空间路径下的包是否存在(如
/section/module)。 - 若存在,则在其内部查找名为
login的 Action。 - 若未找到,向上一级路径(如
/section)继续搜索,直至根命名空间/。 - 若仍无匹配,抛出异常或触发默认动作。
动态方法调用(DMC)实现多方法支持 使用通配符可避免为每个方法单独定义 Action。例如:
<package name="user" namespace="/api" extends="struts-default">
<action name="user_*" class="com.example.action.UserAction" method="{1}">
<result name="success">/results/success.jsp</result>
<result name="fail">/results/failure.jsp</result>
</action>
</package>
此时:
- 请求
/api/user_add.action会调用UserAction类中的add()方法。 - 请求
/api/user_delete.action对应delete()方法。 {1}表示通配符捕获的部分,用于动态指定方法名。
通配符处理所有未明确定义的请求 可通过全局通配符拦截所有未知请求,自动返回同名页面:
<package name="fallback" namespace="/" extends="struts-default">
<action name="*" >
<result>/WEB-INF/pages/{1}.jsp</result>
</action>
</package>
此配置适用于所有未在其他地方声明的请求,例如:
- 访问
/about.action→ 显示/WEB-INF/pages/about.jsp - 只有当某个 Action 已显式定义时,才会优先执行其配置。
设置默认入口点 若用户访问未明确指定的 Action,系统可自动跳转至预设的默认 Action:
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="home"/>
<action name="home">
<result>/welcome.jsp</result>
</action>
</package>
当访问根路径(如 /app/)且无具体 Action 时,将自动导向 home Action。
修改请求后缀 可通过常量调整 Action 的扩展名,适应不同项目需求:
<constant name="struts.action.extension" value="do,action,html"/>
支持单个或多个后缀,如:
login.do、submit.action、view.html均可被识别。
配置文件编码 确保配置文件读取时使用正确的字符集:
<constant name="struts.i18n.encoding" value="UTF-8"/>
防止中文乱码问题。
引入多个配置文件 大型项目中可拆分配置文件,便于维护:
<struts>
<include file="security.xml" />
<include file="user-config.xml" />
</struts>
每个被引用的文件(如 security.xml)需独立存在并符合 Struts2 格式。