Struts1:如何从Java类取常量并在struts-config.xml的action path中引用?
Struts1中在struts-config.xml的action path属性引用Java常量的方案
由于Struts1原生不支持在XML配置中直接引用Java类的常量,要实现避免路径重复配置的需求,可采用以下几种可行方案:
方案一:扩展Struts配置加载器,动态替换占位符
- 先在Java类中定义全局路径常量:
public class PathConstants { // 需要复用的权限限制路径 public static final String VIEWER_RESTRICTED_PATH = "/path"; } - 修改struts-config.xml的action配置,用占位符代替硬编码路径:
<action path="${PATH_CONSTANTS.VIEWER_RESTRICTED_PATH}" type="com.webapp.actions.Action" name="form" scope="session" input="/input.jsp" > </action> - 自定义配置加载类,继承Struts的
XmlActionConfigProvider,重写解析逻辑:- 在解析action节点的path属性时,识别占位符,通过反射读取
PathConstants类中的常量值,替换占位符。
- 在解析action节点的path属性时,识别占位符,通过反射读取
- 在web.xml中配置ActionServlet时,指定使用自定义的配置加载器,确保初始化时完成路径替换。
方案二:用构建工具(Ant/Maven)做资源过滤
这种方式是在项目构建阶段完成路径替换,适合不需要动态变更路径的场景:
- 定义路径常量:可以在Java类中定义,或者直接写在properties文件中(比如
app.properties):restricted.path=/path - struts-config.xml中使用占位符:
<action path="${restricted.path}" type="com.webapp.actions.Action" name="form" scope="session" input="/input.jsp" > </action> - 配置构建工具开启资源过滤:
- 以Maven为例,在pom.xml中设置资源目录的过滤属性,将struts-config.xml所在目录标记为需要过滤的资源,构建时自动将占位符替换为实际路径值。
- 如果要直接引用Java类的常量,可借助Maven的properties-maven-plugin插件,读取类中的常量值并注入到构建环境中。
方案三:统一用properties管理路径,Java与XML共用
把路径常量集中放在properties文件中,Java类和XML配置都基于这个文件获取值:
- 创建
app.properties文件:restricted.path=/path - Java类中读取该常量:
public class PathConstants { public static final String VIEWER_RESTRICTED_PATH; static { Properties props = new Properties(); try { props.load(PathConstants.class.getClassLoader().getResourceAsStream("app.properties")); VIEWER_RESTRICTED_PATH = props.getProperty("restricted.path"); } catch (IOException e) { throw new RuntimeException("加载路径配置失败", e); } } } - 结合方案一或方案二,让struts-config.xml中的path属性读取properties文件中的值,实现路径统一管理。
注意事项
- 自定义配置加载器需要注意Struts的初始化顺序,确保常量类在配置加载前已被加载。
- 构建工具过滤的方式更简单,但要保证开发、测试、生产环境的配置文件一致,避免构建后路径出错。
内容的提问来源于stack exchange,提问作者Ashutosh Dubey
相关产品推荐
相关产品推荐

