spring webflow示例非规范要点说明文档
本文档着重说明示例中struts与webflow整合的关键点。
1. 配置文件说明:
1.1 web.xml
webflow基于spring框架,此处使用一般spring与struts整合方式,引入spring框架
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/webflow-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
1.2 struts-config.xml
formbean使用SpringBindingActionForm
<form-bean name="actionForm" type="org.springframework.web.struts.SpringBindingActionForm"/>
global-forwards提供给webflow跳转关系
action-mapping使用保证struts说明,类型使用FlowAction
<action path="/flowAction"
name="actionForm"
scope="request"
type="org.springframework.webflow.executor.struts.FlowAction"/>
1.3 webflow-context.xml(spring配置文件)
<bean id="actionForm" class="...Action" />指定action的class文件
注册webflow
<flow:executor id="flowExecutor" registry-ref="flowRegistry"/>
<!-- Creates the registry of flow definitions for this application -->
<flow:registry id="flowRegistry">
<flow:location path="/WEB-INF/gateway.xml"/>
</flow:registry>
1.4 gateway.xml(webflow配置文件)
流程
<start-state idref="xxx" /> <!-- 表明webflow的开始-->
<view-state id="" view=""><!-- view="" 指向struts配置文件global-forwad -->
<render-actions>
<action bean="tvgwformAction" method="setupForm" /> <!-- setupForm对应action中构造方法-->
</render-actions>
<transition on="pay" to="processChooseFormSubmit" /> <!-- on="XXX" 接收页面提交的_eventId_XXX-->
<transition on="cancel" to="cancel" /> <!-- to="XXX" 需对应跳转view-state或action-state的id-->
</view-state>
<action-state id="processChooseFormSubmit">
<action bean="tvgwformAction" method="bindAndValidate" /> <!-- bindAndValidate对应strust的validator-->
<transition on="success" to="queryAccount" />
<transition on="error" to="simupay" /> <!-- success&error 对应action方法的result返回值-->
</action-state>
<action-state id="queryAccount">
<action bean="tvgwformAction" method="queryAccount" /> <!--method对应action方法 -->
<transition on="success" to="gwForm" />
<transition on="error" to="error" />
</action-state>
<end-state id="resultForm" view="result" /> <!-- 表明webflow的结束-->
2. action类说明
2.1 action类继承自org.springframework.webflow.action.FormAction
2.2 构造方法需要设置以下参数
public TvGatewayFormAction(){
setFormObjectName("tvGateway"); //设置使用formbean的名字
setFormObjectClass(TvGateway.class); //设置使用formbean的类
setFormObjectScope(ScopeType.FLOW); //设置生命周期
setValidator(new TvGatewayValidator()); //设置验证方法
}
!注意:在验证方法中提供supports方法,注入formBean类
public boolean supports(Class clazz) {
return clazz.equals(BirthDate.class);
}
2.3 action向页面传递对象
可以使用context.getRequestScope().put(...)和context.getRequestScope().put(...)两种(实现struts request.setAttribute功能)
使用context.getRequestScope().put(...),如果对象传递目的地是end-state,页面可以接收到对象的值,如果传递目的地是view-state则不能接收到
原因:在swf 1.0中缺省alwaysRedirectOnPause开启,意味着,view在重定向之后总是会被收回,也就是说,request会在下一个请求到来时被刷新;
因此,使用context.getRequestScope().put(String, object)代替
2.4 view-state to action-state
为保证action中getFormObject(context)可取得页面提交数据,在webflow配置文件中每次从view-state跳转到action-state都必须
先调用validator的bindAndValidate,主要目的是使用validator中的support将formBean对象“注入”,从而保证formBean对象在整个flow流程中的一致性。
3. Jsp页面说明
3.1 页面显示action传递的对象可以采用<bean:write name.../> 或 ${XXX.xx }两种方法
3.2 webflow响应页面跳转是根据页面提交的_eventId_XXX对应的XXX确定的,
由于机顶盒界面不使用链接或点击事件做提交,使用javascript响应键盘事件,用js函数处理提交,为区分不同事件产生不同跳转,采用如下方法:
在javascript中创建html页面元素的方法
在页面设置一个不可见元素
<span id="_eventId"/>
在javascript脚本中添加需要创建的元素
document.getElementById("_eventId").innerHTML=<...>;
<...>可如所示 <input type=\"hidden\" name=\"_eventId_cancel\" value=\"Abandon\"/>(临时生成不同_eventId_XXX)