|
From: Brendan G. <bre...@gm...> - 2006-07-25 21:52:49
|
Oops, I was going to mention that, but assumed that the $(status.expression}
would fix it. In spring using an _propertyName for a checkbox usually sets
the value to false. I just looked at WebDataBinder and it looks like it was
actually being caused by the underscore. Here is the snippet of code from
WebDataBinder that was setting it to null:
protected void checkFieldMarkers(MutablePropertyValues mpvs) {
if (getFieldMarkerPrefix() != null) {
String fieldMarkerPrefix = getFieldMarkerPrefix();
PropertyValue[] pvArray = mpvs.getPropertyValues();
for (int i = 0; i < pvArray.length; i++) {
PropertyValue pv = pvArray[i];
if (pv.getName().startsWith(fieldMarkerPrefix)) {
String field = pv.getName().substring(
fieldMarkerPrefix.length());
if (getBeanWrapper().isWritableProperty(field) &&
!mpvs.contains(field)) {
Class fieldType =
getBeanWrapper().getPropertyType(field);
--> WILL DROP THROUGH TO HERE
mpvs.addPropertyValue(field, getEmptyValue(field,
fieldType));
}
}
}
}
}
/**
* Determine an empty value for the specified field.
* <p>Default implementation returns <code>Boolean.FALSE</code>
* for boolean fields and an empty array of array types.
* Else, <code>null</code> is used as default.
* @param field the name of the field
* @param fieldType the type of the field
* @return the empty value (for most fields: null)
*/
protected Object getEmptyValue(String field, Class fieldType) {
if (fieldType != null && boolean.class.equals(fieldType) ||
Boolean.class.equals(fieldType)) {
// Special handling of boolean property.
return Boolean.FALSE;
}
else if (fieldType != null && fieldType.isArray()) {
// Special handling of array property.
return Array.newInstance(fieldType.getComponentType(), 0);
}
else {
// Default value: try null.
<-- THIS WILL PROBABLY BE CALLED
return null;
}
}
}
here is a quick and dirty test case to prove it:
import junit.framework.TestCase;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.bind.ServletRequestDataBinder;
public class WebDataBinderTests extends TestCase {
private TestBean testBean;
private MockHttpServletRequest request;
private ServletRequestDataBinder binder;
protected void setUp() {
testBean= new TestBean();
request = new MockHttpServletRequest();
binder = new ServletRequestDataBinder(testBean, "command");
}
public void testBindWithUnderscore() {
request.addParameter("_step", "STEP1");
binder.bind(request);
assertNull(testBean.getStep());
}
public void testBindWithoutUnderscore() {
request.addParameter("step", "STEP1");
binder.bind(request);
assertNotNull(testBean.getStep());
}
private class TestBean {
private String step;
/**
* @return the step
*/
public String getStep() {
return step;
}
/**
* @param step the step to set
*/
public void setStep(String step) {
this.step = step;
}
}
}
On 7/25/06, tho...@tr... <tho...@tr...> wrote:
>
> Brendan,
>
> Thanks for your help - I think I figured it out.
>
> If you look at my original example I had
>
> <spring:bind path="command.step">
> <input type="hidden" name="_step" value="STEP1"/>
> </spring:bind>
>
> The name="_step" did not match the property name so it did not get bound
> even though the path explicitly names the property. It seemed to me that
> the path should rule here, but maybe that's not how it's supposed to work.
>
> Once I changed it to
>
> <spring:bind path="command.step">
> <input type="hidden" name="step" value="STEP1"/>
> </spring:bind>
>
> it works fine and so does
>
> <input type="hidden" name="step" value="STEP1" />
>
> They both get bound properly.
>
> Thanks,
> Thomas
>
>
> > Thomas,
> >
> > Can you please try this and let us know what the result is:
> >
> > <input type="hidden" name="step" value="STEP1" />
> >
> > We do this sort of thing all over the place and it works fine. I'm
> > assuming
> > here that step is a property on your command object of course.
> >
> > Also, you did import the spring tags right? (Just asking as that's the
> > sort
> > of thing I forget to do all the time ;-)
> >
> > Thanks
> > Brendan
> >
> > On 7/25/06, Matt Sgarlata <mat...@sp...> wrote:
> >>
> >> I think you can also do
> >>
> >> <input type="hidden" name="command.step" value="<c:out
> >> value='${command.step}'/>"/>
> >>
> >> tho...@tr... wrote:
> >> > Brendan,
> >> >
> >> > That's what I thought too, but the command.step property ends up
> being
> >> > null when accessed from the validation code.
> >> >
> >> > Thomas
> >> >
> >> >> Hi Thomas,
> >> >>
> >> >> I don't see why:
> >> >>
> >> >> <spring:bind path="command.step">
> >> >> <input type="hidden" name="${status.expression}" value="STEP1"/>
> >> >> </spring:bind>
> >> >>
> >> >> wouldn't work or am I misunderstanding your question?
> >> >>
> >> >> Brendan
> >> >>
> >> >> On 7/25/06, tho...@tr... <tho...@tr...>
> >> wrote:
> >> >>> Is there a convenient way to assign a fixed value from a hidden
> form
> >> >>> element and have it bound to the command object? I'm using the new
> >> >>> <form>
> >> >>> tags.
> >> >>>
> >> >>> the <form:hidden> tag does not have a value attribute.
> >> >>>
> >> >>> Tried to mix in a <spring:bind> tag but this resulted in the
> >> preperty
> >> >>> being set to null on the command object even though it originally
> >> had
> >> a
> >> >>> value pre-assigned when the command object was created.
> >> >>>
> >> >>> Can we mix and match <form:> and <spring:bind> tags?
> >> >>>
> >> >>> Here is a simplified version of what I'm using:
> >> >>>
> >> >>> <h4>New Login Account</h4>
> >> >>>
> >> >>> <form:form commandName="command" action="new_user.htm">
> >> >>> <table>
> >> >>> <tr>
> >> >>> <td class="prompt">Login ID:</td><td class="value">
> >> >>> <form:input path="user.userName"/>
> >> >>> </td>
> >> >>> </tr>
> >> >>> <tr class="even">
> >> >>> <td class="prompt">Password:</td><td class="value">
> >> >>> <form:password path="user.password"/>
> >> >>> </td>
> >> >>> <td>Retype Password:</td><td class="value">
> >> >>> <form:password path="user.retypePassword"/>
> >> >>> </td>
> >> >>> </tr>
> >> >>> </table>
> >> >>>
> >> >>> <table>
> >> >>> <tr>
> >> >>> <td class="submit"><input name="_eventId_submit"
> >> type="submit"
> >> >>> value="NEXT"/></td>
> >> >>> </tr>
> >> >>> </table>
> >> >>>
> >> >>> <spring:bind path="command.step">
> >> >>> <input type="hidden" name="_step" value="STEP1"/>
> >> >>> </spring:bind>
> >> >>> <input type="hidden" name="_flowExecutionKey"
> >> >>> value="${flowExecutionKey}"/>
> >> >>>
> >> >>> </form:form>
> >> >>>
> >> >>> The "command.step" is the property that I want to be able to set to
> >> a
> >> >>> fixed value from the form, like STEP1 in the example.
> >> >>>
> >> >>> Thomas
> >> >>>
> >> >>>
> >> >>>
> >>
> -------------------------------------------------------------------------
> >> >>> Take Surveys. Earn Cash. Influence the Future of IT
> >> >>> Join SourceForge.net's Techsay panel and you'll get the chance to
> >> share
> >> >>> your
> >> >>> opinions on IT & business topics through brief surveys -- and earn
> >> cash
> >> >>>
> >>
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> >> >>> _______________________________________________
> >> >>> Springframework-developer mailing list
> >> >>> Spr...@li...
> >> >>>
> https://lists.sourceforge.net/lists/listinfo/springframework-developer
> >> >>>
> >> >>
> >>
> -------------------------------------------------------------------------
> >> >> Take Surveys. Earn Cash. Influence the Future of IT
> >> >> Join SourceForge.net's Techsay panel and you'll get the chance to
> >> share
> >> >> your
> >> >> opinions on IT & business topics through brief surveys -- and earn
> >> cash
> >> >>
> >>
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV_______________________________________________
> >> >> Springframework-developer mailing list
> >> >> Spr...@li...
> >> >>
> https://lists.sourceforge.net/lists/listinfo/springframework-developer
> >> >>
> >> >
> >> >
> >> >
> >>
> -------------------------------------------------------------------------
> >> > Take Surveys. Earn Cash. Influence the Future of IT
> >> > Join SourceForge.net's Techsay panel and you'll get the chance to
> >> share
> >> your
> >> > opinions on IT & business topics through brief surveys -- and earn
> >> cash
> >> >
> >>
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> >>
> >>
> >>
> -------------------------------------------------------------------------
> >> Take Surveys. Earn Cash. Influence the Future of IT
> >> Join SourceForge.net's Techsay panel and you'll get the chance to share
> >> your
> >> opinions on IT & business topics through brief surveys -- and earn cash
> >>
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> >> _______________________________________________
> >> Springframework-developer mailing list
> >> Spr...@li...
> >> https://lists.sourceforge.net/lists/listinfo/springframework-developer
> >>
> >
> -------------------------------------------------------------------------
> > Take Surveys. Earn Cash. Influence the Future of IT
> > Join SourceForge.net's Techsay panel and you'll get the chance to share
> > your
> > opinions on IT & business topics through brief surveys -- and earn cash
> >
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV_______________________________________________
> > Springframework-developer mailing list
> > Spr...@li...
> > https://lists.sourceforge.net/lists/listinfo/springframework-developer
> >
>
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share
> your
> opinions on IT & business topics through brief surveys -- and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Springframework-developer mailing list
> Spr...@li...
> https://lists.sourceforge.net/lists/listinfo/springframework-developer
>
|