1

我想做的事?

我正在开发一个 Apache Cocoon 项目,并希望找到在 HTML 页面中返回参数的解决方案。

我需要获取具有 ArrayList 类型的参数,并在 HTML 页面中使用它来填充表格。我怎样才能做到这一点?设置请求参数是否正确?如果是,那么如何在 HTML 代码中使用它?如果不是,那么如何正确返回参数?

动作类.java

public class ActionClass implements Action, ThreadSafe{


     public Map act(Redirector rdrctr, org.apache.cocoon.environment.SourceResolver sr, Map map, String string, Parameters params) throws Exception {


               // READ REQUEST
               Request request = ObjectModelHelper.getRequest(map);


               // DO SOMETHING XQUERY VIA BASEX, SPARQL RDFSTORE WHATEVER
               ArrayList<ResultBean> results = xquery();


               Map sitemapParams = new HashMap();

               // SET REQUEST PARAMETER
               request.setAttribute("results",results);

               return sitemapParams;
    }

}

ResultBean.java

package com.kiddo.grlegislation;

public class ResultBean {

    private String id;
    private String title;
    private String type;

    public void setId(String i){
        this.id = i;
    };

     public void setTitle(String t){
        this.title = t;
    };

    public String getId(){
        return this.id;
    };

    public String getTitle(){
        return this.title;
    };



}
4

2 回答 2

1

我正在尝试做这样的事情,它似乎有效:

    <map:pipeline id="pd-version">
      <map:match pattern="pd/*/*">
        <map:aggregate element="foo">
            <map:part src="cocoon:/version-{1}-{2}.xml"/>
            <map:part src="http://localhost:8888/GRLegislation/pd/{1}/{2}/data.xml"/>
        </map:aggregate>
        <map:transform src="legislation_updated.xslt" type="xslt-saxon"/>
        <map:transform src="legislation.xslt" type="xslt-saxon">
        </map:transform>
        <map:serialize type="xhtml"/>
      </map:match>
    </map:pipeline>

    <map:pipeline>
    <map:match pattern="version-*-*">
      <map:generate type="versiongen">
            <map:parameter name="type" value="pd"/>
            <map:parameter name="year" value="{1}"/>
            <map:parameter name="id" value="{2}"/>        
      </map:generate>
      <map:serialize type="xml"/> 
    </map:match> 
    </map:pipeline>

<map:part>从到未正确加载参数<map:match>。我还有一些 XSLT 问题,因为现在我们有不同的 XML 根。

于 2014-02-05T14:59:52.210 回答
1

首先,你确定你需要一个动作吗?操作旨在以某种方式执行(更新数据库中的某些内容、调用 Web 服务等)。如果您只需要生成内容,那么 Generator 类可能更适合您...

无论如何......你怎么能从一个动作中返回一些东西到 HTML 中?让我们看一个例子:

Action 类:因为它扩展了 Action,所以它必须返回一个 Map。只需在此处添加您需要传递给 HTML 的任何数据:

package com.stackoverflow;
public class ActionClass extends Action {
    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters params) {
        Map<String, String> sitemapParams = new HashMap<String, String>();
        sitemapParams.put("myVariable", "hello world!");
        return sitemapParams;
    }
}

sitemap.xmap:在您的站点地图文件中,您可以访问由操作返回的任何数据,方法是将其键放在括号中。然后你可以将它传递给你的 HTML 生成器:

<map:components>
    <map:actions>
        <map:action name="myAction" src="com.stackoverflow.ActionClass" />
    </map:actions>
</map:components>
...
<map:match ...>
    <map:generate ... />
    <map:act type="myAction">
        <map:transform src="myTransformation.xsl">
            <map:parameter name="something" value="{myVariable}"/>
        </map:transform>
    </map:act>
    <map:serialize .../>
</map:match>

myTransformation.xsl:您的 XSLT 文件应该读取数据并将其嵌入到您的 HTML 中:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:param name="something" select="'default value if you wish to specify one'"/>

    <xsl:template match="xxx">
        <html><body>...
            <xsl:value-of select="$something" />
        ...</body></html>
    </xsl:template>
</xsl:stylesheet>

您可以在此页面中获取有关操作、生成器和站点地图的更多信息。它来自 Apache Cocoon 2.1 文档,但它也适用于 2.2。


替代方法,使用生成器:

生成器类:此文件构建一个 XML 文档,然后将其传递到管道中。你可以有这样的东西:

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
...

public class GeneratorClass extends AbstractGenerator {

    private String foo;

    @Override
    public void setup(SourceResolver resolver, Map objectModel, String src, Parameters params) throws ProcessingException, SAXException, IOException {
        super.setup(resolver, objectModel, src, params);
        // you can read input parameters in here:
        foo = params.getParameter("someParameter");
    }

    public void generate() throws IOException, SAXException, ProcessingException {
        ArrayList<ResultBean> beans = xQuery(foo);

        // Let's build the XML document. I'll do it by manually appending text strings,
        // but there is no need, we could just use Xstream or any similar library
        StringBuilder xml = new StringBuilder();
        xml.append("<results>");

        // Iterate through the array list...
        for (ResultBean b : beans) {
            xml.append("<result>");
            xml.append("<id>").append(b.getId()).append("</id>");
            xml.append("<title>").append(b.getTitle()).append("</title>");
            xml.append("</result>");
        }

        // ... and we end the XML string
        xml.append("</results>");

        // Return the XML to Cocoon's pipeline
        XMLReader xmlreader = XMLReaderFactory.createXMLReader();
        xmlreader.setContentHandler(super.xmlConsumer);
        InputSource source = new InputSource(new StringReader(xml.toString()));
        xmlreader.parse(source);
        try {
            this.finalize();
        } catch (Throwable e) {
        }
    }

}

Sitemap.xmap:您只需要调用您的生成器,然后将您的 XSLT 应用于生成的 XML:

<map:components>
    <map:generators>
        <map:generator type="myGenerator" src="com.stackoverflow.GeneratorClass" />
    </map:generators>
/<map:components>

<map:generate type="myGenerator">
    <!-- if you need to pass input data to the generator... -->
    <map:parameter name="someParameter" select="{request-param:something}" />
</map:generate>
<map:transform src="myTransformation.xsl" />
<map:serialize type="html"/>

myTransformation.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <html>
        <head></head>
        <body>
            <table>
                <xsl:for-each select="results/result">
                    <tr>
                        <td><xsl:value-of select="id/text()"/></td>
                        <td><xsl:value-of select="title/text()"/></td>
                    </tr>
                </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>

您可以在此处获取有关 Cocoon 生成器的更多信息。再一次,它是 Cocoon 2.1 的官方教程,但它也适用于 Cocoon 2.2。

于 2014-02-05T15:09:00.797 回答