使用Java技术在Cocoon中实现商业逻辑(7) Matcher和Action这两个组件可以为它们后面的组件提供能存取的Output变量。 这些output参数放在HashMap对象里,可以通过key名称(如:{1})来引用。 所有的管道都至少有一个由管道开始处的Matcher提供的HashMap。我们在管道中使用这个 HashMap对象,使用{1}可以取得HashMap中Key为1的值。 Cocoon本身包含一些内置的Action。其中有一个是依靠数据库来鉴别用户的Action。当我们 想保护Cocoon中的某些页面,只允许授权的用户访问时,可以将用户的ID和密码存储到数据 库里,然后使用DatabaseAuthenticationAction来做登录确认。 这个DatabaseAuthenticationAction要求我们提供一个XML描述文件来说明要使用哪个表和哪 些列。下面是这个描述文件的示例: <?xml version="1.0" encoding="UTF-8"?> <auth-descriptor> <connection>resources</connection> <table name="Users"> <select dbcol="USER_NAME" request-param="userid" to-session="userid"/> <select dbcol="USER_PASSWORD" request-param="userpwd"/> </table> </auth-descriptor> 上面这个文件说明用户认证Action将使用resources连接池和User表,request提交的userid参数 和userpwd参数将与User表中的USER_NAME和USER_PASSWORD列来比较,如果成功确认,将参 数userid写到session里。 当你在管道中使用一个Action时,它必须先在站点地图中的<map:components>块中的 <map:actions>块中定义。如下: <map:components> <!-- all other component definitions go here --> <map:actions> <map:action name="authenticator" src="org.apache.cocoon.acting.DatabaseAuthenticatorAction"/> <!-- other actions definitions go here --> </map:actions> </map:components> 一旦定义过后,就可以使用这个Action来负责我们要保护的区域。下面为要保护的区域定 义了三个管道: <map:match pattern="protected/login.html"> <map:read mime-type="text/html" src="secret/login.html"/> </map:match> <map:match pattern="protected/login"> <map:act type="authenticator"> <map:parameter name="descriptor" value=" secret/auth-info.xml"/> <map:redirect-to uri="index.html"/> </map:act> <map:redirect-to uri="login.html"/> </map:match> <map:match pattern="protected/*">