Struts2 的XSLTResult输出问题

来源:互联网 发布:怎么清除手机所有数据 编辑:程序博客网 时间:2024/05/20 23:33

一下内容为引用“

今天本打算做一些基于XML的WebService接口,不料遇到了bug,折腾了一个下午带半个晚上,最后才在网上搜到原因和解决办法,特来分享。

原本正常情况下,Struts2是支持将一个Action中的全部属性以XML形式输出的,这就是XSLTResult。在struts.xml中这样配置

<action name="getuser"
   class="org.lilystudio.winter.actions.service.GetUserAction">
   <result name="success" type="xslt">
   </result>
</action>

即可。

而为了输出Action中的某一个属性,需要增加一个param

<action name="getuser"
   class="org.lilystudio.winter.actions.service.GetUserAction">
   <result name="success" type="xslt">
     <param name="exposedValue">user</param>
   </result>
</action>


这里就是将user属性序列化成XML。属性的选择支持OGNL,也就是说,这里不仅可以填属性名,还可以填属性的属性,属性的集合等等,如

<param name="exposedValue">user.nickname</param>
<param name="exposedValue">{ user1,user2 }</param>


这里用的都是一个默认的XSL

<xsl:template match="/result">
   <result />
</xsl:template>


也可以通过用户指定的方式使用自定义的复杂的XSL

<param name="location">/WEB-INF/foo.xsl</param>


不过,据这篇文章的留言说在Struts2.0.11所使用的SimpleAdaptedDocument不支持DOM Level 3,与JDK中的Transformor冲突。于是会抛出这样的异常

javax.xml.transform.TransformerException: Operation not supported.


怎么办呢?同一篇文章给出了答案,使用一个自定义的XSL

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml"/>
   <xsl:template match="/">
     <xsl:copy-of select="."/>
   </xsl:template>
</xsl:stylesheet>

作者说这种方法不太pretty,不过在Struts2修改这个问题之前恐怕这是一个不错的办法了。最后我也是看到这个才免于一晚上的徒劳。

可惜我对XML、XSLT之类的知识还是欠缺不少,白白浪费了时间,很是无奈。

后来我稳到个更简单噶办法,就是将JDK改会JDK1.5就OK了,我试过在JDK1.6中会出现问题。在1.5中暂时还没发现类似问题

原创粉丝点击