2021SC@SDUSC山东大学软件学院软件工程应用与实践 COCOON 第十三篇

2021SC@SDUSC

接下来的部分可能相对之前而言更为零散,为sitemap的组件,大多都只实现了零星功能,代码简单,不多加以具体分析。

目录

sitemap-components:

acting:

ClearCacheAction:

ClearPersistentStoreAction:

FormValidatorAction:

HelloAction:

HttpCasheAction:

HttpHeaderAction:

InputModuleAction:


sitemap-components:

acting:

ClearCacheAction:

继承 org.apache.cocoon.acting.ServiceableAction,实现ThreadSafe接口,确保清除缓存中所有缓存结果的简单操作。

通过内部的act方法执行,清除缓存,若出错,则抛出异常。

ClearPersistentStoreAction:

继承 org.apache.cocoon.acting.ServiceableAction,实现ThreadSafe接口,确保清除持久存储的简单操作。

通过内部的act方法执行,清除永久存储,若出错,则抛出异常。

FormValidatorAction:

继承org.apache.cocoon.acting.AbstractValidatorAction,实现ThreadSafe接口。

这是用于验证请求参数的操作。参数通过外部 xml 文件进行描述(其格式 AbstractValidatorAction 中定义)。

createMapOfParameters方法从包含在活动约束列表中的所有参数的请求参数中读取参数值。如果一个参数有多个值,则所有值都存储在结果映射中。

HelloAction:

继承 org.apache.cocoon.acting.ServiceableAction,实现ThreadSafe接口,跟踪Session对象是否已创建的简单操作。

通过act方法记录Session对象是否已创建的简单操作。

HttpCasheAction:

继承 org.apache.cocoon.acting.ServiceableAction,实现ThreadSafe接口,

此操作将Last-Modified,Expires和 Cache-ControlHTTP 标头添加到响应中。

此操作将Last-Modified在响应中添加请求执行Expires 时间的标头,以及指定时间差的标头。此外,它将提供一个额外的Cache-Control指示请求的最大年龄作为到期日期和最后修改日期之间的增量。

这很有用(例如)当 Cocoon 由运行 mod_cache 的 Web 服务器(例如 Apache HTTPD)代理时,以指示每个请求的输出应缓存多长时间。

要配置Last-ModifiedExpires这之间的差异, Action可以通过这种方式配置指定天数、小时数、分钟数和秒数:

<map:action>s
   <map:action name="xyz" src="org.apache.cocoon.acting.HttpCacheAction>"
     <days>1</day>s
     <hours>2</hour>s
     <minutes>3</minute>s
     <seconds>4</second>s
   </map:actio>n
 </map:action>s
使用此示例配置,
标头将指定请求时间后一天、两小时、三分和四秒的日期(将在 中
)。

请注意,如果上述任何参数为零或 小于零,则此操作将修改结果Cache-Control标头的行为以发出关键字 no-cache

此操作还将返回它作为站点地图参数添加的三个标题,称为last-modified,expires和 cache-control(全部小写)。

​​​​​​​通过act方法执行该类的操作。


    public Map act(Redirector redirector, SourceResolver resolver,
                   Map objectModel, String source, Parameters parameters)
    throws Exception {
        Response response = ObjectModelHelper.getResponse(objectModel);
        Calendar calendar = Calendar.getInstance(DateUtils.UTC_TIME_ZONE);
        Map values = new HashMap(3);

        /* 获取当前时间和输出作为上次修改的标头 */
        String value = this.formatter.format(calendar);
        long maxage = calendar.getTime().getTime();
        response.setHeader("Last-Modified", value);
        values.put("last-modified",  value);

        /* 尽可能提前时间 */
        calendar.add(Calendar.DATE, this.days);
        calendar.add(Calendar.HOUR, this.hours);
        calendar.add(Calendar.MINUTE, this.minutes);
        calendar.add(Calendar.SECOND, this.seconds);

        /* 重新计算时间和年龄以查看更改的内容 */
        maxage = calendar.getTime().getTime() - maxage;

        /* 如果我们有超过一秒钟的时间,一切都很正常 */
        if (maxage > 1000) {
            value = this.formatter.format(calendar);
            response.setHeader("Expires", value);
            values.put("expires", value);

            value = "max-age=" + Long.toString(maxage / 1000l);
            response.setHeader("Cache-Control", value);
            values.put("cache-control", value);

        /* 如果我们得到的时间少于一秒(甚至是负片),就没有缓存 */
        } else {
            /* 我们仍然保留上次在此修改的旧值 */
            response.setHeader("Expires", value);
            values.put("expires", value);

            response.setHeader("Cache-Control", "no-cache");
            values.put("cache-control", "no-cache");
        }

        /* 返回头部 */
        return(Collections.unmodifiableMap(values));
    }

HttpHeaderAction:

继承org.apache.cocoon.acting.AbstractConfigurableAction,实现ThreadSafe接口。

此操作将 HTTP 标头添加到响应中。

通过act方法执行。

InputModuleAction:

继承org.apache.cocoon.acting.ConfigurableServiceableAction,实现ThreadSafe接口。

允许将站点地图变量传递给 InputModules 的简单帮助器操作。

使用大括号语法对输入模块进行站点地图评估,例如 {defaults:skin} 受到这样一个事实的影响,即不可能使用站点地图变量作为调用的一部分,例如 {defaults:{1})}。此操作需要三个参数,输入模块的名称、属性名称以及是调用 getAttribute() 还是 getAttributeValues()。于是上面变成

 <map:act type="inputmodule">
     <map:parameter name="module" value="defaults"/>
     <map:parameter name="attribute" value="{1}"/>
     <map:parameter name="single-value" value="false"/>
 
     <!-- do something with the result: "{1}" -->
 
   </map:act>

该操作调用该 getAttributeValues() 方法并返回从“0”开始编号的所有结果。如果不存在结果,则返回“null”并跳过嵌套块。在站点地图中声明操作时,可以预先配置要使用的输入模块的名称:

 <map:action name="inputmodule" 
                    src="org.apache.cocoon.acting.InputModuleAction" 
                    logger="sitemap.action.inputmodule">
        <module>defaults</module>
        <single-value>false</single-value>
     </map:action>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值