ActionServlet深入探讨--3

原创 2004年10月29日 15:44:00
在initMapping()中,首先链接mappings对象到本servlet实例。其实这句话的作用很简单,在ActionMappings中会有一个ActionServlet类型的属性,这个属性就界定了这个ActionMappings对象所属的ActionServlet。Struts的实现比较灵活,其中的ActionFormBean、ActionForward、ActionMapping类你完全可以使用自己实现的子类,来定制Struts的工作方式。上面的代码就从配置文件(web.xml)中读取formBean、forward、mapping参数,这些参数就是你定制的ActionFormBean、ActionForward、ActionMapping类名。

        // Initialize the context-relative path to our configuration resources
        value = getServletConfig().getInitParameter("config");
        if (value != null)
                config = value;
                // Acquire an input stream to our configuration resource
        InputStream input = getServletContext().getResourceAsStream(config);
        Digester digester = null;
                digester = initDigester(detail);
        try {
                formBeans.setFast(false);
                forwards.setFast(false);
                mappings.setFast(false);
                digester.parse(input);
                mappings.setFast(true);
                forwards.setFast(true);
                formBeans.setFast(true);
        } catch (SAXException e) {
                throw new ServletException
        (internal.getMessage("configParse", config), e);
        } finally {
                input.close();
        }

从web.xml读取Struts的配置文件的位置。使用org.apache.struts.digester.Digester解析config参数标示的配置文件,通常为“/WEB-INF/struts-config.xml”,解析出所有的data-source、form-bean、action-mapping、forward。从上面的程序片断看到,Digester仅仅调用了一个parse()方法,那么,Digester是怎样把解析struts-config.xml文件并把解析的结果form-bean等信息存储到属性变量formBeans等中的呢?你可以注意到在调用digester.parse(InputStream)之前,首先调用了initDigester()方法:

        Digester digester = new Digester();
        digester.push(this);
        digester.addObjectCreate("struts-config/action-mappings/action",
                                 mappingClass, "className");
        digester.addSetProperties("struts-config/action-mappings/action");
        digester.addSetNext("struts-config/action-mappings/action",
                            "addMapping",
                            "org.apache.struts.action.ActionMapping");

        digester.addSetProperty
            ("struts-config/action-mappings/action/set-property",
             "property""value");

在这个方法中首先生成一个Digester对象,然后设置解析的规则和回调,如果你对XML、SAX不是很熟,这儿不必纠缠太深。要注意的是addSetNext()方法,设置了每一个要解析元素的Set Next回调方法,而这个方法就是由digester解析器的父提供的。上面的片断中的“addMapping”就是ActionServlet本身定义的一个方法,将由Digester回调。Digester就是籍此把解析出的每一个FormBean、ActionForward、ActionMapping等存储到属性变量formBeans、forwards、mappings等中的。
initUpload() -    初始化有关Upload的一些参数,比如:bufferSize、tempDir。
initDataSource() -取出在initMapping()中从配置文件中读取的每一个DataSource,设置LogWriter,如果为GenericDataSource的实例,则打开数据源。然后,把每个dataSource放入Context中。
dataSource.setLogWriter(scw);
((GenericDataSource)dataSource).open();
getServletContext().setAttribute(key,dataSource);
initOther() -        设置其它尚未初始化的的参数(content、locale、nocache),并发布formBeans、forwards、mappings到Context:
getServletContext().setAttribute(Action.FORM_BEANS_KEY, formBeans);
getServletContext().setAttribute(Action.FORWARDS_KEY, forwards);
getServletContext().setAttribute(Action.MAPPINGS_KEY, mappings);
initServlet() -    初始化Controller Servlet的Servlet Mapping。这儿也使用了Digester工具,扫描web.xml所有的<web-app/servlet-mapping>,寻找servlet-name与当前Servlet相同的mapping,置入Context。代码如下;

        Digester digester = new Digester();
        digester.push(this);
        digester.setDebug(debug);
        digester.setValidating(validating);
        digester.addCallMethod(“web-app/servlet-mapping”,“addServletMapping”, 2);
        digester.addCallParm(“web-app/servlet-mapping/servlet-name”, 0);
        digester.addCallParm(“web-app/servlet-mapping/url-pattern”, 1);
        InputStream is = getServletContext().getResourceAsStream(“/WEB-INF/web.xml”);
        digester.parse(is); 
        getServletContext().setAttribute(Action.SERVLET_KEY,servletMapping);

ActionServlet深入探讨

java.lang.Object  |  +--javax.servlet.GenericServlet        |        +--javax.servlet.http.HttpServl...
  • chho
  • chho
  • 2004年10月27日 09:55
  • 1784

ActionServlet深入探讨--2

init()在它的init()方法中,ActionServlet依次调用如下protected的方法完成初始化:initActions() -     大家可能还曾有这个疑问:Struts为什么可以找...
  • csdnloading
  • csdnloading
  • 2004年10月29日 15:45
  • 1436

ActionServlet深入探讨--1

java.lang.Object  |  +--javax.servlet.GenericServlet        |        +--javax.servlet.http.HttpServl...
  • csdnloading
  • csdnloading
  • 2004年10月29日 15:46
  • 1054

struts之ActionServlet深入探讨

 java.lang.Object  faq-it.org/coldfusion/  ¦  +--javax.servlet.GenericServlet   ¦  +--javax.servlet....
  • fzy816
  • fzy816
  • 2006年10月24日 18:21
  • 530

Struts介绍-ActionServlet深入探讨

java.lang.Object|+--javax.servlet.GenericServlet|+--javax.servlet.http.HttpServlet|+--org.apache.str...
  • feng_sundy
  • feng_sundy
  • 2005年10月19日 10:54
  • 1949

Struts 学习笔记2 -ActionServlet深入探讨

java.lang.Object  |  +--javax.servlet.GenericServlet        |        +--javax.servlet.http.HttpServl...
  • Explorerwen
  • Explorerwen
  • 2004年10月28日 16:24
  • 592

Struts 学习笔记2 -ActionServlet深入探讨

java.lang.Object  |  +--javax.servlet.GenericServlet        |        +--javax.servlet.http.HttpServl...
  • tolys
  • tolys
  • 2007年09月29日 13:46
  • 21594

Struts功能详解 ——ActionServlet

ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类。Struts的启动通常从加载ActionServlet开始。...
  • lsh6688
  • lsh6688
  • 2012年04月07日 10:02
  • 5294

Struts 学习笔记2 -ActionServlet深入探讨(引用)

java.lang.Object  |  +--javax.servlet.GenericServlet        |        +--javax.servlet.http.HttpServl...
  • liaoxingya276
  • liaoxingya276
  • 2004年10月08日 21:31
  • 941

Struts——三大组件(一)ActionServlet

ActionServlet类是Struts框架的内置核心控制器组件,它继承了javax.servlet.http.HttpServlet类,Struts的启动一般从加载ActionServlet开始,...
  • kanglix1an
  • kanglix1an
  • 2014年08月13日 22:29
  • 2563
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActionServlet深入探讨--3
举报原因:
原因补充:

(最多只允许输入30个字)