Struts2的结果类型怎么配置为返回XML

8次阅读

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

Struts2的结果类型怎么配置为返回XML

Struts2中配置result-type为XML需要自定义还是内置支持?

Struts2本身不提供开箱即用的xml结果类型。你不能直接在struts.xml里写——这会抛出NoResultTypeException。必须手动注册一个自定义结果类型,或改用更轻量、更可控的方式:用dispatcher转发到一个仅输出XML的Action方法,或直接用stream结果类型返回原始XML内容。

stream结果类型返回XML最简单可靠

stream是Struts2内置结果类型,适合返回任意二进制或文本内容(如XML、jsonpdf)。它绕过视图层,直接写入http响应流,避免模板渲染干扰XML结构。

  • 确保Action类中有一个返回String的getter方法(如getXmlContent()),内容为合法XML字符串(注意转义)
  • struts.xml中配置result时,指定contentTypetext/xmlapplication/xml
  • 设置inputName指向你的XML内容getter方法名(不带get前缀)
        text/xml;charset=UTF-8     xmlContent    

对应Action需有:

private String xmlContent = "Alice";  public String getXmlContent() {     return xmlContent; }

为什么不用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字符串、streamcontentType参数、HTTP响应头、客户端解析器三者编码必须严格一致,否则出现中文乱码或解析失败,而错误往往只表现为“XML格式错误”这类模糊提示。

text=ZqhQzanResources