使用Java技术在Cocoon中实现商业逻辑(8) <map:match type="sessionstate" pattern="*"> <map:parameter name="attribute-name" value="userid"/> <map:match pattern="protected/*.html"> <map:read mime-type="text/html" src=" secret/*.html"/> </map:match> <map:match pattern="protected/*.xsp"> <map:generate type="serverpages" src=" secret/{1}.xsp"/> <map:serialize type="xml"/> </map:match> </map:match> <map:redirect-to uri="login.html"/> </map:match> 第一个管道简单的提供了一个登录的表单,是个HTML文件,不需要转换。第二个管道处理 从login.html提交的实际的登录动作。第三个来处理我们要保护的内容。 下面我们做详细的论述: DatabaseAuthenticationAction依靠描述文件来验证登录。但是,我们如何知道验证是否 成功呢?对于Action,如果它们返回了有效的HashMap,那么在<map:act>块里的部分将执 行。如果返回null值,那么块下面的部分将执行。也就是说,按照上面管道的定义,我们 有两种可能的结果,即:如果认证通过,我们就可以到达受保护的区域,如果失败将返回 到Login页面。 在 protected/* 管道有几个嵌套的Matcher,第二个的type是sessionstate,这个Matcher 实际上是WildcardSessionAttributeMatcher,在这里用来读取session里的userid的值。 在这个例子中,我们知道DatabaseAuthenticationAction设置了一个叫userid的session属 性,我们通过检测userid属性来判断用户是否登录成功,如果它不存在,则转向到login页面。 在Cocoon已经有一个DatabaseAddAction可用来插入数据,但为了更好的理解Action,我们 将写一个自己的Action用来将新的Resource记录插入到Resources表中。 我们假想你已经编写了一个HTML页面,可用来POST两个变量name和url到管道。我们的 Action将从Request对象中找回name和url参数,将其插入到表中,最后返回一个HashMap对象。 下面是程序代码: package test; import org.apache.avalon.excalibur.datasource.DataSourceComponent; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.ComponentSelector; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.activity.Disposable; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Redirector;