You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Struts 2中自定义消息资源为XML文件而非Properties文件

Struts2 自定义XML消息文件替代Properties文件方案

注意:你提供的XML存在语法错误,<message>标签的闭合标签写成了</entry>,先修正为正确格式:

<messages>
  <message key="greeting">Hello!</message>
  <message key="farewell">Goodbye!</message>
</messages>

1. 自定义MessageResourceBundle

创建类继承org.apache.struts2.util.StrutsResourceBundle,重写核心方法实现XML消息加载:

import org.apache.struts2.util.StrutsResourceBundle;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

public class XmlMessageResourceBundle extends StrutsResourceBundle {
    private Map<String, String> messageMap = new HashMap<>();

    public XmlMessageResourceBundle() {
        // 加载classpath下的XML消息文件,可根据需求调整路径
        messageMap = XmlMessageParser.parseXml("/messages/messages.xml");
    }

    @Override
    protected Object handleGetObject(String key) {
        return messageMap.getOrDefault(key, null);
    }

    @Override
    public Enumeration<String> getKeys() {
        return new Vector<>(messageMap.keySet()).elements();
    }
}

2. 实现XML解析工具类

编写DOM解析工具,读取XML中的键值对:

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class XmlMessageParser {
    public static Map<String, String> parseXml(String filePath) {
        Map<String, String> messageMap = new HashMap<>();
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            InputStream is = XmlMessageParser.class.getResourceAsStream(filePath);
            Document doc = builder.parse(is);
            doc.getDocumentElement().normalize();

            NodeList nodeList = doc.getElementsByTagName("message");
            for (int i = 0; i < nodeList.getLength(); i++) {
                Element element = (Element) nodeList.item(i);
                String key = element.getAttribute("key");
                String value = element.getTextContent().trim();
                messageMap.put(key, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return messageMap;
    }
}

3. 配置Struts2使用自定义资源束

在struts.xml中指定自定义的资源束类:

<struts>
    <constant name="struts.custom.i18n.resources" value="XmlMessageResourceBundle"/>
</struts>

如果需要多语言支持,可以扩展XML命名规则(如messages_en.xml、messages_zh.xml),并在XmlMessageResourceBundle构造方法中根据当前Locale拼接文件路径加载对应文件。

4. 实际使用示例

  • JSP页面中使用Struts标签:
<s:text name="greeting"/>
<s:text name="farewell"/>
  • Action类中通过ActionSupport获取:
import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {
    public String execute() {
        String greeting = getText("greeting");
        String farewell = getText("farewell");
        // 业务逻辑处理
        return SUCCESS;
    }
}

内容的提问来源于stack exchange,提问作者naveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:43:11