随着Struts2的推出,很多人认为原有的Struts1.2已经没有学习的价值,其实并不是这样,不管怎么样,原有的Struts1.2要比现有的
Struts2成熟,而且Struts2推出的时间还不是很长,所以,Struts1.2至少在现阶段的应用还是要比Struts2的应用要广。所以,认
真深入的学习Struts1.2还是很有必要的。
首先是Struts1.2的核心类,ActionServlet类。
ActionServlet位于org.apache.struts.action包内,这个类将会在struts第一次使用时,作为servlet初始化并存入Servlet容器。在初始化时:
首先调用init()
方法,Struts
的初始化实现就是在这里实现的。在执行init()方法时,会调用initInternal(),初始化内部文件
ActionResources.properties,它通过internal =
MessageResources.getMessageResources(internalName)得到内部文件;
调用 initOther()
,从web.xml中加载ActionServlet的初始化参数,包括config/ convertNull,其中config默认路径为"/WEB-INF/struts-config.xml",protected String config = "/WEB-INF/struts-config.xml",
从web.xml中读取config参数:
String value;
value = getServletConfig().getInitParameter("config");
if (value != null) {
config = value;
}
获得convertNull的值,getServletConfig().getInitParameter("convertNull");
;
调用 initServlet()
,从web.xml中加载ActionServlet的初始化参数如servlet-name,加载DTD文件并把其放入HashMap缓存,读取并解析web.xml的内容,
getServletConfig().getServletName();
Digester digester = new Digester();
digester.push(this);
// 把当前的 ActionServlet 对象放入到解析堆栈中
;
调用initServlet()
,运行时,digester 就会调用 ActionServlet中的 addServletMapping() 方法,并传入两个参数
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);
上面要从web.xml获得的元素值:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
// 来判断当前 servlet 名称是否为正在运行的 servlet 名称,如是,就把 url-pattern 作为 servletMapping
public void addServletMapping(String servletName, String urlPattern) {
if (servletName == null) {
return;
}
if (servletName.equals(this.servletName)) {
if (log.isDebugEnabled()) {
log.debug("Process servletName=" + servletName
+ ", urlPattern=" + urlPattern);
}
this.servletMapping = urlPattern;
}
}
// 读取配置文件web.xml的内容
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");
// 如找不到/WEB-INF/web.xml文件,则报错
if (input == null) {
log.error(internal.getMessage("configWebXml"));
throw new ServletException(internal.getMessage("configWebXml"));
}
// 报错信息定义在org\apache\struts\action\ActionResources.properties中
configWebXml=The /WEB-INF/web.xml was not found.
// 解析input流文件,每读到一个节点元素就触发一个事件
digester.parse(input)
,调用 initChain()
,读取web.xml中命令链文件初始值chainConfig,如果没有,则用默认的"org/apache/struts/chain/chain-config.xml"
;
调用 initModuleConfigFactory()和 initModuleConfig("", config)
,创建 ModuleConfig 对象。Struts中的MessageResource、PlugIn、数据源等,都是通过ModuleConfig来实现的;
调用initModuleMessageResources(moduleConfig)
,用户资源文件的初始化;
调用initModulePlugIns(moduleConfig)
,用户插件的初始化;
调用initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig)
,把struts配置文件中的其他配置存储到servletContext中;
调用moduleConfig.freeze()
,固定组件配置;随后解析
以"config/"开头的其他struts配置文件,遍历web.xml中servletConfig配置的initParameterNames,如
发现以"config/" 开始的parameter,则根据此值初始化其它的ModuleConfig;
之后调用initModulePrefixes(this.getServletContext()),initModulePrefixes(this.getServletContext())
,初始化其他模块并存储。
到此,ActionServlet初始化工作就算完成,后半段的初始化工作我解释的不是非常详细,只是想读者去好好阅读Struts的源代码,去品味下开发Struts的人员是怎么样去实现各种功能的,虽然可能写不出来,但是多阅读对自己也是一种提高。
分享到:
相关推荐
1 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一...Struts 2 Action可以通过初始化、设置属性、调用方法来测试。
struts1面试题对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到ActionMappings对象中。
1 客户端初始化一个指向Servlet容器的请求; 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh ...
Struts 初始化 initInternal()方法: initOther()方法 initServlet()方法 getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this) ModuleConfig moduleConfig = ...
这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。 4、如果一个servlet中有很多个方法,则必须采用传递参数的形式,分解到每一个方法中。 2重构servlet 针对servlet以上的特点,我们...
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求; 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框 架的集成很有帮助...
4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的基本操作 8、struts2...
Struts框架的总控制器ActionServlet是一个Servlet,在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为Struts中不同的模块初始化相应的对象。(面向对象思想) ...
11.2.1 ActionServlet(分发器) 11.2.2 Action(控制器) 11.2.3 Action Mapping(映射) 11.2.4 ActionForm(表单控制器) 11.2.5 ActionErrors(错误处理) 11.2.6 DispatchAction(多动作控制器) 11.3 利用...
主要对WEB框架常面试的点做了一下整理,希望可帮助到你,下面文档的部分内容 Java---SSH(MVC) 1. 谈谈你mvc的理解 ... Struts2.0 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”也使得测试更容易。
4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt //这个项目用不着了 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的...
ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后...
4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt //这个项目用不着了 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的...
11.2.1 ActionServlet(分发器) 11.2.2 Action(控制器) 11.2.3 Action Mapping(映射) 11.2.4 ActionForm(表单控制器) 11.2.5 ActionErrors(错误处理) 11.2.6 DispatchAction(多动作控制器) 11.3 利用...
11.2.1 ActionServlet(分发器) 11.2.2 Action(控制器) 11.2.3 Action Mapping(映射) 11.2.4 ActionForm(表单控制器) 11.2.5 ActionErrors(错误处理) 11.2.6 DispatchAction(多动作控制器) 11.3 利用...
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,...
a)客户端初始化一个指向Servlet容器的请求;b)根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(SiteMeshPlugin),主要清理当前线程...
对于基于Struts框架的Web应用程序,当客户端浏览器发出请求时,请求会被控制器 截获,并调用在Web应用启动时就加载并初始化核心控制器组件ActionServlet,然后通 过ActionServlet从Struts- config.xml文件中读取...
{自定义的存放包}目录:4个xml文件(applicationContext-dao.xml(dao注入配置),applicationContext-service.xml(service注入配置),action-servlet.xml(action注入配置),struts-{自定义的存放包名}.xml(struts2的...