`

Struts中不同的Action和ActionForm组合

阅读更多
转载自:http://www.java114.com/content25/content3065.html
   在TSS.com上看到一篇好文,有关Struts使用中各种不同的Action和ActionForm组合的利弊。我先消化一下,整理好,供大家参考。原文标题:Struts action mappings: Divide Et Impera,作者:Michael Juravlev。在TSS上的URL:http://www.theserverside.com/articles/article.tss?l=StrutsActionMapping

说明:阅读本文需要一定的Struts基础。
注:文中小写的action不一定代表具体的Struts Action类,有时也指作为一个整体的action mapping。


[1] 完整的action

<action path="/aFullAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="someJSP.jsp"/>
<forward name="failed" path="someOtherJSP.jsp"/>
</action>

首先,Struts的ActionServlet接收到一个请求,然后根据struts-config.xml的配置定位到相应的mapping(映射);接下来如果form的范围是request或者在定义的范围中找不到这个form,创建一个新的form实例;取得form实例以后,调用其reset()方法,然后将表单中的参数放入form,如果validate属性不为false,调用validate()方法;如果validate()返回非空的ActionErrors,将会被转到input属性指定的URI,如果返回空的ActionErrors,那么执行Action的execute()方法,根据返回的ActionForward确定目标URI。

这样做的效果是:execute()仅当validate()成功以后才执行;input属性指定的是一个URI。


[2] 仅有Form的action

<action path="/aFormOnlyAction"
type="org.apache.struts.actions.ForwardAction"
name="someForm"
input="someJSP.jsp"
parameter="someOtherJSP.jsp"
/>

首先,Struts会在定义的scope搜寻someForm,如果找到则重用,如果找不到则新建一个实例;取得form实例以后,调用其reset()方法,然后将表单中的参数放入form,如果validate属性不为false,调用validate()方法;如果validate()返回非空的ActionErrors,将会被转到input属性指定的URI,如果返回空的ActionErrors,那么转到parameter属性指定的目标URI。

这样做的效果是:没有action类可以存放我们的业务逻辑,所以所有需要写入的逻辑都只能写到form的reset()或者validate()方法中。validate()的作用是验证和访问业务层。因为这里的action映射不包括forward(也没有意义),所以不能重定向,只能用默认的那个forward。这种仅有form的action可以用来处理数据获取并forward到另一个JSP来显示。


[3] 仅有Action的action

<action path="/anActionOnlyAction"
type="somePackage.someActionClass">
input="someJSP.jsp"
<forward name="successful" path="someJSP.jsp"/>
<forward name="failed" path="someOtherJSP.jsp"/>
</action>

首先,ActionServlet接收到请求后,取得action类实例,调用execute()方法;然后根据返回的ActionForward在配置中找forward,forward到指定的URI或action。

这样做的效果是:没有form实例被传入execute()方法,于是execute()必须自己从请求中获取参数。Action可以被forward或者重定向。这种action不能处理通过HTML FORM提交的请求,只能处理链接式的请求。


[4] 仅有JSP的action

<action path="/aJSPOnlyAction"
type="org.apache.struts.actions.ForwardAction"
parameter="someOtherJSP.jsp"
/>

首先,ActionServlet接到请求后调用ForwardAction的execute()方法,execute()根据配置的parameter属性值来forward到那个URI。

这样做的效果是:没有任何form被实例化,比较现实的情形可能是form在request更高级别的范围中定义;或者这个action被用作在应用程序编译好后充当系统参数,只需要更改这个配置文件而不需要重新编译系统。


[5] 两个action对应一个form

<action path="/anAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="/anotherAction.do"/>
</action>
<action path="/anotherAction"
type="somePackage.someOtherActionClass">
name="someForm"
input="someOtherJSP.jsp"
<forward name="successful" path="someResultJSP.jsp"/>
</action>

就每个单独的action来讲,处理上并没有和完整的action有什么实质的区别。这个组合模式可以被用来传递命令对象(form)。需要注意的是在后一个action中同样会调用form的reset()和validate()方法,因此我们必须确保form中的信息不被重写。

处理的方式大致分为两种:a) 在request中放入一个指示器表明前一个action有意向后一个action传递form,从而在后一个action可以保留那个form中的值,这一方式只能在使用forward时使用。b) 当使用redirect而不是forward时,可以把指示器放在session或更高的级别,在命令链的最后一环将这个指示器清除。


[6] 两个action对应两个form

<action path="/anAction"
type="somePackage.someActionClass">
name="someForm"
input="someJSP.jsp"
<forward name="successful" path="/anotherAction.do" redirect="true"/>
</action>
<action path="/anotherAction"
type="somePackage.someOtherActionClass">"
name="someOtherForm"
input="someOtherJSP.jsp"
<forward name="successful" path="someResultJSP.jsp"/>
</action>

这个组合方式跟前一种在流程上没有太大区别,只是我们现在对于两个action分别提供了form,于是代码看上去更加清晰。于是我们可以分别处理WEB应用程序的输入和输出。值得注意的是,后一个action同样会尝试往form中写入那些参数,不过我们可以这样处理:a) 在后一个form中使用另一套属性名;b) 只提供getter而不提供setter。

大致的处理是这样:
前一个action接收输入、验证、然后将数据写入业务层或持久层,重定向到后一个action,后一个action手动的从业务层/持久层取出数据,写入form(通过其他方式),交给前台JSP显示。

这样做的好处是不必保留输入form中的值,因此可以使用redirect而不是forward。这样就降低了两个action之间的耦合度,同时也避免了不必要的重复提交。
分享到:
评论

相关推荐

    Struts中不同的Action和ActionForm组合.rar

    在这个名为“Struts中不同的Action和ActionForm组合.rar”的压缩包中,主要探讨的是Struts框架中Action和ActionForm的组合使用方式,以及它们在处理用户请求和数据验证过程中的作用。以下是对这个主题的详细解释。 ...

    struts 视频 struts视频 actionform

    3. **ActionForm的使用**:如何创建ActionForm类,定义属性并添加对应的get和set方法,以及如何在struts-config.xml中配置ActionForm。 4. **数据验证**:ActionForm不仅可以收集数据,还可以进行数据验证。通过...

    struts1和struts2的区别

    - **Struts2**: 支持为每个Action定义不同的拦截器堆栈(Interceptor Stacks),这意味着可以根据不同的Action来配置不同的拦截器组合,增加了灵活性。 通过上述对比可以看出,Struts2相比Struts1在很多方面进行了...

    struts 的jar包

    在Java Web开发中,jar(Java Archive)文件是用于打包类和其他资源的容器,方便在不同项目中复用和分发。 Struts的核心jar包通常包括以下部分: 1. `struts-core.jar`:包含了Struts框架的基本组件,如Action、...

    Struts1 的中文和英文API

    API文档是程序员在使用框架时的重要参考,它详细描述了框架中各个类、方法、接口的功能、参数和返回值,有助于开发者快速理解和使用Struts1。 描述中的“包含Struts1中文和英文的API和帮助文档”,意味着不仅有英文...

    Struts基础电子书

    ActionForm用于封装表单数据,它继承自org.apache.struts.action.ActionForm,并通过getter和setter方法来存储和获取数据。 五、请求处理流程 1. 用户向服务器发送请求,请求包含Action的路径。 2. ActionServlet...

    Struts1.2Action之处理多个业务

    1. **单一Action处理多个业务**:在一个Action类中定义多个方法,每个方法对应一个业务,然后在struts-config.xml配置文件中为每个方法指定不同的`&lt;action&gt;`元素。请求参数可以用来区分调用哪个方法。 2. **使用...

    转:struts1与struts2的区别

    - **Struts2**: 在Struts2中,可以通过初始化、设置属性和调用方法等方式轻松地测试Action。依赖注入的支持进一步简化了测试过程,使开发者能够更加专注于逻辑验证而非环境配置。 #### 5. 输入数据的处理方式 - **...

    Struts中文手册.rar

    Tiles是Struts的一个扩展,允许开发者创建和组合多个JSP页面,形成复杂的布局。通过Tiles定义模板和定义视图,可以实现灵活的页面结构和重用。 六、国际化与本地化 Struts支持多语言环境,通过资源包(Properties...

    struts1和struts2中文教程

    4. **配置方式**:Struts2支持XML和注解两种配置方式,XML配置在struts.xml文件中,注解则可以直接在Action类或方法上。 5. **插件体系**:Struts2有丰富的插件支持,如上传下载、JSON支持、i18n等,大大提升了开发...

    struts1.2的各项功能小demo

    4. **配置文件(struts-config.xml)**:这是Struts的主配置文件,定义了Action、ActionMapping、ActionForm和数据源等信息。在"demo"中,可以通过查看这个文件了解各个Action的映射和表单的配置。 5. **Tiles**:...

    Struts in Action 中文修正版(电子书)

    6. **国际化与本地化**:学习如何在Struts中实现多语言支持,为不同的区域和语言提供定制的用户界面。 7. **异常处理**:理解Struts的异常处理机制,包括全局和局部异常映射,以及如何自定义异常处理策略。 8. **...

    struts 中所需要的包

    同时,还需要配置web.xml文件,设置ActionServlet的初始化参数,以及struts-config.xml配置文件,定义Action、ActionForm和ActionMapping等元素。只有正确地配置和引用了这些包,才能确保Struts框架能够正常运行并...

    Struts In Action中文章节版

    5. **国际化与本地化**:学习如何在Struts应用中实现多语言支持,通过资源文件配置,为不同地区的用户提供相应的界面。 6. **异常处理**:理解Struts的异常处理机制,如何自定义错误页面,以及如何配置全局和特定...

    Struts in Action 中文版

    Struts框架的核心组件包括ActionServlet、Action、ActionForm、Tiles和国际化资源等。 1. **ActionServlet**:作为入口点,处理所有的HTTP请求,并根据配置文件将请求转发给相应的Action。 2. **Action**:实现了...

    Struts中文api

    8. **ActionServlet**:作为Struts的核心Servlet,负责初始化和配置ActionMapping、ActionForm等组件。 9. **配置文件**:包括struts-config.xml和web.xml,它们定义了Struts的全局配置,如Action的映射、数据源、...

    struts整体构架和核心标签库.

    Struts提供了基于XML和注解的数据校验机制,可以在ActionForm中定义校验规则,确保用户输入的数据符合业务需求。 **8. Tiles框架集成** Tiles是一个视图组合框架,Struts可以与之集成,实现复杂的页面布局。Tiles...

    Struts中文手册

    Tiles是Struts的一个扩展,它允许创建可复用的页面布局(Tiles),通过定义模板和组合不同的小部件,可以轻松地创建复杂的页面结构。 九、Struts与Ajax集成 Struts可以通过使用AJAX库(如jQuery)进行增强,实现...

    struts1和struts2的对比

    - 允许链式验证(Chain Validation),可以按需组合不同的验证规则。 - 验证逻辑更加独立,减少了与业务逻辑的耦合度。 #### 请求处理器与拦截器栈 - **Struts1的请求处理器** - 每个请求都需要经过一系列的...

    struts in action 源码

    在Struts中,Action类充当控制器角色,每个Action对应一个用户操作。 **Action类与ActionForm** - **Action类**:是处理用户请求的核心,通过实现Action接口或继承自ActionSupport基类。Action类中的execute方法...

Global site tag (gtag.js) - Google Analytics