[摘要]resourceUrl == null) getLogger().error("Missing input parameters"); return null; Map ma...
resourceUrl == null) {
getLogger().error("Missing input parameters");
return null;
}
Map map = new HashMap();
DataSourceComponent dataSource = getDataSource(poolName);
Connection conn = null;
boolean status = false;
try {
conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
String cmd = "insert into Resources values (´" +
resourceName + "´, ´" +
resourceUrl + "´)";
stmt.executeUpdate(cmd);
map.put("resource-name", resourceName);
map.put("resource-url", resourceUrl);
getLogger().debug("Resources insert completed by user " +
ses.getId());
status = true;
stmt.close();
} catch (Exception e) {
getLogger().error("Stmt failed: ", e);
} finally {
try {
if (conn != null) conn.close();
} catch (SQLException sqe) {
getLogger().warn("Error closing the datasource", sqe);
}
}
if (!status) return null;
return(map);
}
public void dispose() {
this.manager.release(dbselector);
}
}
这儿有大量的东西需要消化,特别是如果你不熟悉Cocoon的结构。我们一步步的来说明。
首先,Cocoon action的主方法是 act(),当在管道中使用Action时Cocoon将调用这个方法。
在这个示例中,act()得到Request参数、从连接池中得到数据库连接,执行插入,然后填充
HashMap对象,并将其返回。
在Act方法的开始是从ObjectModelHelper组件中取得Request对象,然后得到两个参数。这个
Action需要另外一个参数,pool;它将告诉我们使用哪个连接池。如果这个参数没有,那么
Action将返回null而且将错误写到日志里。有了pool的名称,我们就可以从连接池得到数据
库的连接。Avalon的Excalibur组件用来负责Cocoon的连接池。如果你不熟悉Avalon,可以
访问这里http://jakarta.apache.org/avalon/ 。
代码中的insert statement是直接的JDBC语法。在插入成功后,会将成功的信息写到日志里。
对于日志,如果按上面Action的写法,所有的日志信息都写到你的Web Application的
WEB-INF/logs/sitemap.log文件。
最后,我们将两个输入参数写到了Map对象,虽然它们都在Request对象中,这样做是多余的,
但我们这样做是为了示例Map对象的用法。
看一下这个Action在站点地图中的定义。我们必须首先在站点地图的<map:components>区定
义这个Action。
<map:components>
<!-- all other component definitions go here -->
<map:actions>
<map:action name="authenticator"
src="org.apache.cocoon.acting.DatabaseAuthenticatorAction"/>
<map:action name="add-resource" src="test.AddResourceAction"
logger="sitemap.action.AddResourceAction"/>
<!-- other actions definitions go here -->
</map:actions>
</map:components>
在管道中使用这个Action:
<map:match pattern="addresource">
<map:act type="add-resource">
<map:parameter name="pool" value="resources"/>
<map:read mime-type="text/html" src="examples/confirmation.html"/>
</map:act>
<map:read mime-type="text/html" src="examples/addresource.html"/>
</map:match>
可以看到,在<map:act> 行的下面,紧跟着的<map:parameter>标签为Action提供"pool"参数。
一切顺利的话,Action将返回一个Map对象,confirmation页面将被显示。
在浏览器中打开http://localhost:8080/cocoon/addresource,你会看到一个输入表单。
表单提交后,如果插入成功,将显示confirmation页面,如果出现错误,将再次返回到表单
页面。查看WEB-INF/logs/sitemap.log,错误信息会告诉你出现了什么错误。
如何有效的使用XSP和Action?
XSP和Action是在Cocoon中实现逻辑的两种不同的办法。选择哪一种更适合呢?
XSP在取数据或者创建结构化的数据方面是很有用的。Action被证明在控制数据流程
(并不产生或者影响数据)的逻辑实现上很有用。我们上面看到的用户验证和数据库
操作便是这样的两个例子。
然而,有一点需要说明的问题:XSP会将逻辑和内容混合。而Cocoon的一个基本的原则
就是逻辑、内容、表示的分离。
在使用XSP的时候,我们提出以下几点建议:
首先,尽可能的使用逻辑单,逻辑单会很好的将Java代码隐藏。
第二,尽量使用Cocoon的提供的功能,如:在做数据库的Select的时候,我们也可以用
SqlTransformer来实现。
第三,在决策方面的逻辑尽可能的使用Selector, Matcher或Action组件。
最后,当无法避免在你的XSP中插入Java逻辑的话,尽可能的让<xsp:logic>小,而且不要
把它们散布到各种你的标签中。
关键词:运用Java技术在Cocoon中完成商业逻辑