Struts
源码的切片学习(三)
——
ActionServlet
的初始化细节
Author
: zhyiwww
E-Mail
: zhyiwww@163.com
Date
: 2007-1-10
转载请注明出处
www.BlogJava.net/zhyiwww
(copyright by @ zhangyi)
在
ActionServlet
初始化的过程中,有一个函数
initServlet()
用来初始化此
ActionServlet,
主要是初始化其
url,
也就是到底此
ActionServlet
接收和处理那些
url
。
我们先看一下代码:
protected void initServlet() throws
ServletException {
// Remember our servlet name
this.servletName = getServletConfig().getServletName();
// Prepare a Digester to scan the web application deployment descriptor
Digester digester = new Digester();
digester.push(this);
digester.setNamespaceAware(true);
digester.setValidating(false);
// Register our local copy of the DTDs that we can find
for (int i = 0; i < registrations.length; i += 2) {
URL url = this.getClass().getResource(registrations[i+1]);
if (url != null) {
digester.register(registrations[i], url.toString());
}
}
/********************************************
上面的紫色的代码是把当前的
ActionServlet
实例放入到解析堆栈中。这一步很重要。
正是
actionServlet
放入了堆栈,下面的调用所取得配置参数才正是
actionSerlvet
的配置参数,而不是其他的
servlet
的配置参数。
这个地方是一个难点。
********************************************/
// Configure the processing rules that we need
digester.addCallMethod("web-app/servlet-mapping",
"addServletMapping", 2);
digester.addCallParam("web-app/servlet-mapping/servlet-name",
0);
digester.addCallParam("web-app/servlet-mapping/url-pattern",
1);
/************************************************************
上面的代码执行的时候,
digester
就会调用
actionServlet
中的
addServletMapping()
方法,并传进去两个参数。
在这个方法里面,就初始化了
servlet
的
url,
,也就是那种后缀的
ur
要由
actionServlet
来接收和处理。
例如:
*.do
还是
/action/*.do
等。
这个
servlet
的
url
保存在
actionServlet
的
servletMapping
参数里面。
************************************************************/
// Process the web application deployment descriptor
if (log.isDebugEnabled()) {
log.debug("Scanning web.xml for controller servlet mapping");
}
InputStream input =
getServletContext().getResourceAsStream("/WEB-INF/web.xml");
if (input == null) {
log.error(internal.getMessage("configWebXml"));
throw new
ServletException(internal.getMessage("configWebXml"));
}
try {
digester.parse(input);
} catch (IOException e) {
log.error(internal.getMessage("configWebXml"), e);
throw new ServletException(e);
} catch (SAXException e) {
log.error(internal.getMessage("configWebXml"), e);
throw new ServletException(e);
} finally {
try {
input.close();
} catch (IOException e) {
log.error(internal.getMessage("configWebXml"), e);
throw new ServletException(e);
}
}
// Record a servlet context attribute (if appropriate)
if (log.isDebugEnabled()) {
log.debug("Mapping for servlet '" + servletName + "' =
'" +
servletMapping +
"'");
}
if (servletMapping != null) {
getServletContext().setAttribute(Globals.SERVLET_KEY,
servletMapping);
}
}
上面的过程就是
initServlet
的初始化过程,其中的难点就是对
digester.push()
的理解。
附: public void addServletMapping(String servletName, String urlPattern) {
if (log.isDebugEnabled()) {
log.debug("Process servletName=" + servletName +
", urlPattern=" + urlPattern);
}
if (servletName == null) {
return;
}
if (servletName.equals(this.servletName)) {
this.servletMapping = urlPattern;
}
}
|----------------------------------------------------------------------------------------|
版权声明 版权所有 @zhyiwww
引用请注明来源 http://www.blogjava.net/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2007-01-29 17:18
zhyiwww 阅读(2058)
评论(1) 编辑 收藏 所属分类:
j2ee