`

使用struts2 返回 xslt result 资料

阅读更多

今天本打算做一些基于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中暂时还没发现类似问题

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lgb934/archive/2009/04/02/4042310.aspx

 

 

Struts 2 XSLT输出XML响应

 

在写一个简单的Ajax下拉列表时,希望用Action返回一个XML的响应,在网上遍寻未果时发现一个国外友人的例子http://cse-mjmcl.cse.bris.ac.uk/blog/2007/09/10/1189430125294.html .发现实现起来很简单.

1.       Action其实是一个POJO,所以我们可以直接把Action生成一个XML.只要把Result Type设为xslt就可以了:

      <action name="XmlModel" class="cpu.XmlModelAction">

            <result name="success" type="xslt" />

      </action>

里面包含了Action的所有属性,还有Locale等信息. 可以在浏览器里输入http://localhost:8080/XXX/XXX/XmlModel.action来看.

 

2.       为了定制自己想要的XML,我们可以输入参数来输出自己想要的Action的某个属性(属性可以是一个List).

      <action name="XmlModel" class="cpu.XmlModelAction">

            <result name="success" type="xslt">

                  <param name=”exposedValue”>modelList</param>

            </result>

      </action>

 

3.       如果有多于一个属性呢.加个大括号围起来

      <action name="XmlModel" class="cpu.XmlModelAction">

            <result name="success" type="xslt">

                  <param name=”exposedValue”>{modelList, type}</param>

            </result>

</action>

 

4.       以上三个方法都是由Action 来控制生成格式.那么对于我们这种控制欲很强的人来说并不满足,最好是由我们自己来定义生成样子.那么这时我们就要做的就是在属性里生成一个org.w3c.dom.Document属性.注意:不要用org.dom4j.Document.要不会出现转化错误,死得很惨.

      <action name="XmlModel" class="cpu.XmlModelAction">

      <result name="success" type="xslt">

            <param name="exposedValue">xmlDoc</param>

      </result>

</action>

上面的xmlDoc就是 Action里的org.w3c.dom.Document类型.

 

5.       我只会用并且非要用org.dom4j.Document类怎么办? 那就在最后转化成 org.w3c.dom.Document:

package zju.cs.lr.util;

 

import java.io.ByteArrayInputStream;

import java.io.IOException;

 

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

 

import org.xml.sax.SAXException;

 

public class XmlUtil {

 

      private XmlUtil() {

      }

 

      public static org.w3c.dom.Document XmlString2W3cDom(String xml)

                  throws SAXException, IOException, ParserConfigurationException {

            byte[] byteArray = xml.getBytes("UTF-8");

            ByteArrayInputStream baos = new ByteArrayInputStream(byteArray);

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            org.w3c.dom.Document doc = factory.newDocumentBuilder().parse(baos);

            return doc;

      }

 

      public static org.dom4j.Document W3c2Dom4j(org.w3c.dom.Document doc) {

            if (doc == null) {

                  return (null);

            }

            org.dom4j.io.DOMReader xmlReader = new org.dom4j.io.DOMReader();

            return (xmlReader.read(doc));

      }

 

} 

Action里加上一句: xmlDoc = Xmlutil.XmlString2W3cDom(dom4jDoc.asXML());

上面的xmlDoc就是 Action里的org.w3c.dom.Document类型.

 

6.       上面写一个类很烦,有没有更简单的方法? 还真有.这就用到了Javainterface的强大之处了.org.dom4j.dom.DOMDocumentFactory()来建立Document.而不要用DocumentHelper.createDocument()来产生.最后直接cast一下.

 

    public String execute() throws UnsupportedEncodingException, ParserConfigurationException, SAXException, IOException {

       InfoCpuService cpuSvc = null;

       cpuSvc = (InfoCpuService) ServiceLocator.getInstance().getService(InfoCpuService.class);

 

       modelList = cpuSvc.getModels(prodBrand);

 

       log.info(ReflectionToStringBuilder.toString(this));

 

       org.dom4j.Document dom4jDoc = new org.dom4j.dom.DOMDocumentFactory().createDocument();

 

       // doc = DocumentHelper.createDocument();

       // Element root = DocumentHelper.createElement("root");

Element root = dom4jDoc.addElement("root");

       root.addAttribute("prodType", "CPU");

 

       for (Object o : modelList) {

           root.addElement("model").addAttribute("name", (String) o);

       }

 

       //xmlDoc = XmlUtil.XmlString2W3cDom(doc.asXML());

       xmlDoc = (Document) dom4jDoc;

 

        HttpServletResponse response = ServletActionContext.getResponse();

        response.setContentType("text/xml;charset=UTF-8");

        response.setHeader("Cache-Control", "no-cache");

        

       return SUCCESS;

    }

 

其中三句代码是为了防止生成中文乱码

        HttpServletResponse response = ServletActionContext.getResponse();

        response.setContentType("text/xml;charset=UTF-8");

        response.setHeader("Cache-Control", "no-cache");

 

至此大功告成.

 

 

分享到:
评论

相关推荐

    struts2 xslt result 实现

    于是就研究使用Struts2的XSLT result方式来做页面显示。 网上相关的内容非常的少,我也研究了好久才玩转的。一开始总是有一些莫名其妙的问题出现,但最后基本上都是和配置相关的比较多。现在这个例子是整个工程项目...

    struts2的XSLTResult结果类型

    这篇博文将深入探讨Struts2的XSLTResult结果类型及其工作原理。 XSLT(Extensible Stylesheet Language Transformations)是一种转换XML文档的样式表语言。通过应用XSLT,可以将XML数据转换成HTML、PDF或其他格式,...

    struts2框架XSLTResult本地文件代码执行漏洞1

    该漏洞主要出现在Struts2框架中使用XSLTResult类型的Action来处理用户请求时,允许攻击者通过精心构造的输入来执行任意代码。 首先,我们来了解一下XSLTResult。XSLTResult是Struts2框架中用于处理XML数据的一种...

    struts2 result配置详解

    Struts2 Result 配置详解 Struts2 框架中 Result 配置是一种非常重要的配置,它直接影响着应用程序的执行结果。Result 配置通常用于定义 Action 的执行结果,例如将结果.redirect 到一个新的 URL,或者将结果....

    Struts2_result返回类型

    9. **xslt**:XSLTResult类使用XSLT转换XML文档,可以将XML数据转换成HTML或其他格式。 10. **plainText**:PlainTextResult类返回纯文本内容,适用于返回简单的文本信息,而不是HTML。 除了以上列出的,还有一些...

    Struts2 Result类型

    默认情况下,如果未指定Result类型,Struts2将使用Dispatcher Result。 3. **FreeMarker Result (type="freemarker")** FreeMarker Result用于处理FreeMarker模板文件。FreeMarker是一种强大的模板引擎,可以动态...

    struts2的action的几种result type说明

    `class="org.apache.struts2.views.xslt.XSLTResult"`。 10. **plainText**: PlainText Result Type用于生成纯文本内容,常用于API响应或简单的文本输出。`class="org.apache.struts2.dispatcher.PlainTextResult"`...

    Struts2 result和type

    ### Struts2中的Result与Type详解 #### 一、引言 在Struts2框架中,`Result`和`Type`是两个非常重要的概念。它们主要用于控制Action执行完毕后页面的跳转方式以及如何处理Action返回的结果。通过合理配置`Result`与...

    Struts2入门教程(全新完整版)

    org.apache.struts2.views.xslt.XSLTResult 16 全局result: 17 动态Result:了解 18 12.异常处理 18 三、在Action获取Scope对象 19 方式一、与Servlet解耦合的非IOC方式 20 方式二、与Servlet解耦合的IOC方式 21 ...

    Struts2漏洞利用工具2017版

    防范措施包括禁用不使用的Struts2插件,尤其是XSLT插件,并及时更新框架至修复此问题的最新版本。 S2-019,又称为“Struts2 Rest Plugin远程代码执行漏洞”,主要是由于Struts2 REST插件处理XML请求时存在的问题,...

    Struts2属性文件详解

    该属性指定了Struts 2使用的FreeMarker管理器,默认值为`org.apache.struts2.views.freemarker.FreemarkerManager`。 #### struts.freemarker.wrapper.altMap 此属性只支持`true`和`false`两个属性值,默认值为`...

    struts2完全学习手册

    ### Struts2完全学习手册知识点解析 #### 一、Struts2简介 ##### 1. Struts2配置文件 ...通过以上解析,我们可以了解到Struts2框架的基本配置方法及其工作原理,这对于理解和使用Struts2至关重要。

    struts2_strus.xml中result类型及含义详解

    在Struts2中,当一个Action执行完毕后,它会根据Action返回的字符串(通常是"success"或"error")来决定下一步的动作。这个过程通过`result`配置来实现,`result`定义了Action执行完成后应转向何处,或如何处理结果...

    北大青鸟struts2.0培训基础教程

    在使用Struts2开发应用程序时,首先需要导入必要的JAR包,通常可以从Struts2的下载包中获取。然后,可以创建Action类,定义登录逻辑,并配置struts.xml文件以关联请求和Action。最后,利用Struts2的视图技术(如JSP...

    struts2.jar

    5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,用于在Action与视图之间传递数据。开发者可以在Action的属性和JSP标签中使用OGNL表达式。 6. **插件(Plugins)**:Struts2...

    struts2如何生成XML文件

    3. **配置Struts.xml文件**:在Struts2中,需要在`struts.xml`文件中配置结果类型为`xslt`,并指定`exposedValue`参数指向`getDocument()`方法返回的`Document`对象。 ```xml &lt;result type="xslt"&gt; ...

    Struts2 Result 参数详解

    在Struts2框架中,Result是处理Action执行后返回结果的核心组件。它负责将Action执行的结果导向到相应的视图或者进行其他处理,如重定向、文件下载等。Result的类型多种多样,可以根据实际需求选择合适的Result类型...

    struts 2 权威指南

    3. **结果类型和视图资源**:描述中提到,Struts 2不仅支持返回JSP页面或Action作为视图,还支持FreeMarker、Velocity和XSLT等不同的视图技术。这提供了极大的灵活性,允许开发者根据项目需求选择最适合的模板引擎。...

    北大青鸟struts2教程

    Struts2是一个流行的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。它在Struts1.x的基础上进行了重大改进,解决了前一版本存在的诸多问题,为开发者提供了更强大、灵活和易测试的解决方案。...

    深入浅出Struts2(附源码)

    本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...

Global site tag (gtag.js) - Google Analytics