ActionServlet深入探讨--3

来源:互联网 发布:NSGA-2优化对比 编辑:程序博客网 时间:2024/05/16 14:59
在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);
  • 原创粉丝点击