Struts中ActionActionForm
2019独角兽企业重金招聘Python工程师标准>>>
在Struts架构中,通常使用一种名为ActionForm的系统状态Bean,来实现应用系统的非持久性数据存储和维护功能.具体来说,这种类型的对象主要用于保存用户请求表单中的数据,并可保持其状态的连续性,即在不同的页面间传递这些数据. ActionForm Bean的运行处理过程如下:
控制器ActionServlet接收到一个客户端请求后,会将该请求委托给一个RequestProcessor对象进行处理.该对象是遵照配置文件struts-config.xml中与该请求匹配的<action>子元素的约定对该请求进行处理的,首先依据<action>元素的name属性在规定的范围(“request”或”session”)内查找指定的 ActionForm Bean,如果找不到则自动创建一个新的Bean实例. RequestProcessor随后重置该表单Bean的状态,即使用请求表单中的数据自动填充其相应属性.然后该Bean被作为参数传递给相应的处理器Action对象的execute()方法开始后续的处理过程.
下面我们将通过各种不同的Action和ActionForm组合来更清楚地了解它们的运行机理以及它们的不同组合带来的效果.
一. 完整的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。
二. 仅有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来显示。
三.仅有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提交的请求,只能处理链接式的请求。
四.仅有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被用作在应用程序编译好后充当系统参数,只需要更改这个配置文件而不需要重新编译系统。
五. 两个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或更高的级别,在命令链的最后一环将这个指示器清除。
六. 两个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之间的耦合度,同时也避免了不必要的重复提交。
转载于:https://my.oschina.net/JiangTun/blog/294515
Struts中ActionActionForm相关推荐
- struts中简单的校验
Struts中简单的校验 "计应134(实验班) 凌豪" Struts2校验简要说明:struts2中通常情况下,类型转换要在数据校验之前进行.类型转换其实也是基本的服务器端校验, ...
- Struts 中的自定义异常
在struts 中要想自定义异常,首先我们要写一个普通的java类来继承RuntimeException如下所示: package exception; public class MyExceptio ...
- struts中的javascript - seinbar的专栏
上一篇文章中介绍校验时提到客户边的校验用到了JavaScript,实际上用Struts配合JavaScript还可以实现许多有用的功能,比如,级联下拉菜单的实现就是一个典型的例子: 本例假设要实现的是 ...
- struts中的redirect=true与redirect=false
struts中的redirect="true"与redirect="false" struts中的redirect="true"与redir ...
- Struts 中的ActionForm
Struts 中定义了一些JavaBeans,主要是以ActionForm为父类扩展开来的,如下图: ① org.apache.struts.action包中 public abstract clas ...
- 怎么在struts中配置数据源
前段时间有很多人问struts配置数据源的问题,我整理了一下资料,现在发布一下给大家分享.在struts中配置oracle数据源需要四个包:commons.pools,commons.dbcp,Cla ...
- Struts中乱码问题解决
以我自己的了解,在进行struts开发的过程中,总也是出现很多的乱码问题 ,但归根到底,也只是以下三种情况: ㈠页面显示中文乱码 ㈡传递参数中文乱码 ㈢国际化资源文件乱码 下面就这三中情况介绍怎么在具 ...
- Struts中Action三种接收参数的方式?
前言: 前面已经有一篇随笔介绍了Struts2的大概原理.本文就Struts2中Action与jsp页面进行数据对接时介绍几种常见方法! 值栈ValueStack 3个Action Action1 p ...
- struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)...
JSON主要创建如下两种数据对象: 由JSON格式字符串创建,转换成JavaScript的Object对象: 由JSON格式字符串创建,转换成JavaScript的List或数组链表对象. 更多关于J ...
最新文章
- 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库
- 生产者与消费者(二)---await与 signal
- 快照是什么?揭秘存储快照的实现
- sql查询时间过长和什么有关系_2020年成人高考成绩查询时间是什么时候?
- 使用javascript生成的植物显示过程特效
- 漫谈工业软件(4)-关于开源工业控制软件
- 计算机硬件只能通过软件使用,日常软件分享 篇四:还在用鲁大师?查看电脑硬件信息可以用这些免费的软件!...
- [境内法规]中国人民银行关于印发《反洗钱现场检查管理办法(试行)》的通知—银发〔2007〕175号
- 兰州大学本科毕业论文答辩PPT模板
- 楚留香ai人脸识别_《楚留香》评测掌中快意恩仇的世界
- 企业服务总线(EnterpriseServiceBus,ESB)
- Unix平台下的常用命令技巧之五 资源与性能
- NoSQL 一致性[详解]更新一致性
- vue2 qrcodejs2链接生成二维码
- Anaconda安装及使用
- 消消乐要求 c语言程序,C++语言实现开心消消乐
- 云主机的六大安全威胁
- 利用pandoc把latex文件转换为word的基本操作
- 《海底捞你学不会》学什么
- 星际密码(编程题解)
热门文章
- 公司只有1个测试,领导却让我同时操作1000个手机号
- 4种实例 advice aop_JAVA动态代理 和 Spring AOP 4种通知的简单实现
- 电商常用字体_字体商用有风险,侵权罚款上千万!告诉你怎么正确使用
- k8s安装nginx部署前端页面_Kubernetes(k8s)部署并测试nginx service
- MobileNetV2: Inverted Residuals and Linear Bottlenecks
- 2021年朔州市副高考试成绩查询,2021朔州市第二中学校教师成绩查询入口:http://www.shuozhou.gov.cn/ztjs/rlzy/rsks/...
- java生僻字_Android上显示生僻字的方法
- 定时任务管理系统 java_几种任务调度的 Java 实现方法与比较(定时任务)(转)...
- html页面酷炫,5个酷炫、实用的HTML标签和属性介绍
- drop table可以删除多张表吗_delete、truncate、drop 有啥区别?该怎么选择?