提交 f0ca94d5 编写于 作者: K Keith Donald

new presentation model methods; ability to surpress commit of dirty value in PMB

上级 0f434883
......@@ -15,7 +15,6 @@
*/
package org.springframework.model.ui;
/**
* Represents the state and behavior of a presentation independently of the GUI controls used in the interface.
* Pulls the state and behavior of a view out into a model class that is part of the presentation.
......@@ -31,5 +30,23 @@ public interface PresentationModel {
* @throws FieldNotFoundException if no such field exists
*/
FieldModel getFieldModel(String fieldName);
/**
* If errors are present on this PresentationModel.
* Returns true if at least one FieldModel has {@link BindingStatus#INVALID_SUBMITTED_VALUE invalid submitted values} or is {@link ValidationStatus#INVALID invalid}.
*/
boolean hasErrors();
/**
* Commit any {@link BindingStatus#DIRTY dirty} fields.
* @throws IllegalStateException if there are field models that have {@link BindingStatus#INVALID_SUBMITTED_VALUE invalid submitted values} or are {@link ValidationStatus#INVALID invalid}.
*/
void commit();
/**
* Validate all fields.
* Skips any fields with {@link BindingStatus#INVALID_SUBMITTED_VALUE invalid submitted values}.
*/
void validate();
}
\ No newline at end of file
......@@ -143,6 +143,20 @@ public class DefaultPresentationModel implements PresentationModel {
return field;
}
public boolean hasErrors() {
return false;
}
public void commit() {
}
public void validate() {
}
// internal helpers
private PropertyFieldModelRule getRule(String fieldName) {
PropertyFieldModelRule rule = fieldModelRules.get(fieldName);
if (rule == null) {
......
......@@ -35,28 +35,36 @@ import org.springframework.model.ui.PresentationModel;
* @since 3.0
* @see #setMessageSource(MessageSource)
* @see #setRequiredFields(String[])
* @see #setCommitDirtyValue(boolean)
* @see #bind(Map, PresentationModel)
*/
public class PresentationModelBinder extends AbstractBinder<PresentationModel> {
// subclassing hooks
private boolean commitDirtyValue;
/**
* Configures if this PresentationModelBinder should eagerly commit the dirty value after a successful field binding.
* Default is false.
*/
public void setCommitDirtyValue(boolean commitDirtyValue) {
this.commitDirtyValue = commitDirtyValue;
}
// subclass hooks
@Override
protected FieldBinder createFieldBinder(PresentationModel model) {
return new FieldModelBinder(model, getMessageSource());
return new FieldModelBinder(model);
}
// internal helpers
private static class FieldModelBinder implements FieldBinder {
private class FieldModelBinder implements FieldBinder {
private PresentationModel presentationModel;
private MessageSource messageSource;
public FieldModelBinder(PresentationModel presentationModel, MessageSource messageSource) {
public FieldModelBinder(PresentationModel presentationModel) {
this.presentationModel = presentationModel;
this.messageSource = messageSource;
}
public BindingResult bind(String fieldName, Object value) {
......@@ -64,13 +72,13 @@ public class PresentationModelBinder extends AbstractBinder<PresentationModel> {
try {
field = presentationModel.getFieldModel(fieldName);
} catch (FieldNotFoundException e) {
return new FieldNotFoundResult(fieldName, value, messageSource);
return new FieldNotFoundResult(fieldName, value, getMessageSource());
}
if (!field.isEditable()) {
return new FieldNotEditableResult(fieldName, value, messageSource);
return new FieldNotEditableResult(fieldName, value, getMessageSource());
} else {
field.applySubmittedValue(value);
if (field.getBindingStatus() == BindingStatus.DIRTY) {
if (field.getBindingStatus() == BindingStatus.DIRTY && commitDirtyValue) {
field.commit();
}
return new AlertBindingResult(fieldName, value, field.getStatusAlert());
......
......@@ -48,6 +48,7 @@ public class PresentationModelBinderTests {
bean = new TestBean();
presentationModel = new DefaultPresentationModel(bean);
binder = new PresentationModelBinder();
binder.setCommitDirtyValue(true);
LocaleContextHolder.setLocale(Locale.US);
}
......
......@@ -34,7 +34,8 @@ public class WebBinderTests {
public void setUp() {
LocaleContextHolder.setLocale(Locale.US);
presentationModel = new DefaultPresentationModel(bean);
binder = new WebBinder();
binder = new WebBinder();
binder.setCommitDirtyValue(true);
}
@After
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册