首页 > 代码库 > SSH—Struts(三)—执行器(Action)
SSH—Struts(三)—执行器(Action)
前面已经介绍了Struts的基本原理和控制器ActionServlet,按照一个请求的流程经过了ActionServlet之后就要到达Action类中做具体的处理了。ActionServlet通过ActionMapping获取映射的Action对象,通过Action来完成请求的处理,最后Action返回一个ActionForward对象。
解决方法:①尽量不要使用静态变量和实例变量②使用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是Struts的实际执行者,它是单例的因此在某些情况下会有线程安全问题。这个需要注意,另外四个特俗用途的Action也需要了解,以便于不会遗漏请求在struts的管理之外。
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
- IncludeAction
- DispatchAction
- SwitchAction
总结:Action是Struts的实际执行者,它是单例的因此在某些情况下会有线程安全问题。这个需要注意,另外四个特俗用途的Action也需要了解,以便于不会遗漏请求在struts的管理之外。
SSH—Struts(三)—执行器(Action)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。