zhyiwww
用平实的笔,记录编程路上的点点滴滴………
posts - 536,comments - 394,trackbacks - 0

 

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 阅读(2046) 评论(1)  编辑  收藏 所属分类: j2ee

FeedBack:
# re: Struts源码的切片学习(三)-- ActionServlet的初始化细节
2008-03-03 15:56 | gff
这个写的还不错.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: