首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ApacheCococoon2.2:从操作返回参数,并在HTML页面中使用它来填充表

ApacheCococoon2.2:从操作返回参数,并在HTML页面中使用它来填充表
EN

Stack Overflow用户
提问于 2014-02-04 10:42:25
回答 2查看 778关注 0票数 1

我想做什么?

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

我需要获取具有ArrayList类型的参数,并在HTML中使用它来填充表。我该怎么做?设置请求参数正确吗?如果是,那么如何在HTML代码中使用它?如果不是,那么如何正确地返回参数?

ActionClass.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
    };



}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-05 15:09:00

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

不管怎样..。如何将动作中的内容返回到HTML中?让我们用一个例子来看它:

操作类:因为它扩展了Action,所以它必须返回一个Map。只需将需要传递到HTML的任何数据添加到那里:

代码语言:javascript
复制
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生成器:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<?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>

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

另一种方法,用生成器:

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<?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>

您可以获得更多关于茧生成器这里的信息。同样,这是Cocoon2.1的官方教程,但对于Cocoon2.2也是有效的。

票数 1
EN

Stack Overflow用户

发布于 2014-02-05 14:59:52

我试着做这样的事情,它看起来很有效:

代码语言:javascript
复制
    <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根。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21550156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档