重温Struts--Action

阅读更多

作者:Flyingis

Struts中,ActionServlet担任分配工作的控制器角色,实际的工作是交给Action对象来进行的。ActionStruts框架的核心类之一,它主要用来访问业务层、为表现层准备数据对象和处理错误异常。

ActionStruts框架中基本上属于控制器的角色,通常不建议在Action中加入过多的业务逻辑,将业务逻辑封装在其他的类中,然后在Action中建立这些类的对象,调用对象的方法来实现业务功能。比较遗憾的是,当业务逻辑中出现异常的时候没有办法将异常说明在页面中直接反应出来,展现给用户,在Action中控制这些异常可以做到这点。

要更详细的了解Action的工作机理,就要剖析ActionServlet控制器的工作流程及其核心方法。在Struts中,担任控制器角色的核心是ActionServlet,所有的请求都必须先通过它,而对所有请求的处理是交付给RequestProcessor来完成的,既然处理请求的任务是交给RequestProcessor来完成,那么可以直接查看org.apche.struts.action.RequestProcessor类,看其process()方法实现了哪些功能,从源代码中的英文注释我们可以更深入了解到整个处理过程,很多书籍和网上不少文章都描述了这个过程,还有典型的处理过程图示,这里就不再详述。只是从这个过程可以看出,通过继承ActionServlet来定义自己的控制器请求意义不大,重写init()方法倒是可以修改初始化工作,如果需要定义自己的控制器,可以继承RequestProcessor并修改其中的process()方法来实现。

Struts应用中,除了直接继承org.apache.struts.action.Action类实现Action功能外,Struts还提供了其他几种Action类来满足某种特定需要,这些书本上已经写了很多,这里只是照葫芦画瓢略作总结:

ForwardAction—当需要从一个页面转到另一个页面或资源时,不提倡直接使用页面或资源路径调用,除了与MVC/Model2架构向背之外,有时还会带来其他的问题,前几天在网上看到一个帖子就是因为直接调用资源出现了异常,具体出自于哪里没有记住。这里,应该通过控制器使用ForwardAction来完成链接的跳转,使用属性parameter设定forward的链接地址。

IncludeAction—ForwardAction类似,当需要引入一个资源时,可以使用IncludeAction来实现,属性parameter设定include的链接地址。

SwitchAction—用于从一个模块转换至另一个模块,一种方法是使用相对于Context的路径来进行forward查找,另外一种就是使用SwithAction,它需要在请求中带两个参数,一个是prefix用来指定模块前缀名称,一个是page用来指定相对于模块的资源路径。

DispatchAction—随着Struts Web应用规模扩大,维护Action复杂度提高,可以使用模块化来管理Action。另一方面,当一个页面需要多个Action时,我们就可以使用DispatchAction来将一个页面中所有相关的动作放在一个action类中实现,此时不需要重定义execute()方法,它已经在DispatchAction抽象类中定义,我们需要编写自己的方法来响应一个页面上不同的动作。它的关键属性是parameter

LookupDispatchAction—它是DispatchAction的子类,不同的是,当页面按钮的property属性相同的时候,它可以通过查询资源文件来确定相应的动作,这个功能主要是通过重写getKeyMethodMap()方法实现的。

你可能感兴趣的:(Struts,框架,MVC,工作,Apache)