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外管理。
版权声明:本文博主原创文章,博客,未经同意不得转载。
SSH—Struts(三)—跑步者(Action)的更多相关文章
- SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别
SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...
- 第三章Struts2 Action中动态方法调用、通配符的使用
01.Struts 2基本结构 使用Struts2框架实现用登录的功能,使用struts2标签和ognl表达式简化了试图的开发,并且利用struts2提供的特性对输入的数据进行验证,以及访问Servl ...
- Wix打包系列(三)自定义Action(Custom Action)
原文:Wix打包系列(三)自定义Action(Custom Action) 3.1 关于Action 我们已经知道如何生成具有标准安装界面的安装程序了,Windows Installer按照我们的界面 ...
- J2EE进阶(三)struts2 <s:action>标签的用法
J2EE进阶(三)struts2 <s:action>标签的用法 前言 使用action标签,可以允许在jsp页面中直接调用Action,(类似AJAX页面调用)在调用Action时候,可 ...
- Struts2第三篇【Action开发方式、通配符、Struts常量、跳转全局视图、action节点默认配置】
前言 上篇Struts博文已经讲解了Struts的开发步骤以及执行流程了-..对Struts的配置文件有了了解-..本博文继续讲解Struts在配置的时候一些值得要学习的细节- Action开发的三种 ...
- mzy,struts学习(三):action中获得servlet中三域一参的三种方法
package com.mzy.servlet; import java.util.Arrays; import java.util.Map; import javax.servlet.Servlet ...
- struts 中的创建Action的三种方法
1.对于直接创建类,不实现接口和继承任何的类 例如创建一个helloAction package cn.lonecloud.control; import com.opensymphony.xwork ...
- Struts系列笔记(6)---action接收请求参数
action接收请求参数 在web开发中,去接收请求参数来获得表单信息非常的常见,自己也总结整理了有关Struts2通过action接收请求参数的几种方法. Struts2 提供三种数据封装的方式: ...
- Struts 2读书笔记-----Action访问Servlet API
Action访问Servlet API Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试. 对于Web应用的控制器而言,不访问ServletAPI是几 ...
随机推荐
- ubuntu nginx安装及相关linux性能參数优化
一.安装 下载源代码,解压:tar -xzvf nginx-1.4.7.tar.gz ./configure make && make install 改动默认nginx的监听port ...
- 为什么OC语言很难
作为一个Objective-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题.他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想 ...
- Redis数据结构
Redis数据结构 Redis数据结构详解(一) 前言 Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据 ...
- android JNI 简单demo(2)它JNI demo 写
android JNI 简单demo(2)它JNI demo 写 一.搭建Cygwin 环境:http://blog.csdn.net/androidolblog/article/details/25 ...
- bcp sqlcmd bulkinsert在unicode问题,Unexpected EOF encountered in BCP data-file
senario 进入sqlcmd使用:out xxx产生的数据文件,因为sqlcmd export to file 默认情况下,中国的乱码.因此,使用-u(unicode)开关 @echo off & ...
- SVN目录对号图标(更新、冲突)不显示
长谈想知道,大约SVN这些冲突.变化.加入.不显示问题etc目录下的复选图标,退房的在线信息,多数说的更改icon的settings,后来,一点点仔细阅读SVN配有英文说明文档,我相信,改变是有点问题 ...
- WebKit介绍及总结(一)
一 . WebKit 简单介绍 Webkit 是一个开放源码的浏览器引擎 (web browser engine) ,最初的代码来自 KDE 的 KHTML 和 KJS( 均开放源码 ) .苹果公司在 ...
- ARP协议的基础知识
关于ARP协议的基础知识 1.ARP的工作原理 本来我不想在此重复那些遍地都是的关于ARP的基本常识,但是为了保持文章的完整性以及照顾初学者,我就再啰嗦一些文字吧,资深读者可以直接跳过此节 ...
- ScrollView 在嵌套 ViewPager 时出现的问题
1.在ViewPager 外面嵌套ScrollView 时导致ViewPager 中内容不显示,解决的办法是在ScrollView 标签下增加 android:fillViewport="t ...
- MIFARE系列7《安全》
飞利浦的MIFARE卡因为它的高安全性在市场上得到广泛应用,比方我们乘车用的公交卡,学校和企业食堂的饭卡等等.它每一个扇区有独立的密匙(6个字节的password),在通信过程中首先要验证密匙才干读写 ...