brainbaking/content/wiki/code/jsp/webflow.md

4.9 KiB

+++ title = "webflow" draft = false tags = [ "code", "jsp", "webflow" ] date = "2013-03-12" +++

Spring Webflow

Pitfalls rond flow xml declaraties

Gelieve in het geval van "problemen" de volgende checklist te raadplegen:

  1. bind = false
  2. setupForm gedaan? Anders worden PropertyEditors niet correct gebruikt
  3. resetForm leegmaken gui model
  4. scope opgeven in model attribute
  5. in action: setFormObjectName/setFormObjectScope en indien resetForm ook setFormObjectClass
  6. Ajax requets: vac_ajax_request op true zetten -> anders geen fragments
  7. Ajax: extend van AbstractWebflowAjaxAction Te combineren met setFormObjectName stap
  8. nestedPartialPage tag -> commandName ofwel hardcoded ofwel als var vanuit tiles meegegeven

AbstractWebflowAjaxAction


package be.oei.webmvc;

import org.springframework.validation.BindingResult;
import org.springframework.validation.DataBinder;
import org.springframework.validation.Errors;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.webflow.action.FormAction;
import org.springframework.webflow.action.FormObjectAccessor;
import org.springframework.webflow.core.collection.MutableAttributeMap;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;
import org.springframework.webflow.execution.ScopeType;
import org.springframework.webflow.execution.View;

public abstract class AbstractWebFlowAjaxAction extends FormAction {

	protected static final String COMMAND_NAME = "commandName";
	protected static final String ERRORS_PREFIX = BindingResult.MODEL_KEY_PREFIX;

	@Override
	protected final Object getFormObject(RequestContext context) throws Exception {
		String formObjectName = getFormObjectName();
		ScopeType formObjectScope = getFormObjectScope();
		Object result = null;
		if (formObjectName != null) {
			result = formObjectScope.getScope(context).get(formObjectName);
		}
		if (result ###### null) {
			result = ((MutableAttributeMap) context.getFlowScope().get("viewScope")).get("currentFormObject");
		}
		if (result ###### null) {
			result = context.getFlowScope().get("currentFormObject");
		}
		if (result ###### null) {
			result = super.getFormObject(context);
		}
		return result;
	}

	protected final String commandNameFromRequest(RequestContext context) {
		return context.getRequestParameters().get(COMMAND_NAME);
	}

	@Override
	public Event bindAndValidate(RequestContext context) throws Exception {
		Event result = super.bindAndValidate(context);
		initFragmentToRender(context);
		return result;
	}

	@Override
	public Event bind(RequestContext context) throws Exception {
		Event result = super.bind(context);
		this.initFragmentToRender(context);
		return result;
	}

	@Override
	protected DataBinder createBinder(RequestContext context, Object formObject) throws Exception {
		DataBinder binder = new WebDataBinder(formObject, commandNameFromRequest(context));
		if (getMessageCodesResolver() != null) {
			binder.setMessageCodesResolver(getMessageCodesResolver());
		}
		initBinder(context, binder);
		registerPropertyEditors(context, binder);
		return binder;
	}

	@Override
	protected FormObjectAccessor getFormObjectAccessor(final RequestContext context) {
		final String commandNameFromRequest = commandNameFromRequest(context);
		return new FormObjectAccessor(context) {
			@Override
			public Errors getFormErrors(String formObjectName, ScopeType scopeType) {
				return super.getFormErrors(commandNameFromRequest, scopeType);
			}

			@Override
			public Object getFormObject(String formObjectName, @SuppressWarnings("rawtypes") Class formObjectClass, ScopeType scopeType) {
				return super.getFormObject(commandNameFromRequest, formObjectClass, scopeType);
			}

			@Override
			public Object getFormObject(String formObjectName, ScopeType scopeType) {
				return super.getFormObject(commandNameFromRequest, scopeType);
			}

			@Override
			public Object getCurrentFormObject(ScopeType scopeType) {
				return super.getFormObject(getCurrentFormObjectName(), scopeType);
			}

			@Override
			public Errors getCurrentFormErrors(ScopeType scopeType) {
				return super.getFormErrors(getCurrentFormObjectName(), scopeType);
			}

			@Override
			public void putFormObject(Object formObject, String formObjectName, ScopeType scopeType) {
				super.putFormObject(formObject, commandNameFromRequest, scopeType);
			}

			@Override
			public void putFormErrors(Errors errors, ScopeType scopeType) {
				scopeType.getScope(context).put(ERRORS_PREFIX + commandNameFromRequest, errors);
				setCurrentFormErrors(errors, scopeType);
			}

		};
	}

	protected void initFragmentToRender(RequestContext context) {
		context.getFlashScope().put(View.RENDER_FRAGMENTS_ATTRIBUTE, new String[] { fragmentToRender() });
		context.getFlashScope().put(COMMAND_NAME, commandNameFromRequest(context));
	}

	protected abstract String fragmentToRender();

}