I'm very new to Spring and have been using Web Flow PR3 to design a fairly straightforward multi-page form based off of the 'sellitem' sample. I have run into two problems, both of which are related:

The first problem is that <spring:bind ....> tags are not being intercepted in my .jsp files, so I cannot see any errors that are generated by Web Flow. For instance the following .jsp:

Code:
<spring&#58;bind path="user.*">
	<c&#58;forEach items="$&#123;status.errorMessages&#125;" var="error">
		Error code&#58; <c&#58;out value="$&#123;error&#125;"/><br/>
	</c&#58;forEach>
</spring&#58;bind>
then becomes the following when output to the web browser:

Code:
<spring&#58;bind path="user.*">

</spring&#58;bind>

The second problem is that when I choose a form object that has class members that are not strings, such as a long, when SWF binds to this object, the current state (page) of the flow is returned again if the field is left blank, or un-convertable data is entered (such as a ',' for a long data field). I know that an error is returned because if I enter in a number, the flow continues to the next state (page). However, as i mentioned in my first problem, I can't see this error since <spring:bind ...> tags are not getting interpreted.

The most irritating problem is that if a field is not required, but should be something other than String, then I will have no way of ignoring empty fields! Obviously if a ',' was entered I would like to reply, but otherwise if the field is empty it should be inherently ignored.

Regardless, here's my code:

blah-servlet.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http&#58;//www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java&#58;comp/env/jdbc/TestDB" />
    </bean>

    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation" value="WEB-INF/sqlmap-config.xml" />
    </bean>

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

	<bean name="/order/" class="org.springframework.web.flow.mvc.FlowController">
		<property name="cacheSeconds" value="0"/>
		<property name="flow" ref="orderProcess"/>
	</bean>

	<bean id="orderProcess" class="org.springframework.web.flow.config.XmlFlowFactoryBean">
		<property name="location" value="/WEB-INF/order-flow.xml"/>
	</bean>

	<bean id="orderActions" class="com.blah.web.OrderActions">
		<property name="validator">
			<bean class="com.blah.web.OrderValidator"/>
		</property>
	</bean>

</beans>
order-flow.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE webflow PUBLIC "-//SPRING//DTD WEBFLOW//EN"
	"http&#58;//www.springframework.org/dtd/spring-webflow.dtd">

<webflow id="orderProcess" start-state="setupForm">

	<action-state id="setupForm">
		<action bean="orderActions"/>
		<transition on="success" to="orderLogin"/>
	</action-state>

    <view-state id="orderLogin" view="orderLoginForm">
		<transition on="submit" to="orderPayment">
			<action bean="orderActions" method="bindAndValidate">
				<property name="actionState" value="orderLoginProcess"/>
				<property name="validatorMethod" value="validatePriceAndItemCount"/>
			</action>
		</transition>
    </view-state>

    <view-state id="orderPayment" view="orderPaymentForm">
		<transition on="submit" to="orderPaymentDetail">
			<action bean="orderActions" method="bindAndValidate">
				<property name="actionState" value="orderPaymentProcess"/>
				<property name="validatorMethod" value="validatePriceAndItemCount"/>
			</action>
		</transition>
    </view-state>

	<view-state id="orderPaymentDetail" view="orderPaymentDetailForm">
		<transition on="submit" to="orderConfirm">
			<action bean="orderActions" method="bindAndValidate">
				<property name="actionState" value="orderPaymentDetailProcess"/>
				<property name="validatorMethod" value="validatePriceAndItemCount"/>
			</action>
		</transition>
    </view-state>

	<view-state id="orderConfirm" view="orderConfirmForm">
		<transition on="submit" to="showTicket">
			<action bean="orderActions" method="bindAndValidate">
				<property name="actionState" value="orderConfirmProcess"/>
				<property name="validatorMethod" value="validatePriceAndItemCount"/>
			</action>
		</transition>
    </view-state>

	<end-state id="showTicket" view="showTicketView"/>

</webflow>
OrderActions.java
Code:
package com.blah.web;

import org.springframework.web.flow.ScopeType;
import org.springframework.web.flow.action.FormAction;
import org.springframework.web.flow.RequestContext;
import org.springframework.web.bind.RequestUtils;
import org.springframework.web.flow.Event;
import org.springframework.web.flow.execution.servlet.ServletEvent;

public class OrderActions extends FormAction &#123;

	public OrderActions&#40;&#41; &#123;
		setFormObjectName&#40;"query"&#41;;
		setFormObjectClass&#40;com.blah.bus.Testtest.class&#41;;
		setFormObjectScope&#40;ScopeType.FLOW&#41;;
		setErrorsScope&#40;ScopeType.FLOW&#41;;
	&#125;

	protected boolean validationEnabled&#40;RequestContext context&#41; &#123;
		return context.getProperties&#40;&#41;.containsAttribute&#40;VALIDATOR_METHOD_PROPERTY&#41;;
	&#125;

&#125;
OrderValidator.java
Code:
package com.blah.web;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

public class OrderValidator implements Validator &#123;

	public boolean supports&#40;Class clazz&#41; &#123;
		return clazz.equals&#40;com.blah.bus.Testtest.class&#41;;
	&#125;

	public void validate&#40;Object obj, Errors errors&#41; &#123;
		com.blah.bus.Testtest user = &#40;com.blah.bus.Testtest&#41;obj;
		validatePriceAndItemCount&#40;user, errors&#41;;
	&#125;

	public void validatePriceAndItemCount&#40;com.blah.bus.Testtest user, Errors errors&#41; &#123;

	&#125;
&#125;

Testtest.java
Code:
package com.blah.bus;

import java.io.Serializable;
import java.lang.String;

public class Testtest implements Serializable &#123;

	private String email;
	private String password;
	private String firstName;
	private String lastName;
	private String street;
	private String street2;
	private String city;
	private String province;
	private String postcode;
	private String country;
	private Long phone;
	private String month;
	private String year;
	private String credit;
	private String paytype;
	private String accountholder;

	//private String email
	public void setEmail&#40;String email&#41; &#123;
		this.email = email;
	&#125;

    public String getEmail&#40;&#41; &#123;
        return email;
    &#125;


	//private String password
	public void setPassword&#40;String password&#41; &#123;
		this.password = password;
	&#125;

    public String getPassword&#40;&#41; &#123;
        return password;
    &#125;


	//private String firstName
	public void setFirstName&#40;String firstName&#41; &#123;
		this.firstName = firstName;
	&#125;

    public String getFirstName&#40;&#41; &#123;
        return firstName;
    &#125;


	//private String lastName
	public void setLastName&#40;String lastName&#41; &#123;
		this.lastName = lastName;
	&#125;

    public String getLastName&#40;&#41; &#123;
        return lastName;
    &#125;


	//private String street
	public void setStreet&#40;String street&#41; &#123;
		this.street = street;
	&#125;

    public String getStreet&#40;&#41; &#123;
        return street;
    &#125;


	//private String street2
	public void setStreet2&#40;String street2&#41; &#123;
		this.street2 = street2;
	&#125;

    public String getStreet2&#40;&#41; &#123;
        return street2;
    &#125;


	//private String city
	public void setCity&#40;String city&#41; &#123;
		this.city = city;
	&#125;

    public String getCity&#40;&#41; &#123;
        return city;
    &#125;


	//private String province
	public void setProvince&#40;String province&#41; &#123;
		this.province = province;
	&#125;

    public String getProvince&#40;&#41; &#123;
        return province;
    &#125;


	//private String postcode
	public void setPostcode&#40;String postcode&#41; &#123;
		this.postcode = postcode;
	&#125;

    public String getPostcode&#40;&#41; &#123;
        return postcode;
    &#125;


	//private String country
	public void setCountry&#40;String country&#41; &#123;
		this.country = country;
	&#125;

    public String getCountry&#40;&#41; &#123;
        return country;
    &#125;


	//private String phone
	public void setPhone&#40;Long phone&#41; &#123;
		this.phone = phone;
	&#125;

    public Long getPhone&#40;&#41; &#123;
        return phone;
    &#125;


	//private String month
	public void setMonth&#40;String month&#41; &#123;
		this.month = month;
	&#125;

    public String getMonth&#40;&#41; &#123;
        return month;
    &#125;


	//private String year
	public void setYear&#40;String year&#41; &#123;
		this.year = year;
	&#125;

    public String getYear&#40;&#41; &#123;
        return year;
    &#125;


	//private String credit
	public void setCredit&#40;String credit&#41; &#123;
		this.credit = credit;
	&#125;

    public String getCredit&#40;&#41; &#123;
        return credit;
    &#125;


	//private String paytype
	public void setPaytype&#40;String paytype&#41; &#123;
		this.paytype = paytype;
	&#125;

    public String getPaytype&#40;&#41; &#123;
        return paytype;
    &#125;


	//private String accountholder
	public void setAccountholder&#40;String accountholder&#41; &#123;
		this.accountholder = accountholder;
	&#125;

    public String getAccountholder&#40;&#41; &#123;
        return accountholder;
    &#125;
&#125;

