在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等中的。
// 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);