Java ApacheCook 2.2:从操作返回参数,并在HTML页面中使用它来填充表

Java ApacheCook 2.2:从操作返回参数,并在HTML页面中使用它来填充表,java,html,apache-cocoon,Java,Html,Apache Cocoon,我想做什么? 我正在从事一个Apache Cocoon项目,希望找到在HTML页面中返回参数的解决方案 我需要获取参数,它具有ArrayList类型,并在HTML页面中使用它来填充表。我该怎么做?设置请求参数是否正确?如果是,那么如何在HTML代码中使用它?如果否,那么如何正确返回参数 ActionClass.java public class ActionClass implements Action, ThreadSafe{ public Map act(Redirector

我想做什么?

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

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

ActionClass.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;
    }

}

我正在尝试做这样的事情,它似乎起了作用:

    <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>


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

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

无论如何。。。如何将动作中的内容返回到HTML中?让我们看一个例子:

动作类:因为它扩展了动作,所以必须返回一个映射。只需在此处添加需要传递到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;
    }
}
<?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>
package com.stackoverflow;
公共类Action类扩展了Action{
公共映射行为(重定向器重定向器、SourceResolver解析器、映射对象模型、字符串源、参数参数){
Map sitemapParams=newhashmap();
sitemapParams.put(“myVariable”,“helloworld!”);
返回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:

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;
    }
}
<?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>

...
...
您可以在中获得有关操作、生成器和站点地图的更多信息。它来自ApacheCook 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) {
        }
    }

}
import org.xml.sax.InputSource;
导入org.xml.sax.XMLReader;
导入org.xml.sax.helpers.XMLReaderFactory;
...
公共类生成器类扩展了AbstractGenerator{
私人字符串foo;
@凌驾
public void安装程序(SourceResolver resolver、Map objectModel、String src、Parameters params)抛出ProcessingException、SAXException、IOException{
setup(解析器、objectModel、src、params);
//您可以在此处读取输入参数:
foo=params.getParameter(“someParameter”);
}
public void generate()引发IOException、SAXException、ProcessingException{
arraylistbean=xQuery(foo);
//让我们构建XML文档。我将通过手动添加文本字符串来实现,
//但是没有必要,我们可以使用Xstream或任何类似的库
StringBuilder xml=新的StringBuilder();
xml.append(“”);
//遍历数组列表。。。
for(结果bean b:bean){
xml.append(“”);
append(“”).append(b.getId()).append(“”);
append(“”).append(b.getTitle()).append(“”);
xml.append(“”);
}
//…然后我们结束XML字符串
xml.append(“”);
//将XML返回Cocoon的管道
XMLReader=XMLReaderFactory.createXMLReader();
setContentHandler(super.xmlConsumer);
InputSource=新的InputSource(新的StringReader(xml.toString());
parse(源代码);
试一试{
这个.finalize();
}捕获(可丢弃的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 2.1的官方教程,但对Cocoon 2.2也是有效的。

首先感谢您的回复!我需要行动,是的。我在一种情况下调用basex库,在另一种情况下调用sesame rdfstore来收集/更新数据。关键是我的参数不是一个简单的字符串,而是一个ResultBean对象的整个Arraylist,我想读取这种类型的结构,它比一个简单的字符串更复杂。我需要你帮助我如何处理这类对象。再次查看问题,我编辑以显示ResultBean类,这样您可以更好地“体验”我的问题;)这就是为什么我建议用发电机代替动作。对于操作,您只返回基于所做操作结果的文本。使用生成器构建整个XML,然后对其进行转换和序列化。您可以轻松地将bean转换为XML(可能使用Xstream,或者只是“手动”附加字符串),然后使用XSLT转换基于该数据构建HTML表。我是说手动发电机。。。您能解释/演示如何使用Arraylist之类的对象格式化这样的内容吗?提前谢谢!我包括了一个带有生成器的简短示例,还添加了一个指向教程的链接