Action

原创 2007年09月29日 21:54:00

Action类(org.apache.struts.action.Action)是Struts架构中控制器组件的重要组成部分,它是用户请求和业务逻辑之间沟通的媒介。每个Action类型的对象实际上都在充当客户的业务代理。它就像政府部门接待群众来访的接待室工作人员,负责倾听群众的要求,然后按照要求的不同,调用不同的业务逻辑处理方法进行处理,即转达给对应的部门进行处理。

在Struts设计架构中,人们通常在处理器Action类的excute()方法中添加下属处理逻辑:

(1)用户进行身份验证

对用户的身份验证一般分两种情形:用户登录时的验证和中间验证。

中间验证的目的是为了防止未注册的用户绕开登录页面(通过直接访问中间页面的方式)进入应用程序,或者session超时失效后用户有继续操作。这种情况一般可以通过检验session状态来实现。有关这部分控制逻辑将在后续中具体实现。

(2)调用其它的业务逻辑Bean

虽然从语法上讲,可以将所有的业务逻辑都直接封装在处理器Action类中,但这并不是推荐的做法。通常应该将商务逻辑封装到独立的业务逻辑Bean中,再通过调用Action的excute()方法进行调用。

(3)

新服务器端对象状态

这里的服务器端对象通常指那些request范围或session 范围的Bean,在Servlet中对应的则是Request或Session对象的属性,它们一般会在后续页面中被用来创建用户界面。如:

request.setAttribute("username",userform.getUsername()); 或

session.setAttribute("username",userform.getUsername()); 

(4)返回ActionForward对象,用于标识要转向到的下一个目标页面。

如何设计好的Action?

在设计处理器Action类时要注意以下几点:

(1)首先,RequestProcessor对象对于每种Action类型只创建一个实例,该实例将被用于所有匹配的请求,这就需要定义Action类考虑如何使之能够在一个多线程环境中正常运行。(也正是由于使用多线程Servlet容器可以同时接受多个客户请求,而不是传统的多进程,另外,这样有利于代码重用。)和过去定义Servlet类的doPost()/doGet()方法类似,为实现这种线程安全,一个重要的原则是在Action类中尽量只使用局部变量而不是实例变量。局部变量的作用域被限定在所在的方法,其生存期只限于所在方法的一次运行期间,不存在被多个请求处理线程共享的问题。

(2)虽然org.apache.struts.action.Action类的excute()方法原型中允许抛出Exception,但应尽量在Action类中加入处理逻辑,在方法内部捕获和处理可能抛出的违例,而不是简单将之抛出。

(3)应该在控制其将请求重定向到其它页面前,释放action组件所占用的资源(如数据库联接),包括在调用其它业务逻辑Bean的功能方法出错、抛出违例时。

(4)要避免出现非常大的Action类,虽然表面看来将商业逻辑功能也嵌入到Action类本身实现起来最简单,但这会导致使Action类的可读性和可维护性变差。由于这些商业逻辑代码被嵌入于只能运行在Web应用程序环境的组件中,因此很难有重用的可能。

综上所述,Action通常负责将客户端请求映射到处理这些请求的业务逻辑Bean,再转向生成响应回送给客户端的页面,实际上起到的是 Controller和Model之间的“适配器”的作用,属于一种低层面的控制器。

相关文章推荐

Intent中的四个重要属性——Action、Data、Category、Extras

本文来自http://blog.csdn.net/liuxian13183/ ,引用请注明出处!All Rights Reserved !         Intent作为联系各Ac...

解析请求参数调用Action中的方法的struts1.x完整实例

1、简介         通过扩展DispatchAction类,并复写其中的execute方法,来通过解析请求地址中的Method=?参数来调用相应Action中的方法,从而很好地实现了控制器的请...

struts2中如何根据请求路径定位到详细的访问action

在struts2中在访问一个菜单链接时,我们只需要将相应的package 命名空间和 action的name进行组合,并加上相应的后缀,就可以直接访问到相应的Action了,那么这个过程是如何进行的,...

Struts2学习之Action接收参数方法二(用DomainModel接收参数(模型驱动))

用DomainModel接收参数(模型驱动) 如果要接受的参数的个数很多,可以不用定义属性而是直接定义一个对象。 前台代码: …… DoMainModel?user.userName...

Struts2中Action的动态调用方法

在Struts2中,Action执行的时候并不一定要执行execute,我们可以指定Action执行哪个方法,下面分别介绍三种方法来指定Action执行哪个方法: 1.第一种方法,通过Action...

action提交表单路径两种方法:web.xml设置和注解

action提交表单给servlet的方法:    ********** A代表servlet名字,不能写前边的各种包名字,前面的斜杠  /  也不能写。 方法一:web.xml法 首先...

对web项目的执行过程的理解,从一个http请求如http://localhost:8080/test/login.action开始

对web项目的执行过程的理解,内容包括1 http url  2 html、servlet、jsp 3 tomcat等。web项目的整个执行过程,从一个http请求如http://localhost:...

安卓时间相关的广播(Intent.ACTION_TIME_TICK)

1.Intent.ACTION_TIME_TICK 含义:系统每分钟会发出该广播2.用法: IntentFilter filter = new IntentFilter(); filt...

layer.js 弹出层提交form表单,action重定向

layer.js,一个jquery的插件,可以用它来做信息提示,弹出层等。  官方demo地址:http://layer.layui.com/ 官方api地址:http://layer.layui.c...
  • AHAU10
  • AHAU10
  • 2016年04月28日 19:33
  • 21186

actionBar添加action图片和点击事件

Action bar允许你为与当前应用上下文相关的最重要的action items添加action按钮。那些直接显示在action bar上的icon或者文字都被称作action buttons。那些...
  • god2030
  • god2030
  • 2016年04月13日 09:45
  • 1545
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Action
举报原因:
原因补充:

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