当前位置: 首页 > 工具软件 > Cocoon > 使用案例 >

2021SC@SDUSC【软件工程应用与实践】Cocoon项目8——core文件夹分析(7)

燕文昌
2023-12-01

2021SC@SDUSC

RequestProcessor.java

1、总结

是 Cocoon 作为 HTTP Servlet 执行的入口点
继承自AbstractLogEnabled

2、主要属性

//处理时间消息
protected static final String PROCESSED_BY = "Processed by Apache Cocoon in ";
//servlet 上下文
protected final ServletContext servletContext;
//Cocoon 环境上下文
protected final Context environmentContext;
//配置的 servlet 容器编码。默认为 ISO-8859-1
protected final String containerEncoding;
//底层cocoon BeanFactory
protected final BeanFactory cocoonBeanFactory;
//特殊的 servlet 设置
protected final ServletSettings servletSettings;
//底层设置
protected final Settings settings;
//在处理所有请求之前和之后调用的可选组件
protected RequestListener requestListener;

3、方法

public void service(HttpServletRequest request, HttpServletResponse res)
throws ServletException, IOException{
        //用于计时处理
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        // 添加cocoon版本标题图章
        if (this.servletSettings.isShowVersion()) {
            res.addHeader("X-Cocoon-Version", Constants.VERSION);
        }
        // 处理请求
        final String uri = getURI(request, res);
        if (uri == null) {
            //发生了重定向,判断为处理完成
            return;
        }
        Environment env;
        try{
            // 在没有 URLDecoding 的情况下将 uri 传递到环境中,因为它已经被解码了
            env = getEnvironment(uri, request, res);
        }}
  • 处理指定的 HttpServletRequest 在指定的 HttpServletResponse 上产生输出

4、其他

补充:响应对象的关闭
Servlet 规范 2.2、6.5 响应对象的关闭:许多事件可以表明 servlet 已经提供了满足请求的所有内容,可以认为响应对象已关闭。
事件是:

  1. servlet 服务方法的终止。
  2. 当响应的 setContentLength ()中指定的内容量已写入响应时。
  3. 调用了 sendError ()
  4. 调用了 sendRedirect ()。 当响应关闭时,响应缓冲区中的所有内容(如果还有剩余)必须立即刷新到客户端。

由于上述原因,out.flush()out.close() 不是必需的,有时(如果使用 sendErrorsendRedirect )请求可能已经关闭。

DebugFilter.java

1、总结

Servlet 过滤器,用于将请求调试信息打印到日志文件中
继承自AbstractLogEnabled
实现了Filter接口

2、主要属性

//活动请求数
private volatile int activeRequestCount;

3、方法

public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain)
            throws IOException, ServletException
  • 记录有关当前环境的调试信息,包括所有请求参数、标头参数和会话属性,同时在session给不为空时修复可能存在的bug
  • 如果这不是 httpservletrequest,我们不做调试消息

4、其他

补充:doFilter()
由于客户端对链尾资源的请求,每次请求/响应对通过链时,容器都会调用 Filter 的 doFilter 方法。 传入此方法的 FilterChain 允许 Filter 将请求和响应传递给链中的下一个实体。
此方法的典型实现将遵循以下模式:

  1. 检查请求
  2. 可选地使用自定义实现包装请求对象以过滤内容或标题以进行输入过滤
  3. 可选地使用自定义实现包装响应对象以过滤内容或标题以进行输出过滤
  4. a) 要么使用 FilterChain 对象(chain.doFilter())调用链中的下一个实体,
  5. b) 或不将请求/响应对传递给过滤器链中的下一个实体以阻止请求处理
  6. 调用过滤器链中的下一个实体后,直接在响应上设置标头。

RequestUtil.java

1、总结

定义一些用于请求处理等的实用方法
继承自Object

2、方法

public static String getCompleteUri(HttpServletRequest request,
                                        HttpServletResponse response)
    throws IOException {
        // 从 servlet 路径开始
        String uri = request.getServletPath();
        //uri永远不会为空,但仍需检查一下 
        if (uri == null) {
            uri = ""; }
        String pathInfo = request.getPathInfo();
        if (pathInfo != null) {
        //WebLogic 修复:uri 和 pathInfo 都以“/”开头            
        // 这个问题只存在于WL6.1sp2,不存在于WL6.0sp2或WL7.0b            
        // 注:servletPath 总是以'/' 开头,所以上面提到的bug 只有在servlet 路径只是一个“/”时才会发生
            if (uri.length() > 0 && uri.charAt(0) == '/') {
                uri = uri.substring(1); }
            uri += pathInfo;  }
        if (uri.length() == 0) {
        //空的相对 URI。 发出从“/block”到“/block/”的 HTTP 重定向,以避免破坏预期安装在“.../”的站点地图生成的响应中的相对 URI
            String serverAbsoluteUri = request.getRequestURI();
            if (serverAbsoluteUri == null) {
                serverAbsoluteUri = "/";
            } else {
                serverAbsoluteUri += "/";
            }     response.sendRedirect(response.encodeRedirectURL(serverAbsoluteUri));
            return null;  }
        if (uri.charAt(0) == '/') {
            uri = uri.substring(1); }
        return uri;
    }
 public static String getCompleteBlockUri(HttpServletRequest request,
                                   HttpServletResponse response)
  • 与上个方法类似,但是忽略了getServletPath()
  • 注:如果实际上有一个 servlet 上下文路径,则原始实现将在树处理器中不起作用的 servlet 上下文路径。但仍需要知道 servlet 路径的末尾是否有一个“/”(如果路径信息为空,则需要知道是否发出重定向)

