2021SC@SDUSC
是 Cocoon 作为 HTTP Servlet 执行的入口点
继承自AbstractLogEnabled
//处理时间消息
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;
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);
}}
补充:响应对象的关闭
Servlet 规范 2.2、6.5 响应对象的关闭:许多事件可以表明 servlet 已经提供了满足请求的所有内容,可以认为响应对象已关闭。
事件是:
setContentLength ()
中指定的内容量已写入响应时。sendError ()
。sendRedirect ()
。 当响应关闭时,响应缓冲区中的所有内容(如果还有剩余)必须立即刷新到客户端。由于上述原因,out.flush()
和 out.close()
不是必需的,有时(如果使用 sendError
或 sendRedirect
)请求可能已经关闭。
Servlet 过滤器,用于将请求调试信息打印到日志文件中
继承自AbstractLogEnabled
实现了Filter接口
//活动请求数
private volatile int activeRequestCount;
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain)
throws IOException, ServletException
补充:doFilter()
由于客户端对链尾资源的请求,每次请求/响应对通过链时,容器都会调用 Filter 的 doFilter 方法。 传入此方法的 FilterChain 允许 Filter 将请求和响应传递给链中的下一个实体。
此方法的典型实现将遵循以下模式:
chain.doFilter()
)调用链中的下一个实体,定义一些用于请求处理等的实用方法
继承自Object
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()
返回此请求的 URL 中调用 servlet 的部分。 此路径以“/”字符开头,包括 servlet 名称或 servlet 的路径,但不包括任何额外的路径信息或查询字符串。 与 CGI 变量 SCRIPT_NAME 的值相同。
如果用于处理此请求的 servlet 使用“/*”模式匹配,则此方法将返回一个空字符串 ("")
用于管理 Cocoon servlet 特定设置的 Helper 类
继承自Object
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;
public boolean isShowTime()
public boolean isShowVersion()
public void setShowTime(boolean showTime)
public void setShowCocoonVersion(boolean showCocoonVersion)
是 Cocoon 作为 HTTP Servlet 执行的入口点
继承自HttpServlet
//Cocoon 请求处理器
protected RequestProcessor processor;
public void init() throws ServletException
super.init(config)
。GenericServlet.init(ServletConfig config)
调用,而不需要重载init(ServletConfig)
。仍然可以通过 getServletConfig()
检索 ServletConfig 对象。1.补充:HttpServlet
提供一个抽象类来创建子类以创建适用于网站的 HTTP servlet。 HttpServlet 的子类必须至少覆盖一种方法,通常是以下方法之一:
doGet
,如果 servlet 支持 HTTP GET 请求doPost
,用于 HTTP POST 请求doPut
,用于 HTTP PUT 请求doDelete
,用于 HTTP DELETE 请求init
和 destroy
,用于管理在 servlet 生命周期内保留的资源getServletInfo
,servlet 使用它来提供有关自身的信息几乎不需要重载服务方法。服务通过将标准 HTTP 请求分派到每个 HTTP 请求类型的处理程序方法(上面列出的 doXXX 方法)来处理标准的 HTTP 请求。
同样,也几乎不需要重载 doOptions
和 doTrace
方法
2.Servlet
Servlet 通常运行在多线程服务器上,因此请注意 Servlet 必须处理并发请求并小心同步对共享资源的访问。共享资源包括内存数据(例如实例或类变量)和外部对象(例如文件、数据库连接和网络连接)。