orderLoginForm.jsp
Code:
<%@ include file="/WEB-INF/jsp/include.jsp"
%><META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
<html>
<head><title>blah - Login</title></head>
<body>
<form name="login" action="" method="post">
<input type="hidden" name="_flowExecutionId" value="<c&#58;out value="$&#123;flowExecutionId&#125;"/>"/>
<input type="hidden" name="_eventId" value="submit"/>
<table width="100" border="0">
	<tr>
		<td colspan="2"><h2>Sign In</h2></td>
	</tr>
	<tr>
		<td align="right" nowrap>Enter your e-mail address&#58;</td>
		<td align="left"><input name="email" type="text" maxlength="64" size="30" value="" /></td>
	</tr>
	<tr>
		<td align="right" valign="top"><input type="radio" name="action" value="new-tmp" checked="checked" /></td>
		<td align="left" nowrap><b>I am a new customer.</b><br />&#40;You'll create a password later&#41;</td>
	</tr>
	<tr>
		<td align="right" valign="top"><input type="radio" name="action" value="sign-in"  /></td>
		<td align="left"><b>I am a returning customer,<br />
			and my password is&#58;</b></td>
	</tr>
	<tr>
		<td align="right"></td>
		<td align="left"><input name="password" type="password" maxlength="20" size="30" value="" /></td>
	</tr>
	<tr>
		<td align="right"></td>
		<td align="right"><input type="submit" name="submit" value="Continue" /></td>
	</tr>
</table>
</form>
</body>
</html>
orderPaymentForm.jsp
Code:
<%@ include file="/WEB-INF/jsp/include.jsp"
%><META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
<html>
<head><title>blah - Payment</title></head>
<body>
<form name="login" action="" method="post">
<input type="hidden" name="_flowExecutionId" value="<c&#58;out value="$&#123;flowExecutionId&#125;"/>"/>
<input type="hidden" name="_eventId" value="submit"/>
<input type="hidden" name="email" value="<c&#58;out value="$&#123;query.email&#125;"/>"/>
<input type="hidden" name="password" value="<c&#58;out value="$&#123;query.password&#125;"/>"/>
<spring&#58;bind path="user.*">
	<c&#58;forEach items="$&#123;status.errorMessages&#125;" var="error">
		Error code&#58; <c&#58;out value="$&#123;error&#125;"/><br/>
	</c&#58;forEach>
</spring&#58;bind>
<table width="100" border="0">
	<tr>
		<td colspan="2"><h2>Payment</h2></td>
	</tr>
	<tr>
		<td align="right" nowrap>Choose a payment method</td>
		<td align="left"><select name="paytype" size="1">
				<option value="creditCard" selected>Credit Card</option>
				<option value="checkOrMoneyOrder">Check or Money Order</option>
				<option value="directDeposit">Direct Deposit</option>
			</select></td>
	</tr>
	<tr>
		<td colspan="2"><br /><br /><b>Enter a billing address for this method</b></td>
	</tr>
	<tr>
		<td align="right">First Name&#58; </td>
		<td align="left"><input name="firstName" type="text" maxlength="40" size="40" value="" /></td>
	</tr>
	<tr>
		<td align="right">Last Name&#58; </td>
		<td align="left"><input name="lastName" type="text" maxlength="40" size="40" value="" /></td>
	</tr>
	<tr>
		<td align="right">Address Line1&#58; </td>
		<td align="left"><input name="street" type="text" maxlength="40" size="40" value="" /></td>
	</tr>
	<tr>
		<td align="right">Address Line2&#58; </td>
		<td align="left"><input name="street2" type="text" maxlength="40" size="40" value="" /></td>
	</tr>
	<tr>
		<td align="right">City&#58; </td>
		<td align="left"><input name="city" type="text" maxlength="40" size="25" value="" /></td>
	</tr>
	<tr>
		<td align="right">State/Province/Region&#58; </td>
		<td align="left"><input name="province" type="text" maxlength="40" size="20" value="" /></td>
	</tr>
	<tr>
		<td align="right">ZIP/Postal Code&#58; </td>
		<td align="left"><input name="postcode" type="text" maxlength="40" size="23" value="" /></td>
	</tr>
	<tr>
		<td align="right">Country&#58; </td>
		<td align="left"><input name="country" type="text" maxlength="40" size="30" value="" /></td>
	</tr>
	<tr>
		<td align="right">Phone Number&#58; </td>
		<td align="left"><input name="phone" type="text" maxlength="20" size="20" value="" /></td>
	</tr>
	<tr>
		<td align="right"></td>
		<td align="right"><input type="submit" name="submit" value="Continue" /></td>
	</tr>
</table>
</form>
</body>
</html>
web.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
'http&#58;//java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>

  <servlet>
    <servlet-name>blah</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>blah</servlet-name>
    <url-pattern>/order/</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>blah</servlet-name>
    <url-pattern>*.blah</url-pattern>
  </servlet-mapping>

  <resource-ref>
    <res-ref-name>jdbc/TestDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>

  <welcome-file-list>
    <welcome-file>
      index.jsp
    </welcome-file>
  </welcome-file-list>

  <taglib>
    <taglib-uri>/spring</taglib-uri>
    <taglib-location>/WEB-INF/spring.tld</taglib-location>
  </taglib>

</web-app>
Sorry for so much code, but I'd rather provide more than less.

Thanks for any help!