3、其他

补充:getServletPath()

返回此请求的 URL 中调用 servlet 的部分。 此路径以“/”字符开头,包括 servlet 名称或 servlet 的路径,但不包括任何额外的路径信息或查询字符串。 与 CGI 变量 SCRIPT_NAME 的值相同。

如果用于处理此请求的 servlet 使用“/*”模式匹配,则此方法将返回一个空字符串 ("")

ServletSettings

1、总结

用于管理 Cocoon servlet 特定设置的 Helper 类
继承自Object

2、主要属性//允许在响应中添加处理时间

public static String KEY_SHOWTIME = "org.apache.cocoon.showtime";
//如果为 true,处理时间将作为 HTML 注释添加
public static String KEY_HIDE_SHOWTIME = "org.apache.cocoon.hideshowtime";
//如果为 true,则将包含 X-Cocoon-Version 响应标头
public static String KEY_SHOW_VERSION = "org.apache.cocoon.show-version";
// 如果为 true 或未设置,此类将尝试捕获并处理所有 Cocoon 异常
// 如果为 false,它会将它们重新抛出到 servlet 容器
public static String KEY_MANAGE_EXCEPTIONS = "org.apache.cocoon.manageexceptions";
//KEY_SHOWTIME 参数的默认值 (false)
public static final boolean SHOW_TIME = false;
//KEY_HIDE_SHOWTIME 参数的默认值 (false)
public static final boolean HIDE_SHOW_TIME = false;
//KEY_SHOW_VERSION 参数的默认值 (true)
public static final boolean SHOW_COCOON_VERSION = true;
//KEY_MANAGE_EXCEPTIONS 参数的默认值 (true)
public static final boolean MANAGE_EXCEPTIONS = true;

//允许在响应中添加处理时间
 protected boolean showTime;
//如果为 true,处理时间将作为 HTML 注释添加
protected boolean hideShowTime;
//如果为 true,则将包含 X-Cocoon-Version 响应标头
protected boolean showCocoonVersion;
// 如果为 true 或未设置,此类将尝试捕获并处理所有 Cocoon 异常
// 如果为 false,它会将它们重新抛出到 servlet 容器
protected boolean manageExceptions;

3、方法

  • 给上述每个变量建立get/set方法,以下面两个为例:
public boolean isShowTime()
  • 返回参数ShowTime
public boolean isShowVersion()
  • 返回参数ShowVersion
public void setShowTime(boolean showTime)
  • 参数showTime——要设置的 showTime
public void setShowCocoonVersion(boolean showCocoonVersion)
  • 参数showCocoonVersion——要设置的showCocoonVersion

SitemapServlet.java

1、总结

是 Cocoon 作为 HTTP Servlet 执行的入口点
继承自HttpServlet

2、主要属性

//Cocoon 请求处理器
protected RequestProcessor processor;

3、方法

public void init() throws ServletException
  • 一种可以被覆盖的便捷方法,因此无需调用 super.init(config)
  • 只需重载这个方法,它就会被 GenericServlet.init(ServletConfig config) 调用,而不需要重载init(ServletConfig)。仍然可以通过 getServletConfig() 检索 ServletConfig 对象。

4、其他

1.补充:HttpServlet

提供一个抽象类来创建子类以创建适用于网站的 HTTP servlet。 HttpServlet 的子类必须至少覆盖一种方法,通常是以下方法之一:

  1. doGet,如果 servlet 支持 HTTP GET 请求
  2. doPost,用于 HTTP POST 请求
  3. doPut,用于 HTTP PUT 请求
  4. doDelete,用于 HTTP DELETE 请求
  5. initdestroy,用于管理在 servlet 生命周期内保留的资源
  6. getServletInfo,servlet 使用它来提供有关自身的信息

几乎不需要重载服务方法。服务通过将标准 HTTP 请求分派到每个 HTTP 请求类型的处理程序方法(上面列出的 doXXX 方法)来处理标准的 HTTP 请求。

同样,也几乎不需要重载 doOptionsdoTrace 方法

2.Servlet

Servlet 通常运行在多线程服务器上,因此请注意 Servlet 必须处理并发请求并小心同步对共享资源的访问。共享资源包括内存数据(例如实例或类变量)和外部对象(例如文件、数据库连接和网络连接)。

 类似资料: