ActionServlet深入探讨--2

原创 2004年10月29日 15:45:00

init()


在它的init()方法中,ActionServlet依次调用如下protected的方法完成初始化:
  • initActions() -     大家可能还曾有这个疑问:Struts为什么可以找到一个请求URI对应的action类呢?答案就在这儿,ActionServlet有一个actions属性,类型为org.apache.struts.util.FastHashMap,用于存储以类的全名为key的已实例化的Action类。在init()时首先调用的就是initActions()方法,在这个方法中只是简单的清除map中的所有的名值对,

            synchronized (actions) {
                actions.setFast(false);
                actions.clear();
                actions.setFast(true);
            }

    首先把actions设为slow模式,这时对FastHashMap的访问是线程同步的,然后清除actions中的所有的已存在的名/值对,最后再把actions的模式设为fast。由于FastHashMap是struts在java.util.HashMap的基础上的一个扩展类,是为了适应多线程、并且对HashMap的访问大部分是只读的特殊环境的需要。大家知道java.util.HashMap是非线程安全的,所以HashMap一般适用于单线程环境下。org.apache.struts.FastHashMap就是继承于java.util.HashMap,在其中添加多线程的支持产生的。在fast模式下的工作方式是这样的:读取是非线程同步的;写入时首先克隆当前map,然后在这个克隆上做写入操做,完成后用这个修改后的克隆版本替换原来的map。那么在什么时候会把Actions类添加到这个map中呢?我们已经提到了struts是动态的生成Action类的实例的,在每次ActionServlet接收到一个GET或POST的HTTP请求时,会在这个map中查找对应的Action类的实例,如果不存在,那么就实例化一个,并放入map中。可见这个actions属性起到了对Action类实例的缓存的作用。
  • initInternal() -     初始化ActionServlet内部使用的资源包MessageResources,使用MessageResources.getMessageResources(internalName)得到    internalName为"org.apache.struts.action.ActionResources"对应的ActionResources.properties文件。这个资源包主要用于ActionServlet处理过程中的用到的提示信息,这儿不展开讨论。
  • initDebug() -     从web.xml中读取本应用的debug级别参数getServletConfig().getInitParameter("debug"),然后赋给debug属性。
  • initApplication()-    初始化应用资源包,并放置入ServletContext中。

            String factory =getServletConfig().getInitParameter(“factory”);    
            String oldFacory = MessageResourcesFactory.getFactoryClass();
            if (factory !=null)
                    MessageResourcesFactory.setFactoryClass(factory);
            String value = getServletConfig().getInitParameter("application");
            MessageResourcesFactory factoryObject =
                    MessageResourcesFactory.createFactory();
            application = factoryObject.createResources(value);
            MessageResourcesFactory.setFactory(oldFactory); 
            getServletContext().setAttribute(Action.MESSAGES_KEY, application);

    说明:文中引用的代码片断可能会省略了一些例外检查等非主线的内容,敬请注意。

    首先从配置文件中读取factory参数,如果这个参数不为空,那么就在MessageResourcesFactory中使用这个指定的Factory类;否则,使用默认的工厂类org.apche.struts.util.PropertyMessageResourceFactory。然后调用MessageResourcesFactory的静态createFactory()方法,生成一个具体的MessageResourceFactory对象(注意:MessageResourcesFactory是抽象类)。这样就可以调用这个具体的MessageResourceFactory的createResource()方法得到配置文件(web.xml)中定义的资源文件了。
    上面的application对象类型为MessageResources。在web.xml中在配置ActionServlet时可以指定一个特定的工厂类。不能直接MessageResourcesFactory的createResources()方法,因为这个方法是abstract的。创建factoryObject的过程如下:
        
            MessageResourceFactory factoryObject=
                    MessageResourcesFactory.createFactory();
            application = factoryObject.createResources(value);

    <li>initMapping() -    为应用初始化mapping信息ActionServlet有一个protected的属性:mapping,封装了一个ActionMapping的对象集合,以便于管理、查找ActionMapping。mappings是org.apache.struts.action.ActionMappings类的实例。主要有两个方法:addMapping(ActionMapping mapping)和findMapping(String path)。ActionMapping也是使用上面提到的org.apache.struts.util.FastHashMap类来存储所有的ActionMapping对象。

            mappings.setServlet(this);
            ……
            // Initialize the name of our ActionFormBean implementation class
            value = getServletConfig().getInitParameter("formBean");
            if (value != null)
                formBeanClass = value;
        
            // Initialize the name of our ActionForward implementation class
            value = getServletConfig().getInitParameter("forward");
            if (value != null)
                    forwardClass = value;

            // Initialize the name of our ActionMapping implementation class
            value = getServletConfig().getInitParameter("mapping");
            if (value != null)
                    mappingClass = value;

ActionServlet深入探讨

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

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

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

ActionServlet深入探讨--3

在initMapping()中,首先链接mappings对象到本servlet实例。其实这句话的作用很简单,在ActionMappings中会有一个ActionServlet类型的属性,这个属性就界定...
  • csdnloading
  • csdnloading
  • 2004年10月29日 15:44
  • 1092

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...
  • liaoxingya276
  • liaoxingya276
  • 2004年10月08日 21:31
  • 941

Struts功能详解 ——ActionServlet

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

Struts——三大组件(一)ActionServlet

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

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