# ComplexFormBeanController.jpf Sample

This topic inludes the source code for the ComplexFormBeanController.jpf Sample.

## Sample Location

This sample is located in the following directory in your WebLogic Workshop installation:

BEA_HOME/weblogic81/samples/workshop/SamplesApp/WebApp/handlingData/complexFormBean/

## Sample Source Code

`001 package handlingData.complexFormBean; 002 003 import com.bea.wlw.netui.pageflow.FormData; 004 import com.bea.wlw.netui.pageflow.PageFlowController; 005 import com.bea.wlw.netui.pageflow.Forward; 006 import handlingData.complexFormBean.controls.CustomerControl; 007 import handlingData.complexFormBean.controls.CustomerControl.Customer; 008 009 /** 010 * This sample demonstrates how to pre-populate a form and submit it to a page flow using 011 * a FormBean that contains a custom Java object. 012 * 013 * Note that the FormBean CustomerForm contains the custom Java object 014 * complexFormBean.controls.CustomerControl.Customer. 015 * 016 * @jpf:controller 017 * @jpf:forward name="index" path="enterCoupon.jsp" 018 * @jpf:view-properties view-properties:: 019 * <!-- This data is auto-generated. Hand-editing this section is not recommended. --> 020 * <view-properties> 021 * <pageflow-object id="pageflow:/handlingData/complexFormBean/complexFormBeanController.jpf"/> 022 * <pageflow-object id="action:begin.do"> 023 * <property name="x" value="120"/> 024 * <property name="y" value="60"/> 025 * </pageflow-object> 026 * <pageflow-object id="action:submitCouponNumber.do#handlingData.complexFormBean.complexFormBeanController.CustomerForm"> 027 * <property value="300" name="x"/> 028 * <property value="220" name="y"/> 029 * </pageflow-object> 030 * <pageflow-object id="action-call:@page:enterCoupon.jsp@#@action:submitCouponNumber.do#handlingData.complexFormBean.complexFormBeanController.CustomerForm@"> 031 * <property value="156,210,210,264" name="elbowsX"/> 032 * <property value="212,212,212,212" name="elbowsY"/> 033 * <property value="East_1" name="fromPort"/> 034 * <property value="West_1" name="toPort"/> 035 * </pageflow-object> 036 * <pageflow-object id="page:enterCoupon.jsp"> 037 * <property name="x" value="120"/> 038 * <property name="y" value="220"/> 039 * </pageflow-object> 040 * <pageflow-object id="action-call:@page:thankyou.jsp@#@action:begin.do@"> 041 * <property value="264,210,210,156" name="elbowsX"/> 042 * <property value="52,52,52,52" name="elbowsY"/> 043 * <property value="West_1" name="fromPort"/> 044 * <property value="East_1" name="toPort"/> 045 * </pageflow-object> 046 * <pageflow-object id="page:thankyou.jsp"> 047 * <property value="300" name="x"/> 048 * <property value="60" name="y"/> 049 * </pageflow-object> 050 * <pageflow-object id="forward:path#success#enterCoupon.jsp#@action:begin.do@"> 051 * <property value="120,120,120,120" name="elbowsX"/> 052 * <property value="104,140,140,176" name="elbowsY"/> 053 * <property value="South_1" name="fromPort"/> 054 * <property value="North_1" name="toPort"/> 055 * <property value="success" name="label"/> 056 * </pageflow-object> 057 * <pageflow-object id="forward:path#success#thankyou.jsp#@action:submitCouponNumber.do#handlingData.complexFormBean.complexFormBeanController.CustomerForm@"> 058 * <property value="300,300,300,300" name="elbowsX"/> 059 * <property value="176,140,140,104" name="elbowsY"/> 060 * <property value="North_1" name="fromPort"/> 061 * <property value="South_1" name="toPort"/> 062 * <property value="success" name="label"/> 063 * </pageflow-object> 064 * <pageflow-object id="forward:path#failed#enterCoupon.jsp#@action:submitCouponNumber.do#handlingData.complexFormBean.complexFormBeanController.CustomerForm@"> 065 * <property value="264,210,210,156" name="elbowsX"/> 066 * <property value="212,212,212,212" name="elbowsY"/> 067 * <property value="West_1" name="fromPort"/> 068 * <property value="East_1" name="toPort"/> 069 * <property value="failed" name="label"/> 070 * </pageflow-object> 071 * <pageflow-object id="control:handlingData.complexFormBean.controls.CustomerControl#customerControl"> 072 * <property value="46" name="x"/> 073 * <property value="34" name="y"/> 074 * </pageflow-object> 075 * <pageflow-object id="formbeanprop:handlingData.complexFormBean.complexFormBeanController.CustomerForm#customer#handlingData.complexFormBean.controls.CustomerControl.Customer"/> 076 * <pageflow-object id="formbeanprop:handlingData.complexFormBean.complexFormBeanController.CustomerForm#couponNumber#java.lang.String"/> 077 * <pageflow-object id="formbean:handlingData.complexFormBean.complexFormBeanController.CustomerForm"/> 078 * <pageflow-object id="forward:path#index#enterCoupon.jsp"/> 079 * </view-properties> 080 * :: 081 */ 082 public class complexFormBeanController extends PageFlowController 083 { 084 /** 085 * @common:control 086 */ 087 private handlingData.complexFormBean.controls.CustomerControl customerControl; 088 089 public String message; 090 091 /** 092 * When the pageflow is first invoked, forward the user to the enterCoupon.jsp 093 * page and pre-populate the form fields on that page. 094 * 095 * Note that the FormBean CustomerForm is forwarded to the enterCoupon.jsp page, 096 * so that the fields on that page are pre-populated with values. 097 * 098 * @jpf:action 099 * @jpf:forward name="success" path="enterCoupon.jsp" 100 */ 101 protected Forward begin() 102 { 103 message=""; 104 CustomerForm form = new CustomerForm(); 105 form.setCustomer(customerControl.getCustomer(42)); 106 107 return new Forward("success", form); 108 } 109 110 /** 111 * @jpf:action 112 * @jpf:forward name="success" path="thankyou.jsp" 113 * @jpf:forward name="failed" path="enterCoupon.jsp" 114 */ 115 protected Forward submitCouponNumber(CustomerForm form) 116 { 117 /* 118 * In a real-world situation, you would do something here with the data from the form, 119 * such as enter the data in a database, or run some other business process. 120 */ 121 boolean outcome = customerControl.updateCustomer(form.getCustomer(), form.getCouponNumber()); 122 /* 123 * If the updateCustomer method returns true, forward the user to the 124 * thankyou.jsp page. 125 */ 126 if(outcome == true) 127 return new Forward("success", form); 128 /* 129 * If the updateCustomer method returns false, send the user back to the 130 * enterCoupon.jsp page. 131 */ 132 else { 133 message="Submission failed. Please try again"; 134 return new Forward("failed"); 135 } 136 } 137 138 /** 139 * The following FormBean has two uses in this page flow. 140 * 141 * (1) It is used to pre-populate the fields of the enterCoupon.jsp page (see the begin method). 142 * 143 * (2) It is used to submit values from the enterCoupon.jsp page. 144 * 145 * These two uses cannot be accomplished by a single instance of the FormBean. 146 * That is why we have included the reset method in the FormBean below. 147 * The reset method allows the Workshop runtime to create two instances of the 148 * FormBean for one pre-population / submission cycle. 149 */ 150 public static class CustomerForm extends FormData 151 { 152 private String couponNumber; 153 154 private Customer customer; 155 156 public void setCustomer(Customer customer) 157 { 158 this.customer = customer; 159 } 160 161 public Customer getCustomer() 162 { 163 return this.customer; 164 } 165 166 public void reset(org.apache.struts.action.ActionMapping mapping, 167 javax.servlet.http.HttpServletRequest request) 168 { 169 // Create an instance of the bean when 170 // the data is submitted to the page flow. 171 this.customer = new Customer(); 172 } 173 174 public void setCouponNumber(java.lang.String couponNumber) 175 { 176 this.couponNumber = couponNumber; 177 } 178 179 public java.lang.String getCouponNumber() 180 { 181 return this.couponNumber; 182 } 183 } 184 185 186 }`