如何在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
相关产品推荐
相关产品推荐

