SSH—Struts(三)—跑步者(Action)

    如已经描述Struts其基本原理和控制器ActionServlet,根据一个请求通过流ActionServlet之后就要到达Action类中做详细的处理了。ActionServlet通过ActionMapping获取映射的Action对象,通过Action来完毕请求的处理。最后Action返回一个ActionForward对象。


Action的创建

    当请求经过ActionServlet时,ActionServlet会依据请求中截取的地址搜索相应名字的ActionMapping,即Struts-config.xml中相应标签的配置信息。然后依据ActionMapping查找相应的Action,假设存在则直接使用,否则就创建一个并放置到HashMap充当的缓存中。也就是说Struts1中的Action是单例的。


线程安全问题

    上面提到了,Action是单例的。

也就是说全部的请求都使用同一个Action类。这在一定条件下就会导致线程安全问题。这里的一定条件指的是:在Action类中定义了实例变量。提一句所谓的实例变量是指在类中定义的但在全部方法之外的变量。线程安全就不细说了。


    解决方法:①尽量不要使用静态变量和实例变量②使用synchronized进行同步③採用ThreadLocal,将定义的成员变量放入ThreadLocal中,一般定义成private static的:
         private static ThreadLocal<Integer>  local = new ThreadLocal<Integer>();
    用的时候,当须要获得成员变量的时候。先使用local对象的get方法Integer inte = local.get(),假设得到的是不是null。那么就返回get的值。假设是null。那么new一个成员变量。然后调用local的set方法。当前线程以后再get的时候就不再是null了。

特殊的Action

  • ForwardAction

    看名称就知道它和ActionForward是亲戚。它们俩的功能是非常相似的。都是页面跳转。假设这样一种情况:你单击了某个超链接仅仅是想要一个页面跳转到还有一个页面。

假设直接跳转的话,该请求将处于Struts的管理之外,而假设你请求到一个Action又非常浪费。这时就是使用ForwardAction的时候了。

  • IncludeAction
    该类提供了包括其它web组件的能力。我们知道在JSP网页中我们能够通过<include>来做这个功能。

可是Struts框架提倡的是管理全部的请求。也就是说包括其它web组件的请求也要纳入到控制中心的管理中来。那么这时候就能够使用IncludeAction了。


  • DispatchAction
    通常在一个Action中仅仅完毕一种业务逻辑的操作。那么假设须要非常多类似的操作就须要建立其它不同的Action类。这种结果就是Action类的过多。针对这种情况就能够通过DispatchAction类把相似的业务逻辑纳入到一个Action类中来以降低Action的数量。
  • SwitchAction
    这个眼下没有使用过呢,说是用于模块与模块间的切换。没实用过体会不是非常清晰。临时先放下了。
    总结:Action是Struts的实际运行者。它是单例的因此在某些情况下会有线程安全问题。这个须要注意,另外四个特俗用途的Action也须要了解。以便于不会遗漏请求在struts外管理。      

版权声明:本文博主原创文章,博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/mengfanrong/p/4832104.html