Java ApacheCook 2.2:从操作返回参数,并在HTML页面中使用它来填充表
我想做什么? 我正在从事一个Apache Cocoon项目,希望找到在HTML页面中返回参数的解决方案 我需要获取参数,它具有ArrayList类型,并在HTML页面中使用它来填充表。我该怎么做?设置请求参数是否正确?如果是,那么如何在HTML代码中使用它?如果否,那么如何正确返回参数 ActionClass.javaJava 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
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之类的对象格式化这样的内容吗?提前谢谢!我包括了一个带有生成器的简短示例,还添加了一个指向教程的链接