`
sugongqing
  • 浏览: 77399 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

struts之actionServlet初始化

阅读更多

随着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的人员是怎么样去实现各种功能的,虽然可能写不出来,但是多阅读对自己也是一种提高。

分享到:
评论

相关推荐

    Struts1与Struts2本质区别

    1 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。Struts 2 Action类可以实现一...Struts 2 Action可以通过初始化、设置属性、调用方法来测试。

    struts1面试题

    struts1面试题对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化控制器ActionServlet ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到ActionMappings对象中。

    Struts2的工作原理和流程

    1 客户端初始化一个指向Servlet容器的请求; 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh ...

    Struts源代码阅读.CHM

    Struts 初始化 initInternal()方法: initOther()方法 initServlet()方法 getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this) ModuleConfig moduleConfig = ...

    struts2的总结,适合初学者

    这两个参数与容器相关,如果想在servlet中作单元测试,则必须初始化这两个参数。 4、如果一个servlet中有很多个方法,则必须采用传递参数的形式,分解到每一个方法中。 2重构servlet 针对servlet以上的特点,我们...

    struts2开发文档

    1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求; 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框 架的集成很有帮助...

    Struts2学习示例

    4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的基本操作 8、struts2...

    JAVA期末大作业课程设计基于SSH框架的管理系统.zip

    Struts框架的总控制器ActionServlet是一个Servlet,在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为Struts中不同的模块初始化相应的对象。(面向对象思想) ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    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 利用...

    JAVA-SSH面试题

    主要对WEB框架常面试的点做了一下整理,希望可帮助到你,下面文档的部分内容 Java---SSH(MVC) 1. 谈谈你mvc的理解 ... Struts2.0 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”也使得测试更容易。

    struts2+hibernate学习示例

    4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt //这个项目用不着了 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的...

    北京大部分公司的ssh面试题

    ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后...

    struts2+Hibernate+Spring学习示例

    4、网站初始化工作类的实现 dbtest.servlet.LauncherServlet 5、tomcate数据源配置 见 tomcat配置.txt //这个项目用不着了 6、创建了专门的数据库操作工具类 DBUtil、专门的DAO管理工具DAOManager 7、实现了CRUD的...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (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 利用...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    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 利用...

    SSH的jar包.rar

    1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,...

    Struts2请求处理流程及源码分析

    a)客户端初始化一个指向Servlet容器的请求;b)根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(SiteMeshPlugin),主要清理当前线程...

    健身房管理信息系统设计.doc

    对于基于Struts框架的Web应用程序,当客户端浏览器发出请求时,请求会被控制器 截获,并调用在Web应用启动时就加载并初始化核心控制器组件ActionServlet,然后通 过ActionServlet从Struts- config.xml文件中读取...

    ssh2(struts2+spring2.5+hibernate3.3)自动生成模版

    {自定义的存放包}目录:4个xml文件(applicationContext-dao.xml(dao注入配置),applicationContext-service.xml(service注入配置),action-servlet.xml(action注入配置),struts-{自定义的存放包名}.xml(struts2的...

Global site tag (gtag.js) - Google Analytics