2021SC@SDUSC
接下来的部分可能相对之前而言更为零散,为sitemap的组件,大多都只实现了零星功能,代码简单,不多加以具体分析。
目录
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-Control
HTTP 标头添加到响应中。
此操作将Last-Modified
在响应中添加请求执行Expires
时间的标头,以及指定时间差的标头。此外,它将提供一个额外的Cache-Control
指示请求的最大年龄作为到期日期和最后修改日期之间的增量。
这很有用(例如)当 Cocoon 由运行 mod_cache 的 Web 服务器(例如 Apache HTTPD)代理时,以指示每个请求的输出应缓存多长时间。
要配置Last-Modified
和Expires
这之间的差异, 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>