Struts2不内置XML结果类型,需用stream结果类型返回XML;配置时指定contentType和inputName,确保编码一致,避免用JSP生成以防格式破坏。

Struts2中配置result-type为XML需要自定义还是内置支持?
Struts2本身不提供开箱即用的xml结果类型。你不能直接在struts.xml里写——这会抛出NoResultTypeException。必须手动注册一个自定义结果类型,或改用更轻量、更可控的方式:用dispatcher转发到一个仅输出XML的Action方法,或直接用stream结果类型返回原始XML内容。
用stream结果类型返回XML最简单可靠
stream是Struts2内置结果类型,适合返回任意二进制或文本内容(如XML、JSON、PDF)。它绕过视图层,直接写入HTTP响应流,避免模板渲染干扰XML结构。
- 确保Action类中有一个返回
String的getter方法(如getXmlContent()),内容为合法XML字符串(注意转义) - 在
struts.xml中配置result时,指定contentType为text/xml或application/xml - 设置
inputName指向你的XML内容getter方法名(不带get前缀)
text/xml;charset=UTF-8 xmlContent
对应Action需有:
private String xmlContent = ""; public String getXmlContent() { return xmlContent; } Alice
为什么不用dispatcher + JSP生成XML?
虽然可行,但风险高:JSP默认添加空白符、换行、BOM头,极易破坏XML格式有效性;EL表达式或JSTL可能意外转义特殊字符(如&变成&);且JSP生命周期引入不必要的复杂度。
- 若坚持用JSP,必须在页面顶部加
并禁用所有自动输出(如trimDirectiveWhitespaces="true") - 禁止使用
直接输出未转义数据;应统一用 - 调试时用
curl -v检查响应头Content-Type和实际body是否含不可见字符
自定义XML结果类型是否值得做?
仅当项目存在大量类似需求(如统一XML包装、签名、压缩)且已建立稳定扩展机制时才考虑。否则得不偿失:需继承StrutsResultSupport,重写doExecute,手动构建Document或序列化Object,还要在struts.xml中用注册新类型。
真正容易被忽略的是字符编码一致性:Action中XML字符串、stream的contentType参数、HTTP响应头、客户端解析器三者编码必须严格一致,否则出现中文乱码或解析失败,而错误往往只表现为“XML格式错误”这类模糊提示。









