完整的action
﹤action path=/aFullActiontype=somePackagesomeActionClass﹥
name=someForm
input=someJSPjsp
﹤forward name=successful path=someJSPjsp/﹥
﹤forward name=failed path=someOtherJSPjsp/﹥
﹤/action﹥
首先Struts的ActionServlet接收到一个请求然后根据strutsconfigXML的配置定位到相应的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=/aFormOnlyActiontype=orgapachestrutsactionsForwardAction
name=someForm
input=someJSPjsp
parameter=someOtherJSPjsp
/>
首先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=/anActionOnlyActiontype=somePackagesomeActionClass﹥
input=someJSPjsp
﹤forward name=successful path=someJSPjsp/﹥
﹤forward name=failed path=someOtherJSPjsp/﹥
﹤/action﹥
首先ActionServlet接收到请求后取得action类实例调用execute()方法然后根据返回的ActionForward在配置中找forwardforward到指定的URI或action
这样做的效果是没有form实例被传入execute()方法于是execute()必须自己从请求中获取参数Action能够被forward或重定向这种action不能处理通过HTML FORM提交的请求只能处理链接式的请求
仅有JSP的action
﹤action path=/aJSPOnlyActiontype=orgapachestrutsactionsForwardAction
parameter=someOtherJSPjsp
/﹥
首先ActionServlet接到请求后调用ForwardAction的execute()方法execute()根据配置的parameter属性值来forward到那个URI
这样做的效果是没有任何form被实例化比较现实的情形可能是form在request更高级别的范围中定义或这个action被用作在应用程式编译好后充当系统参数只需要更改这个配置文档而无需重新编译系统
两个action对应一个form
﹤action path=/anActiontype=somePackagesomeActionClass﹥
name=someForm
input=someJSPjsp
﹤forward name=successful path=/anotherActiondo/﹥
﹤/action﹥
﹤action path=/anotherAction
type=somePackagesomeOtherActionClass﹥
name=someForm
input=someOtherJSPjsp
﹤forward name=successful path=someResultJSPjsp/﹥
﹤/action﹥
就每个单独的action来讲处理上并没有和完整的action有什么实质的区分这个组合模式能够被用来传递命令对象(form)需要注意的是在后一个action中同样会调用form的reset()和validate()方法因此我们必须确保form中的信息不被重写
处理的方式大致分为两种
a) 在request中放入一个指示器表明前一个action有意向后一个action传递form从而在后一个action能够保留那个form中的值这一方式只能在使用forward时使用b) 当使用redirect而不是forward时能够把指示器放在session或更高的级别在命令链的最后一环将这个指示器清除
﹤action path=/anActiontype=somePackagesomeActionClass﹥
name=someForm
input=someJSPjsp
﹤forward name=successful path=/anotherActiondo redirect=true/﹥
﹤/action﹥
﹤action path=/anotherAction
type=somePackagesomeOtherActionClass﹥
name=someOtherForm
input=someOtherJSPjsp
﹤forward name=successful path=someResultJSPjsp/﹥
﹤/action﹥
这个组合方式跟前一种在流程上没有太大区分只是我们现在对于两个action分别提供了form于是代码看上去更加清楚于是我们能够分别处理Web应用程式的输入和输出值得注意的是后一个action同样会尝试往form中写入那些参数但是我们能够这样处理
a) 在后一个form中使用另一套属性名
b) 只提供getter而不提供setter
大致的处理是这样
前一个action接收输入验证然后将数据写入业务层或持久层重定向到后一个action后一个action手动的从业务层/持久层取出数据写入form(通过其他方式)交给前台JSP显示
这样做的好处是不必保留输入form中的值因此能够使用redirect而不是forward这样就降低了两个action之间的耦合度同时也避免了不必要的重复提交