You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2017/04/04 15:38:08 UTC

[1/8] wicket git commit: WICKET-6348 call all FormComponentUpdatingBehavior on select

Repository: wicket
Updated Branches:
  refs/heads/master e7dcf2f68 -> 137fa9e40


WICKET-6348 call all FormComponentUpdatingBehavior on select


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/137fa9e4
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/137fa9e4
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/137fa9e4

Branch: refs/heads/master
Commit: 137fa9e40237e12c2a9566f7701356796d43aaa9
Parents: 75547ab
Author: Sven Meier <sv...@apache.org>
Authored: Tue Apr 4 17:24:19 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/wicket/util/tester/FormTester.java | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/137fa9e4/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
index 93b735c..031aac4 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
@@ -506,9 +506,8 @@ public class FormTester
 		ChoiceSelector choiceSelector = choiceSelectorFactory.create(component);
 		choiceSelector.doSelect(index);
 
-		List<FormComponentUpdatingBehavior> behaviors = component.getBehaviors(FormComponentUpdatingBehavior.class);
-		if (behaviors.isEmpty() == false) {
-			tester.invokeListener(component, behaviors.get(0));
+		for (FormComponentUpdatingBehavior updater : component.getBehaviors(FormComponentUpdatingBehavior.class)) {
+			tester.invokeListener(component, updater);
 		}
 
 		return this;


[6/8] wicket git commit: WICKET-6348 renamed to FormComponentUpdatingBehavior

Posted by sv...@apache.org.
WICKET-6348 renamed to FormComponentUpdatingBehavior

keep deprecated getJsForInterfaceUrl()

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/9bc7ee47
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/9bc7ee47
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/9bc7ee47

Branch: refs/heads/master
Commit: 9bc7ee4742715d83cf4d384151cbbb4bd7e2e2d2
Parents: 8f8ad37
Author: Sven Meier <sv...@apache.org>
Authored: Thu Mar 30 09:44:21 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../apache/wicket/markup/html/form/Form.java    |   7 +
 .../form/FormComponentUpdatingBehavior.java     | 218 +++++++++++++++++++
 .../html/form/SelectionChangeBehavior.java      | 218 -------------------
 .../apache/wicket/util/tester/FormTester.java   |   4 +-
 .../org/apache/wicket/MockPageWithForm.java     |   6 +-
 .../wicket/util/tester/FormTesterTest.java      |   6 +-
 .../extensions/yui/calendar/DatesPage1.java     |   4 +-
 .../apache/wicket/examples/dates/DatesPage.java |   4 +-
 .../wicket/examples/forminput/FormInput.java    |   6 +-
 .../wicket/examples/tree/AdvancedTreePage.java  |   6 +-
 10 files changed, 243 insertions(+), 236 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
index 6edd242..13aadf8 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
@@ -509,6 +509,13 @@ public class Form<T> extends WebMarkupContainer
 	}
 
 	/**
+	 * @deprecated use {@link #getJsForListenerUrl(CharSequence)} instead.
+	 */
+	public final CharSequence getJsForInterfaceUrl(CharSequence url) {
+		return getJsForListenerUrl(url);
+	}
+
+	/**
 	 * Generate a piece of JavaScript that submits the form to the given URL.
 	 * 
 	 * Warning: This code should only be called in the rendering phase for form components inside

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
new file mode 100644
index 0000000..e57828b
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.IRequestListener;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A behavior to get notifications when a {@link FormComponent} changes its value.
+ * <p>
+ * Contrary to {@link AjaxFormComponentUpdatingBehavior} all notification are send via
+ * standard HTTP requests and the full page is rendered as a response.
+ * 
+ * @see FormComponentUpdatingBehavior#onUpdate()
+ */
+public class FormComponentUpdatingBehavior extends Behavior implements IRequestListener
+{
+
+	private FormComponent<?> formComponent;
+
+	@Override
+	public boolean getStatelessHint(Component component)
+	{
+		return false;
+	}
+
+	@Override
+	public final void bind(final Component hostComponent)
+	{
+		Args.notNull(hostComponent, "hostComponent");
+
+		if (formComponent != null)
+		{
+			throw new IllegalStateException("this kind of handler cannot be attached to " +
+				"multiple components; it is already attached to component " + formComponent +
+				", but component " + hostComponent + " wants to be attached too");
+		}
+
+		this.formComponent = (FormComponent<?>)hostComponent;
+
+		formComponent.setRenderBodyOnly(false);
+
+		// call the callback
+		onBind();
+	}
+
+	protected void onBind()
+	{
+	}
+
+	public FormComponent<?> getFormComponent()
+	{
+		return formComponent;
+	}
+
+	@Override
+	public void onComponentTag(Component component, ComponentTag tag)
+	{
+		CharSequence url = component.urlForListener(this, new PageParameters());
+
+		String event = getJSEvent();
+
+		String condition = String.format("if (event.target.name !== '%s') return; ",
+			formComponent.getInputName());
+
+		Form<?> form = component.findParent(Form.class);
+		if (form != null)
+		{
+			tag.put(event, condition + form.getJsForListenerUrl(url.toString()));
+		}
+		else
+		{
+			char separator = url.toString().indexOf('?') > -1 ? '&' : '?';
+
+			tag.put(event, condition + String.format("window.location.href='%s%s%s=' + %s;", url,
+				separator, formComponent.getInputName(), getJSValue()));
+		}
+	}
+
+	/**
+	 * Which JavaScript event triggers notification. 
+	 */
+	private String getJSEvent()
+	{
+		if (formComponent instanceof DropDownChoice || formComponent instanceof AbstractTextComponent)
+		{
+			return "onchange";
+		}
+		else
+		{
+			return "onclick";
+		}
+	}
+
+	/**
+	 * How to get the current value via JavaScript. 
+	 */
+	private String getJSValue()
+	{
+		if (formComponent instanceof DropDownChoice)
+		{
+			return "this.options[this.selectedIndex].value";
+		}
+		else if (formComponent instanceof CheckBox)
+		{
+			return "this.checked";
+		}
+		else
+		{
+			return "event.target.value";
+		}
+	}
+
+	/**
+	 * Process the form component.
+	 */
+	private void process()
+	{
+		formComponent.validate();
+		if (formComponent.isValid())
+		{
+			if (getUpdateModel())
+			{
+				formComponent.valid();
+				formComponent.updateModel();
+			}
+
+			onUpdate();
+		}
+		else
+		{
+			formComponent.invalid();
+		}
+		
+		onUpdate();
+	}
+
+	/**
+	 * Gives the control to the application to decide whether the form component model should
+	 * be updated automatically or not. Make sure to call {@link org.apache.wicket.markup.html.form.FormComponent#valid()}
+	 * additionally in case the application want to update the model manually.
+	 *
+	 * @return true if the model of form component should be updated, false otherwise
+	 */
+	protected boolean getUpdateModel()
+	{
+		return true;
+	}
+
+	/**
+	 * Hook method invoked when the component is updated.
+	 */
+	protected void onUpdate()
+	{
+	}
+
+	@Override
+	public final void onRequest()
+	{
+		Form<?> form = formComponent.findParent(Form.class);
+		if (form == null)
+		{
+			process();
+		}
+		else
+		{
+			form.getRootForm().onFormSubmitted(new IFormSubmitter()
+			{
+				@Override
+				public void onSubmit()
+				{
+					process();
+				}
+
+				@Override
+				public void onError()
+				{
+				}
+
+				@Override
+				public void onAfterSubmit()
+				{
+				}
+
+				@Override
+				public Form<?> getForm()
+				{
+					return formComponent.getForm();
+				}
+
+				@Override
+				public boolean getDefaultFormProcessing()
+				{
+					return false;
+				}
+			});
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
deleted file mode 100644
index 8298c06..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.markup.html.form;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.util.lang.Args;
-
-/**
- * A behavior to get change notifications when a choice component changes its selection.
- * <p>
- * Contrary to {@link AjaxFormChoiceComponentUpdatingBehavior} all notification are send via
- * standard HTTP requests and the full page is rendered as the response.
- * 
- * @see SelectionChangeBehavior#onSelectionChanged()
- */
-public class SelectionChangeBehavior extends Behavior implements IRequestListener
-{
-
-	private FormComponent<?> formComponent;
-
-	@Override
-	public boolean getStatelessHint(Component component)
-	{
-		return false;
-	}
-
-	@Override
-	public final void bind(final Component hostComponent)
-	{
-		Args.notNull(hostComponent, "hostComponent");
-
-		if (formComponent != null)
-		{
-			throw new IllegalStateException("this kind of handler cannot be attached to " +
-				"multiple components; it is already attached to component " + formComponent +
-				", but component " + hostComponent + " wants to be attached too");
-		}
-
-		this.formComponent = (FormComponent<?>)hostComponent;
-
-		formComponent.setRenderBodyOnly(false);
-
-		// call the callback
-		onBind();
-	}
-
-	protected void onBind()
-	{
-	}
-
-	public FormComponent<?> getFormComponent()
-	{
-		return formComponent;
-	}
-
-	@Override
-	public void onComponentTag(Component component, ComponentTag tag)
-	{
-		CharSequence url = component.urlForListener(this, new PageParameters());
-
-		String event = getJSEvent();
-
-		String condition = String.format("if (event.target.name !== '%s') return; ",
-			formComponent.getInputName());
-
-		Form<?> form = component.findParent(Form.class);
-		if (form != null)
-		{
-			tag.put(event, condition + form.getJsForListenerUrl(url.toString()));
-		}
-		else
-		{
-			char separator = url.toString().indexOf('?') > -1 ? '&' : '?';
-
-			tag.put(event, condition + String.format("window.location.href='%s%s%s=' + %s;", url,
-				separator, formComponent.getInputName(), getJSValue()));
-		}
-	}
-
-	/**
-	 * Which JavaScript event triggers notification. 
-	 */
-	private String getJSEvent()
-	{
-		if (formComponent instanceof DropDownChoice)
-		{
-			return "onchange";
-		}
-		else
-		{
-			return "onclick";
-		}
-	}
-
-	/**
-	 * How to get the current value via JavaScript. 
-	 */
-	private String getJSValue()
-	{
-		if (formComponent instanceof DropDownChoice)
-		{
-			return "this.options[this.selectedIndex].value";
-		}
-		else if (formComponent instanceof CheckBox)
-		{
-			return "this.checked";
-		}
-		else
-		{
-			return "event.target.value";
-		}
-	}
-
-	/**
-	 * Process the form component.
-	 */
-	private void process()
-	{
-		formComponent.validate();
-		if (formComponent.isValid())
-		{
-			if (getUpdateModel())
-			{
-				formComponent.valid();
-				formComponent.updateModel();
-			}
-
-			onSelectionChanged();
-		}
-		else
-		{
-			formComponent.invalid();
-		}
-		
-		onSelectionChanged();
-	}
-
-	/**
-	 * Gives the control to the application to decide whether the form component model should
-	 * be updated automatically or not. Make sure to call {@link org.apache.wicket.markup.html.form.FormComponent#valid()}
-	 * additionally in case the application want to update the model manually.
-	 *
-	 * @return true if the model of form component should be updated, false otherwise
-	 */
-	protected boolean getUpdateModel()
-	{
-		return true;
-	}
-
-	/**
-	 * Hook method invoked when selection has changed.
-	 */
-	protected void onSelectionChanged()
-	{
-	}
-
-	@Override
-	public final void onRequest()
-	{
-		Form<?> form = formComponent.findParent(Form.class);
-		if (form == null)
-		{
-			process();
-		}
-		else
-		{
-			form.getRootForm().onFormSubmitted(new IFormSubmitter()
-			{
-				@Override
-				public void onSubmit()
-				{
-					process();
-				}
-
-				@Override
-				public void onError()
-				{
-				}
-
-				@Override
-				public void onAfterSubmit()
-				{
-				}
-
-				@Override
-				public Form<?> getForm()
-				{
-					return formComponent.getForm();
-				}
-
-				@Override
-				public boolean getDefaultFormProcessing()
-				{
-					return false;
-				}
-			});
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
index 31448d9..93b735c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
@@ -38,7 +38,7 @@ import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
 import org.apache.wicket.markup.html.form.ListMultipleChoice;
 import org.apache.wicket.markup.html.form.Radio;
 import org.apache.wicket.markup.html.form.RadioGroup;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
+import org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior;
 import org.apache.wicket.markup.html.form.upload.FileUploadField;
 import org.apache.wicket.markup.html.form.upload.MultiFileUploadField;
 import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
@@ -506,7 +506,7 @@ public class FormTester
 		ChoiceSelector choiceSelector = choiceSelectorFactory.create(component);
 		choiceSelector.doSelect(index);
 
-		List<SelectionChangeBehavior> behaviors = component.getBehaviors(SelectionChangeBehavior.class);
+		List<FormComponentUpdatingBehavior> behaviors = component.getBehaviors(FormComponentUpdatingBehavior.class);
 		if (behaviors.isEmpty() == false) {
 			tester.invokeListener(component, behaviors.get(0));
 		}

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java b/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
index 4b8e706..76c2e58 100644
--- a/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
+++ b/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
@@ -22,7 +22,7 @@ import java.util.List;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
+import org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior;
 import org.apache.wicket.model.Model;
 
 
@@ -62,9 +62,9 @@ public class MockPageWithForm extends WebPage
 		list.add("Select me");
 		MyForm form = new MyForm("form");
 		DropDownChoice<String> dropDown = new DropDownChoice<String>("dropdown", new Model<String>(), list);
-		dropDown.add(new SelectionChangeBehavior() {
+		dropDown.add(new FormComponentUpdatingBehavior() {
 			@Override
-			protected void onSelectionChanged()
+			protected void onUpdate()
 			{
 				selected = true;
 			}

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
index 945e46e..fe152ef 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
@@ -28,7 +28,7 @@ import org.apache.wicket.markup.IMarkupResourceStreamProvider;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
+import org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior;
 import org.apache.wicket.markup.html.form.upload.FileUpload;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -265,9 +265,9 @@ public class FormTesterTest extends WicketTestCase
 				Form<Object> form = new Form<>("form");
 				add(form);
 				List<String> choices = Arrays.asList("opt 1", "opt 2");
-				form.add(new DropDownChoice<String>("selector", Model.of(""), choices).add(new SelectionChangeBehavior() {
+				form.add(new DropDownChoice<String>("selector", Model.of(""), choices).add(new FormComponentUpdatingBehavior() {
 					@Override
-					protected void onSelectionChanged()
+					protected void onUpdate()
 					{
 						selection = (String)getFormComponent().getDefaultModelObject();
 					}

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
index 43f4067..a632e97 100644
--- a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
+++ b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
@@ -31,7 +31,7 @@ import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
+import org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
@@ -111,7 +111,7 @@ public class DatesPage1 extends WebPage
 			setChoiceRenderer(new LocaleChoiceRenderer());
 			setDefaultModel(new PropertyModel<>(DatesPage1.this, "selectedLocale"));
 			
-			add(new SelectionChangeBehavior());
+			add(new FormComponentUpdatingBehavior());
 		}
 
 		@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
index eaaaed2..dadad43 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
@@ -34,7 +34,7 @@ import org.apache.wicket.extensions.yui.calendar.TimeField;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
+import org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
@@ -102,7 +102,7 @@ public class DatesPage extends WicketExamplePage
 			setChoiceRenderer(new LocaleChoiceRenderer());
 			setDefaultModel(new PropertyModel<>(DatesPage.this, "selectedLocale"));
 			
-			add(new SelectionChangeBehavior());
+			add(new FormComponentUpdatingBehavior());
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java b/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
index ecc3414..0ff4681 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
@@ -35,7 +35,7 @@ import org.apache.wicket.markup.html.form.ListMultipleChoice;
 import org.apache.wicket.markup.html.form.Radio;
 import org.apache.wicket.markup.html.form.RadioChoice;
 import org.apache.wicket.markup.html.form.RadioGroup;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
+import org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior;
 import org.apache.wicket.markup.html.form.SimpleFormComponentLabel;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.link.Link;
@@ -250,9 +250,9 @@ public class FormInput extends WicketExamplePage
 			// updating the current locale to property 'locale' of FormInput
 			setModel(new PropertyModel<>(FormInput.this, "locale"));
 			
-			add(new SelectionChangeBehavior() {
+			add(new FormComponentUpdatingBehavior() {
 				@Override
-				protected void onSelectionChanged()
+				protected void onUpdate()
 				{
 					// note that we don't have to do anything here, as our property
 					// model already calls FormInput.setLocale when the model is

http://git-wip-us.apache.org/repos/asf/wicket/blob/9bc7ee47/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
index 4522885..d5c4abc 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
@@ -43,7 +43,7 @@ import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
+import org.apache.wicket.markup.html.form.FormComponentUpdatingBehavior;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.PropertyModel;
@@ -98,10 +98,10 @@ public abstract class AdvancedTreePage extends AbstractTreePage
 		form.add(tree);
 
 		form.add(new DropDownChoice<Content>("content", new PropertyModel<>(this, "content"),
-			initContents(), new ChoiceRenderer<>("class.simpleName")).add(new SelectionChangeBehavior()));
+			initContents(), new ChoiceRenderer<>("class.simpleName")).add(new FormComponentUpdatingBehavior()));
 
 		form.add(new DropDownChoice<Behavior>("theme", new PropertyModel<>(this, "theme"),
-			initThemes(), new ChoiceRenderer<>("class.simpleName")).add(new SelectionChangeBehavior()));
+			initThemes(), new ChoiceRenderer<>("class.simpleName")).add(new FormComponentUpdatingBehavior()));
 
 		form.add(new Link<Void>("expandAll")
 		{


[5/8] wicket git commit: WICKET-6348 use submitter instead of hidden field

Posted by sv...@apache.org.
WICKET-6348 use submitter instead of hidden field


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/25567ba1
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/25567ba1
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/25567ba1

Branch: refs/heads/master
Commit: 25567ba12214e2d32b27fec4789833a5d89cc59a
Parents: e7dcf2f
Author: Sven Meier <sv...@apache.org>
Authored: Tue Mar 28 21:34:56 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../apache/wicket/markup/html/form/Check.java   |   2 +-
 .../wicket/markup/html/form/CheckBox.java       |  67 ++++++--
 .../wicket/markup/html/form/CheckGroup.java     |  66 ++++++--
 .../wicket/markup/html/form/DropDownChoice.java |  69 ++++++--
 .../apache/wicket/markup/html/form/Form.java    | 164 +++++--------------
 .../apache/wicket/markup/html/form/Radio.java   |   2 +-
 .../wicket/markup/html/form/RadioChoice.java    |  67 ++++++--
 .../wicket/markup/html/form/RadioGroup.java     |  63 ++++++-
 .../wicket/markup/html/form/StatelessForm.java  |   1 -
 .../wicket/markup/html/form/SubmitLink.java     |  40 ++---
 .../form/AjaxFormSubmitTestPage_expected.html   |   2 +-
 .../OnChangeAjaxBehaviorTestPage_expected.html  |   2 +-
 .../CheckGroupDisabledTestPage_expected.html    |   2 +-
 .../html/form/CheckGroupTestPage1_expected.html |   2 +-
 .../html/form/CheckGroupTestPage2_expected.html |   2 +-
 .../html/form/CheckGroupTestPage3_expected.html |   2 +-
 .../html/form/CheckGroupTestPage4_expected.html |   2 +-
 ...DropDownChoiceTestPage_A_false_expected.html |   2 +-
 .../DropDownChoiceTestPage_A_true_expected.html |   2 +-
 ...pDownChoiceTestPage_null_false_expected.html |   2 +-
 ...opDownChoiceTestPage_null_true_expected.html |   2 +-
 .../html/form/FormMethodTestPage_expected.html  |   4 +-
 .../RadioGroupDisabledTestPage_expected.html    |   2 +-
 .../html/form/RadioGroupTestPage1_expected.html |   2 +-
 .../html/form/RadioGroupTestPage3_expected.html |   2 +-
 .../form/feedback/FeedbackFormPage_result1.html |   2 +-
 .../form/feedback/FeedbackFormPage_result2.html |   2 +-
 .../FeedbackIndicatorFormPage_result1.html      |   2 +-
 .../FeedbackIndicatorFormPage_result2.html      |   2 +-
 .../html/form/pageWithParameters_expected.html  |   4 +-
 .../validation/HomePage1_ExpectedResult.html    |   2 +-
 .../EnclosurePageExpectedResult_9-1-1.html      |   2 +-
 .../EnclosurePageExpectedResult_9-1.html        |   2 +-
 .../EnclosurePageExpectedResult_9-2-1.html      |   2 +-
 .../EnclosurePageExpectedResult_9-2.html        |   2 +-
 .../EnclosurePageExpectedResult_9-3-1.html      |   2 +-
 .../EnclosurePageExpectedResult_9-3-2.html      |   2 +-
 .../EnclosurePageExpectedResult_9-3.html        |   2 +-
 .../EnclosurePageExpectedResult_9-4.html        |   2 +-
 .../internal/EnclosurePageExpectedResult_9.html |   2 +-
 .../tags/InputTagNotVisibleWebPageResult.html   |   2 +-
 .../html/tags/InputTagVisibleWebPageResult.html |   2 +-
 .../StatelessPageWithForm_expected.html         |   2 +-
 .../yui/calendar/DatesPage1_ExpectedResult.html |   6 +-
 44 files changed, 358 insertions(+), 259 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
index ed50c80..83fa278 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
@@ -203,7 +203,7 @@ public class Check<T> extends LabeledWebMarkupContainer implements IGenericCompo
 			Form<?> form = group.findParent(Form.class);
 			if (form != null)
 			{
-				tag.put("onclick", form.getJsForInterfaceUrl(url));
+				tag.put("onclick", form.getJsForListenerUrl(url));
 			}
 			else
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
index 9e25c4b..da8f049 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
@@ -19,6 +19,7 @@ package org.apache.wicket.markup.html.form;
 import java.util.Locale;
 
 import org.apache.wicket.IRequestListener;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -81,35 +82,71 @@ public class CheckBox extends FormComponent<Boolean> implements IRequestListener
 	@Override
 	public void onRequest()
 	{
-		convertInput();
-		updateModel();
-		onSelectionChanged(getModelObject());
+		Form<?> form = getForm();
+		if (form == null) {
+			convertInput();
+			updateModel();
+			onSelectionChanged(getModelObject());
+		} else {
+			form.onFormSubmitted(new IFormSubmitter()
+			{
+				@Override
+				public void onSubmit()
+				{
+					convertInput();
+					updateModel();
+					onSelectionChanged(getModelObject());
+				}
+				
+				@Override
+				public void onError()
+				{
+				}
+				
+				@Override
+				public void onAfterSubmit()
+				{
+				}
+				
+				@Override
+				public Form<?> getForm()
+				{
+					return CheckBox.this.getForm();
+				}
+				
+				@Override
+				public boolean getDefaultFormProcessing()
+				{
+					return false;
+				}
+			});
+		}
 	}
 
 	/**
-	 * Template method that can be overridden by clients that implement IOnChangeListener to be
-	 * notified by onChange events of a select element. This method does nothing by default.
+	 * Template method that can be overridden to be notified by value changes.
+	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
+	 * this method to being called.
 	 * <p>
-	 * Called when a option is selected of a dropdown list that wants to be notified of this event.
-	 * This method is to be implemented by clients that want to be notified of selection events.
+	 * This method does nothing by default.
 	 * 
 	 * @param newSelection
 	 *            The newly selected object of the backing model NOTE this is the same as you would
 	 *            get by calling getModelObject() if the new selection were current
-	 * @see #wantOnSelectionChangedNotifications()
 	 */
 	protected void onSelectionChanged(Boolean newSelection)
 	{
 	}
 
 	/**
-	 * Whether this component's onSelectionChanged event handler should called using javascript if
-	 * the selection changes. If true, a roundtrip will be generated with each selection change,
-	 * resulting in the model being updated (of just this component) and onSelectionChanged being
-	 * called. This method returns false by default.
+	 * Whether a request should be generated with each selection change, resulting in the
+	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
+	 * being called. This method returns false by default.
+	 * <p>
+	 * Use an {@link AjaxFormComponentUpdatingBehavior} with <tt>change</tt> event,
+	 * if you want to use Ajax instead.
 	 * 
-	 * @return True if this component's onSelectionChanged event handler should called using
-	 *         javascript if the selection changes
+	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
 	 */
 	protected boolean wantOnSelectionChangedNotifications()
 	{
@@ -169,7 +206,7 @@ public class CheckBox extends FormComponent<Boolean> implements IRequestListener
 			Form<?> form = findParent(Form.class);
 			if (form != null)
 			{
-				tag.put("onclick", form.getJsForInterfaceUrl(url));
+				tag.put("onclick", form.getJsForListenerUrl(url));
 			}
 			else
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
index 8795ec4..ead1823 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.apache.wicket.IRequestListener;
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
@@ -207,34 +208,71 @@ public class CheckGroup<T> extends FormComponent<Collection<T>> implements IRequ
 	@Override
 	public final void onRequest()
 	{
-		convertInput();
-		updateModel();
-		onSelectionChanged(getModelObject());
+		Form<?> form = getForm();
+		if (form == null) {
+			convertInput();
+			updateModel();
+			onSelectionChanged(getModelObject());
+		} else {
+			form.onFormSubmitted(new IFormSubmitter()
+			{
+				@Override
+				public void onSubmit()
+				{
+					convertInput();
+					updateModel();
+					onSelectionChanged(getModelObject());
+				}
+				
+				@Override
+				public void onError()
+				{
+				}
+				
+				@Override
+				public void onAfterSubmit()
+				{
+				}
+				
+				@Override
+				public Form<?> getForm()
+				{
+					return CheckGroup.this.getForm();
+				}
+				
+				@Override
+				public boolean getDefaultFormProcessing()
+				{
+					return false;
+				}
+			});
+		}
 	}
 
 	/**
-	 * Template method that can be overridden by clients that implement IOnChangeListener to be
-	 * notified by onChange events of a select element. This method does nothing by default.
+	 * Template method that can be overridden to be notified by value changes.
+	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
+	 * this method to being called.
 	 * <p>
-	 * Called when a {@link Check} is clicked in a {@link CheckGroup} that wants to be notified of
-	 * this event. This method is to be implemented by clients that want to be notified of selection
-	 * events.
+	 * This method does nothing by default.
 	 * 
 	 * @param newSelection
-	 *            The new selection of the {@link CheckGroup}. NOTE this is the same as you would
+	 *            The newly selected object of the backing model NOTE this is the same as you would
 	 *            get by calling getModelObject() if the new selection were current
-	 * 
-	 * @see #wantOnSelectionChangedNotifications()
 	 */
 	protected void onSelectionChanged(final Collection<T> newSelection)
 	{
 	}
 
 	/**
-	 * This method should be overridden to return true if it is desirable to have
-	 * on-selection-changed notification.
+	 * Whether a request should be generated with each selection change, resulting in the
+	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
+	 * being called. This method returns false by default.
+	 * <p>
+	 * Use an {@link AjaxFormChoiceComponentUpdatingBehavior} with <tt>change</tt> event,
+	 * if you want to use Ajax instead.
 	 * 
-	 * @return true if component should receive on-selection-changed notifications, false otherwise
+	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
 	 */
 	protected boolean wantOnSelectionChangedNotifications()
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
index 954ada6..cee8851 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
@@ -209,9 +209,45 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 	@Override
 	public final void onRequest()
 	{
-		convertInput();
-		updateModel();
-		onSelectionChanged(getModelObject());
+		Form<?> form = getForm();
+		if (form == null) {
+			convertInput();
+			updateModel();
+			onSelectionChanged(getModelObject());
+		} else {
+			form.getRootForm().onFormSubmitted(new IFormSubmitter()
+			{
+				@Override
+				public void onSubmit()
+				{
+					convertInput();
+					updateModel();
+					onSelectionChanged(getModelObject());
+				}
+				
+				@Override
+				public void onError()
+				{
+				}
+				
+				@Override
+				public void onAfterSubmit()
+				{
+				}
+				
+				@Override
+				public Form<?> getForm()
+				{
+					return DropDownChoice.this.getForm();
+				}
+				
+				@Override
+				public boolean getDefaultFormProcessing()
+				{
+					return false;
+				}
+			});
+		}
 	}
 
 	/**
@@ -230,14 +266,12 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 		// selection changed?
 		if (wantOnSelectionChangedNotifications())
 		{
-			// we do not want relative URL here, because it will be used by
-			// Form#dispatchEvent
 			CharSequence url = urlForListener(new PageParameters());
 
 			Form<?> form = findParent(Form.class);
 			if (form != null)
 			{
-				tag.put("onchange", form.getJsForInterfaceUrl(url.toString()));
+				tag.put("onchange", form.getJsForListenerUrl(url.toString()));
 			}
 			else
 			{
@@ -251,11 +285,11 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 	}
 
 	/**
-	 * Template method that can be overridden by clients that implement IOnChangeListener to be
-	 * notified by onChange events of a select element. This method does nothing by default.
+	 * Template method that can be overridden to be notified by value changes.
+	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
+	 * this method to being called.
 	 * <p>
-	 * Called when a option is selected of a dropdown list that wants to be notified of this event.
-	 * This method is to be implemented by clients that want to be notified of selection events.
+	 * This method does nothing by default.
 	 * 
 	 * @param newSelection
 	 *            The newly selected object of the backing model NOTE this is the same as you would
@@ -266,15 +300,14 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 	}
 
 	/**
-	 * Whether this component's onSelectionChanged event handler should be called using javascript
-	 * <tt>window.location</tt> if the selection changes. If true, a roundtrip will be generated
-	 * with each selection change, resulting in the model being updated (of just this component) and
-	 * onSelectionChanged being called. This method returns false by default. If you wish to use
-	 * Ajax instead, let {@link #wantOnSelectionChangedNotifications()} return false and add an
-	 * {@link AjaxFormComponentUpdatingBehavior} to the component using the <tt>onchange</tt> event.
+	 * Whether a request should be generated with each selection change, resulting in the
+	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
+	 * being called. This method returns false by default.
+	 * <p>
+	 * Use an {@link AjaxFormComponentUpdatingBehavior} with <tt>change</tt> event,
+	 * if you want to use Ajax instead.
 	 * 
-	 * @return True if this component's onSelectionChanged event handler should called using
-	 *         javascript if the selection changes
+	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
 	 */
 	protected boolean wantOnSelectionChangedNotifications()
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
index a90ccc4..6edd242 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
@@ -48,13 +48,8 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.http.servlet.MultipartServletWebRequest;
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.IRequestParameters;
-import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Response;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.UrlRenderer;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.encoding.UrlDecoder;
 import org.apache.wicket.util.lang.Args;
@@ -514,44 +509,19 @@ public class Form<T> extends WebMarkupContainer
 	}
 
 	/**
-	 * This generates a piece of javascript code that sets the url in the special hidden field and
-	 * submits the form.
+	 * Generate a piece of JavaScript that submits the form to the given URL.
 	 * 
 	 * Warning: This code should only be called in the rendering phase for form components inside
 	 * the form because it uses the css/javascript id of the form which can be stored in the markup.
 	 * 
 	 * @param url
-	 *            The interface url that has to be stored in the hidden field and submitted
-	 * @return The javascript code that submits the form.
+	 *            The listener url to be submitted to
+	 * @return the javascript code that submits the form.
 	 */
-	public final CharSequence getJsForInterfaceUrl(CharSequence url)
+	public final CharSequence getJsForListenerUrl(CharSequence url)
 	{
-		/*
-		 * since the passed in url is handled when the current url is form's action url and not the
-		 * current request's url we rerender the passed in url to be relative to the form's action
-		 * url
-		 */
-		UrlRenderer renderer = getRequestCycle().getUrlRenderer();
-		Url oldBase = renderer.getBaseUrl();
-		try
-		{
-			Url action = Url.parse(getActionUrl().toString());
-			renderer.setBaseUrl(action);
-			url = renderer.renderUrl(Url.parse(url.toString()));
-		}
-		finally
-		{
-			renderer.setBaseUrl(oldBase);
-		}
-
 		Form<?> root = getRootForm();
-		return new AppendingStringBuffer("document.getElementById('").append(
-			root.getHiddenFieldId())
-			.append("').value='")
-			.append(url)
-			.append("';document.getElementById('")
-			.append(root.getMarkupId())
-			.append("').submit();");
+		return String.format("var f = document.getElementById('%s'); f.action='%s';f.submit();", root.getMarkupId(), url);
 	}
 
 	/**
@@ -748,59 +718,49 @@ public class Form<T> extends WebMarkupContainer
 			// Tells FormComponents that a new user input has come
 			inputChanged();
 
-			String url = getRequest().getRequestParameters()
-				.getParameterValue(getHiddenFieldId())
-				.toString();
-			if (!Strings.isEmpty(url))
-			{
-				dispatchEvent(getPage(), url);
-			}
-			else
+			// First, see if the processing was triggered by a Wicket IFormSubmittingComponent
+			if (submitter == null)
 			{
-				// First, see if the processing was triggered by a Wicket IFormSubmittingComponent
-				if (submitter == null)
+				submitter = findSubmittingButton();
+
+				if (submitter instanceof IFormSubmittingComponent)
 				{
-					submitter = findSubmittingButton();
+					IFormSubmittingComponent submittingComponent = (IFormSubmittingComponent)submitter;
+					Component component = (Component)submitter;
 
-					if (submitter instanceof IFormSubmittingComponent)
+					if (!component.isVisibleInHierarchy())
 					{
-						IFormSubmittingComponent submittingComponent = (IFormSubmittingComponent)submitter;
-						Component component = (Component)submitter;
-
-						if (!component.isVisibleInHierarchy())
-						{
-							throw new WicketRuntimeException("Submit Button " +
-								submittingComponent.getInputName() + " (path=" +
-								component.getPageRelativePath() + ") is not visible");
-						}
+						throw new WicketRuntimeException("Submit Button " +
+							submittingComponent.getInputName() + " (path=" +
+							component.getPageRelativePath() + ") is not visible");
+					}
 
-						if (!component.isEnabledInHierarchy())
-						{
-							throw new WicketRuntimeException("Submit Button " +
-								submittingComponent.getInputName() + " (path=" +
-								component.getPageRelativePath() + ") is not enabled");
-						}
+					if (!component.isEnabledInHierarchy())
+					{
+						throw new WicketRuntimeException("Submit Button " +
+							submittingComponent.getInputName() + " (path=" +
+							component.getPageRelativePath() + ") is not enabled");
 					}
 				}
+			}
 
-				// When processing was triggered by a Wicket IFormSubmittingComponent and that
-				// component indicates it wants to be called immediately
-				// (without processing), call the IFormSubmittingComponent.onSubmit* methods right
-				// away.
-				if (submitter != null && !submitter.getDefaultFormProcessing())
-				{
-					submitter.onSubmit();
-					submitter.onAfterSubmit();
-				}
-				else
-				{
-					// the submit request might be for one of the nested forms, so let's
-					// find the right one:
-					final Form<?> formToProcess = findFormToProcess(submitter);
+			// When processing was triggered by a Wicket IFormSubmittingComponent and that
+			// component indicates it wants to be called immediately
+			// (without processing), call the IFormSubmittingComponent.onSubmit* methods right
+			// away.
+			if (submitter != null && !submitter.getDefaultFormProcessing())
+			{
+				submitter.onSubmit();
+				submitter.onAfterSubmit();
+			}
+			else
+			{
+				// the submit request might be for one of the nested forms, so let's
+				// find the right one:
+				final Form<?> formToProcess = findFormToProcess(submitter);
 
-					// process the form for this request
-					formToProcess.process(submitter);
-				}
+				// process the form for this request
+				formToProcess.process(submitter);
 			}
 		}
 		// If multi part did fail check if an error is registered and call
@@ -1181,35 +1141,6 @@ public class Form<T> extends WebMarkupContainer
 	}
 
 	/**
-	 * Method for dispatching/calling a interface on a page from the given url. Used by
-	 * {@link Form#onRequest()} for dispatching events
-	 * 
-	 * @param page
-	 *            The page where the event should be called on.
-	 * @param url
-	 *            The url which describes the component path and the interface to be called.
-	 */
-	private void dispatchEvent(final Page page, final String url)
-	{
-		// the current request's url is most likely wicket/page?x-y.IFormSubmitListener-path-to-form
-		// while the passed in url is most likely page?x.y.IOnChangeListener-path-to-component
-		// we transform the passed in url into wicket/page?x-y.IOnChangeListener-path-to-component
-		// so the system mapper can interpret it
-		String urlWoJSessionId = Strings.stripJSessionId(url);
-		Url resolved = new Url(getRequest().getUrl());
-		resolved.resolveRelative(Url.parse(urlWoJSessionId));
-
-		IRequestMapper mapper = getApplication().getRootRequestMapper();
-		Request request = getRequest().cloneWithUrl(resolved);
-		IRequestHandler handler = mapper.mapRequest(request);
-
-		if (handler != null)
-		{
-			getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
-		}
-	}
-
-	/**
 	 * Visits the form's children FormComponents and inform them that a new user input is available
 	 * in the Request
 	 */
@@ -1712,29 +1643,22 @@ public class Form<T> extends WebMarkupContainer
 	 */
 	public final void writeHiddenFields()
 	{
-		// get the hidden field id
-		String nameAndId = getHiddenFieldId();
-
-		AppendingStringBuffer buffer = new AppendingStringBuffer(HIDDEN_DIV_START).append(
-			"<input type=\"hidden\" name=\"")
-			.append(nameAndId)
-			.append("\" id=\"")
-			.append(nameAndId)
-			.append("\" />");
-
 		// if it's a get, did put the parameters in the action attribute,
 		// and have to write the url parameters as hidden fields
 		if (encodeUrlInHiddenFields())
 		{
+			AppendingStringBuffer buffer = new AppendingStringBuffer(HIDDEN_DIV_START);
+
 			String url = getActionUrl().toString();
 			int i = url.indexOf('?');
 			String queryString = (i > -1) ? url.substring(i + 1) : url;
 			String[] params = Strings.split(queryString, '&');
 
 			writeParamsAsHiddenFields(params, buffer);
+			
+			buffer.append("</div>");
+			getResponse().write(buffer);
 		}
-		buffer.append("</div>");
-		getResponse().write(buffer);
 
 		// if a default submitting component was set, handle the rendering of that
 		if (defaultSubmittingComponent instanceof Component)

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
index 6a5a46f..1c38c11 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
@@ -188,7 +188,7 @@ public class Radio<T> extends LabeledWebMarkupContainer implements IGenericCompo
 			Form<?> form = group.findParent(Form.class);
 			if (form != null)
 			{
-				tag.put("onclick", form.getJsForInterfaceUrl(url));
+				tag.put("onclick", form.getJsForListenerUrl(url));
 			}
 			else
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
index 0a2f11b..13b8b33 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
@@ -20,6 +20,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.wicket.IRequestListener;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.model.IModel;
@@ -251,35 +252,71 @@ public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IRe
 	@Override
 	public void onRequest()
 	{
-		convertInput();
-		updateModel();
-		onSelectionChanged(getModelObject());
+		Form<?> form = getForm();
+		if (form == null) {
+			convertInput();
+			updateModel();
+			onSelectionChanged(getModelObject());
+		} else {
+			form.onFormSubmitted(new IFormSubmitter()
+			{
+				@Override
+				public void onSubmit()
+				{
+					convertInput();
+					updateModel();
+					onSelectionChanged(getModelObject());
+				}
+				
+				@Override
+				public void onError()
+				{
+				}
+				
+				@Override
+				public void onAfterSubmit()
+				{
+				}
+				
+				@Override
+				public Form<?> getForm()
+				{
+					return RadioChoice.this.getForm();
+				}
+				
+				@Override
+				public boolean getDefaultFormProcessing()
+				{
+					return false;
+				}
+			});
+		}
 	}
 
 	/**
-	 * Template method that can be overridden by clients that implement IOnChangeListener to be
-	 * notified by onChange events of a select element. This method does nothing by default.
+	 * Template method that can be overridden to be notified by value changes.
+	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
+	 * this method to being called.
 	 * <p>
-	 * Called when a option is selected of a dropdown list that wants to be notified of this event.
-	 * This method is to be implemented by clients that want to be notified of selection events.
+	 * This method does nothing by default.
 	 * 
 	 * @param newSelection
 	 *            The newly selected object of the backing model NOTE this is the same as you would
 	 *            get by calling getModelObject() if the new selection were current
-	 * @see #wantOnSelectionChangedNotifications()
 	 */
 	protected void onSelectionChanged(T newSelection)
 	{
 	}
 
 	/**
-	 * Whether this component's onSelectionChanged event handler should called using javascript if
-	 * the selection changes. If true, a roundtrip will be generated with each selection change,
-	 * resulting in the model being updated (of just this component) and onSelectionChanged being
-	 * called. This method returns false by default.
+	 * Whether a request should be generated with each selection change, resulting in the
+	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
+	 * being called. This method returns false by default.
+	 * <p>
+	 * Use an {@link AjaxFormComponentUpdatingBehavior} with <tt>change</tt> event,
+	 * if you want to use Ajax instead.
 	 * 
-	 * @return True if this component's onSelectionChanged event handler should called using
-	 *         javascript if the selection changes
+	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
 	 */
 	protected boolean wantOnSelectionChangedNotifications()
 	{
@@ -534,7 +571,7 @@ public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IRe
 				if (form != null)
 				{
 					buffer.append(" onclick=\"")
-						.append(form.getJsForInterfaceUrl(url))
+						.append(form.getJsForListenerUrl(url))
 						.append(";\"");
 				}
 				else

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
index 1a54bad..51778a4 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.html.form;
 
 import org.apache.wicket.IRequestListener;
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
@@ -72,6 +73,16 @@ public class RadioGroup<T> extends FormComponent<T> implements IRequestListener
 		setRenderBodyOnly(true);
 	}
 
+	/**
+	 * Whether a request should be generated with each selection change, resulting in the
+	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
+	 * being called. This method returns false by default.
+	 * <p>
+	 * Use an {@link AjaxFormChoiceComponentUpdatingBehavior} with <tt>change</tt> event,
+	 * if you want to use Ajax instead.
+	 * 
+	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
+	 */
 	protected boolean wantOnSelectionChangedNotifications()
 	{
 		return false;
@@ -170,23 +181,57 @@ public class RadioGroup<T> extends FormComponent<T> implements IRequestListener
 	@Override
 	public final void onRequest()
 	{
-		convertInput();
-		updateModel();
-		onSelectionChanged(getModelObject());
+		Form<?> form = getForm();
+		if (form == null) {
+			convertInput();
+			updateModel();
+			onSelectionChanged(getModelObject());
+		} else {
+			form.onFormSubmitted(new IFormSubmitter()
+			{
+				@Override
+				public void onSubmit()
+				{
+					convertInput();
+					updateModel();
+					onSelectionChanged(getModelObject());
+				}
+				
+				@Override
+				public void onError()
+				{
+				}
+				
+				@Override
+				public void onAfterSubmit()
+				{
+				}
+				
+				@Override
+				public Form<?> getForm()
+				{
+					return RadioGroup.this.getForm();
+				}
+				
+				@Override
+				public boolean getDefaultFormProcessing()
+				{
+					return false;
+				}
+			});
+		}
 	}
 
 	/**
-	 * Template method that can be overridden by clients that implement IOnChangeListener to be
-	 * notified by onChange events of a select element. This method does nothing by default.
+	 * Template method that can be overridden to be notified by value changes.
+	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
+	 * this method to being called.
 	 * <p>
-	 * Called when a option is selected of a dropdown list that wants to be notified of this event.
-	 * This method is to be implemented by clients that want to be notified of selection events.
+	 * This method does nothing by default.
 	 * 
 	 * @param newSelection
 	 *            The newly selected object of the backing model NOTE this is the same as you would
 	 *            get by calling getModelObject() if the new selection were current
-	 * 
-	 * @see #wantOnSelectionChangedNotifications()
 	 */
 	protected void onSelectionChanged(final T newSelection)
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
index ae6b5e8..eb01bc8 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
@@ -109,7 +109,6 @@ public class StatelessForm<T> extends Form<T>
 					parameters.remove(formComponent.getInputName());
 				}
 			});
-			parameters.remove(getHiddenFieldId());
 			if (submittingComponent instanceof AbstractSubmitLink)
 			{
 				AbstractSubmitLink submitLink = (AbstractSubmitLink)submittingComponent;

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
index d5de8be..bace3ae 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SubmitLink.java
@@ -16,8 +16,10 @@
  */
 package org.apache.wicket.markup.html.form;
 
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 /**
  * A link which can be used exactly like a Button to submit a Form. The onclick of the link will use
@@ -67,7 +69,7 @@ import org.apache.wicket.model.IModel;
  * @author Eelco Hillenius
  * 
  */
-public class SubmitLink extends AbstractSubmitLink
+public class SubmitLink extends AbstractSubmitLink implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -194,37 +196,16 @@ public class SubmitLink extends AbstractSubmitLink
 	 * 
 	 * @return The JavaScript to be executed when the link is clicked.
 	 */
-	protected String getTriggerJavaScript()
+	protected CharSequence getTriggerJavaScript()
 	{
 		if (getForm() != null)
 		{
 			// find the root form - the one we are really going to submit
 			Form<?> root = getForm().getRootForm();
-			StringBuilder sb = new StringBuilder(100);
-			sb.append("var e=document.getElementById('");
-			sb.append(root.getHiddenFieldId());
-			sb.append("'); e.name=\'");
-			sb.append(getInputName());
-			sb.append("'; e.value='x';");
-			sb.append("var f=document.getElementById('");
-			sb.append(root.getMarkupId());
-			sb.append("');");
-			if (shouldInvokeJavaScriptFormOnsubmit())
-			{
-				if (getForm() != root)
-				{
-					sb.append("var ff=document.getElementById('");
-					sb.append(getForm().getMarkupId());
-					sb.append("');");
-				}
-				else
-				{
-					sb.append("var ff=f;");
-				}
-				sb.append("if (typeof ff.onsubmit === 'function') { if (ff.onsubmit()==false) return false; }");
-			}
-			sb.append("f.submit();e.value='';e.name='';return false;");
-			return sb.toString();
+
+			CharSequence url = urlForListener(new PageParameters());
+
+			return root.getJsForListenerUrl(url);
 		}
 		else
 		{
@@ -232,6 +213,11 @@ public class SubmitLink extends AbstractSubmitLink
 		}
 	}
 
+	@Override
+	public void onRequest()
+	{
+		getForm().onFormSubmitted(this);
+	}
 
 	/**
 	 * @see org.apache.wicket.markup.html.form.IFormSubmittingComponent#onError()

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html
index c5b441e..575770d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitTestPage_expected.html
@@ -22,7 +22,7 @@ Wicket.Event.publish(Wicket.Event.Topic.AJAX_HANDLERS_BOUND);
 /*]]>*/
 </script>
 </head><body>
-		<form wicket:id="form" id="form1" method="post" action="./page?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+		<form wicket:id="form" id="form1" method="post" action="./page?0-1.-form">
 			<input type="text" wicket:id="txt1" value="foo" name="txt1"/>
 			<input type="text" wicket:id="txt2" value="bar" name="txt2"/>
 			<input type="submit" value="Submit" wicket:id="submit" name="p::submit" id="submit2"/>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html
index 24ec8cb..0535212 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/form/OnChangeAjaxBehaviorTestPage_expected.html
@@ -23,7 +23,7 @@ Wicket.Event.publish(Wicket.Event.Topic.AJAX_HANDLERS_BOUND);
 /*]]>*/
 </script>
 </head><body>
-		<form wicket:id="form" id="form3" method="post" action="./org.apache.wicket.ajax.form.OnChangeAjaxBehaviorTestPage?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form3_hf_0" id="form3_hf_0" /></div>
+		<form wicket:id="form" id="form3" method="post" action="./org.apache.wicket.ajax.form.OnChangeAjaxBehaviorTestPage?0-1.-form">
 			<input type="text" wicket:id="field" value="" name="field" id="field1"/>
 	
 			<select wicket:id="dropDown" name="dropDown" id="dropDown2">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupDisabledTestPage_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupDisabledTestPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupDisabledTestPage_expected.html
index 4ac8378..58aada7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupDisabledTestPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupDisabledTestPage_expected.html
@@ -2,7 +2,7 @@
 <head><title>CheckGroupTestPage1</title></head>
 <body>
     <!--  In addition test that chars are not converted from upper to lower and vice versa -->
-	<FORM wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupDisabledTestPage?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+	<FORM wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupDisabledTestPage?0-1.-form">
 		<span wicket:id="group">
 			<input type="checkbox" wicket:id="check1" id="check12" name="group" value="check0" checked="checked" disabled="disabled">check1</input>
 			<span wicket:id="container">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage1_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage1_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage1_expected.html
index abd39dc..7f1747b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage1_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage1_expected.html
@@ -2,7 +2,7 @@
 <head><title>CheckGroupTestPage1</title></head>
 <body>
     <!--  In addition test that chars are not converted from upper to lower and vice versa -->
-	<FORM wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage1?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+	<FORM wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage1?0-1.-form">
 		
 			<input type="checkbox" wicket:id="check1" id="check12" name="group" value="check0">check1</input>
 			<span wicket:id="container">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage2_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage2_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage2_expected.html
index 1683546..23a04c2 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage2_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage2_expected.html
@@ -1,7 +1,7 @@
 <html>
 <head><title>CheckGroupTestPage2</title></head>
 <body>
-	<form wicket:id="form" id="form4" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage2?1-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form4_hf_0" id="form4_hf_0" /></div>
+	<form wicket:id="form" id="form4" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage2?1-1.-form">
 		
 			<input type="checkbox" wicket:id="check1" id="check15" name="group" value="check0" checked="checked">check1</input>
 			<span wicket:id="container">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage3_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage3_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage3_expected.html
index 8030cc7..6abb92e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage3_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage3_expected.html
@@ -1,7 +1,7 @@
 <html>
 <head><title>CheckGroupTestPage3</title></head>
 <body>
-	<form wicket:id="form" id="form7" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage3?2-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form7_hf_0" id="form7_hf_0" /></div>
+	<form wicket:id="form" id="form7" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage3?2-1.-form">
 		
 			<input type="checkbox" wicket:id="check1" id="check18" name="group" value="check0">check1</input>
 			<span wicket:id="container">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage4_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage4_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage4_expected.html
index 5eb87ac..2fc9396 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage4_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/CheckGroupTestPage4_expected.html
@@ -1,7 +1,7 @@
 <html>
 <head><title>CheckGroupTestPage4</title></head>
 <body>
-	<form wicket:id="form" id="forma" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage4?3-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="forma_hf_0" id="forma_hf_0" /></div>
+	<form wicket:id="form" id="forma" method="post" action="./org.apache.wicket.markup.html.form.CheckGroupTestPage4?3-1.-form">
 		
 			<input type="checkbox" wicket:id="check1" id="check1b" name="group" value="check0" checked="checked">check1</input>
 			<span wicket:id="container">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_false_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_false_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_false_expected.html
index 26965dc..17d5584 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_false_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_false_expected.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form">
     <select wicket:id="dropdown" name="dropdown">
 <option selected="selected" value="0">A</option>
 <option value="1">B</option>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_true_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_true_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_true_expected.html
index 125c2fe..3f4c765 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_true_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_A_true_expected.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form">
     <select wicket:id="dropdown" name="dropdown">
 <option value=""></option>
 <option selected="selected" value="0">A</option>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_false_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_false_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_false_expected.html
index c1263ea..a753ec1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_false_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_false_expected.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form">
     <select wicket:id="dropdown" name="dropdown">
 <option selected="selected" value="">Choose One</option>
 <option value="0">A</option>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_true_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_true_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_true_expected.html
index 7dc93d7..ece03d5 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_true_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/DropDownChoiceTestPage_null_true_expected.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form">
     <select wicket:id="dropdown" name="dropdown">
 <option selected="selected" value=""></option>
 <option value="0">A</option>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormMethodTestPage_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormMethodTestPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormMethodTestPage_expected.html
index 6050ab1..6689a44 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormMethodTestPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/FormMethodTestPage_expected.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-	<form wicket:id="formpost" id="formpost1" method="post" action="./org.apache.wicket.markup.html.form.FormMethodTestPage?0-1.-formpost"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="formpost1_hf_0" id="formpost1_hf_0" /></div></form>
-	<form wicket:id="formget" id="formget2" method="get" action="./org.apache.wicket.markup.html.form.FormMethodTestPage"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="formget2_hf_0" id="formget2_hf_0" /><input type="hidden" name="0-1.-formget" value="" /></div></form>
+	<form wicket:id="formpost" id="formpost1" method="post" action="./org.apache.wicket.markup.html.form.FormMethodTestPage?0-1.-formpost"></form>
+	<form wicket:id="formget" id="formget2" method="get" action="./org.apache.wicket.markup.html.form.FormMethodTestPage"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="0-1.-formget" value="" /></div></form>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupDisabledTestPage_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupDisabledTestPage_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupDisabledTestPage_expected.html
index 3f468c0..67a52bf 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupDisabledTestPage_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupDisabledTestPage_expected.html
@@ -1,7 +1,7 @@
 <html>
 <head><title>RadioGroupTestPage1</title></head>
 <body>
-	<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.RadioGroupDisabledTestPage?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+	<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.RadioGroupDisabledTestPage?0-1.-form">
 		<span wicket:id="group">
 			<input type="radio" wicket:id="radio1" id="radio12" name="group" value="radio0" disabled="disabled">radio1</input>
 			<span wicket:id="container">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage1_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage1_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage1_expected.html
index 09dee23..ca5bed6 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage1_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage1_expected.html
@@ -1,7 +1,7 @@
 <html>
 <head><title>RadioGroupTestPage1</title></head>
 <body>
-	<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.RadioGroupTestPage1?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+	<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.RadioGroupTestPage1?0-1.-form">
 		
 			<input type="radio" wicket:id="radio1" id="radio12" name="group" value="radio0">radio1</input>
 			<span wicket:id="container">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage3_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage3_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage3_expected.html
index 4a6a0b6..f836c9d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage3_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/RadioGroupTestPage3_expected.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.RadioGroupTestPage3?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.RadioGroupTestPage3?0-1.-form">
 	
 		<input wicket:id="check1" type="radio" id="check12" name="radio" value="radio0" checked="checked">Yes
 		<input wicket:id="check2" type="radio" id="check23" name="radio" value="radio1" checked="checked">No

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result1.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result1.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result1.html
index 1beb7a5..6428a2e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result1.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result1.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackFormPage?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackFormPage?0-1.-form">
 <span wicket:id="feedback"><wicket:border>
 		<wicket:body>
 	<input type="text" wicket:id="input" value="" name="feedback:feedback_body:input">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result2.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result2.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result2.html
index c1f54fc..da1bfe0 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result2.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackFormPage_result2.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackFormPage?1-2.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackFormPage?1-2.-form">
 <span wicket:id="feedback"><wicket:border>
 		<wicket:body>
 	<input type="text" wicket:id="input" value="" name="feedback:feedback_body:input">

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result1.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result1.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result1.html
index 3fe836e..75a5b8e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result1.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result1.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackIndicatorFormPage?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackIndicatorFormPage?0-1.-form">
 	<input type="text" wicket:id="input" value="" name="input">
 
 </form>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result2.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result2.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result2.html
index e1fe256..fa72247 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result2.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/feedback/FeedbackIndicatorFormPage_result2.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackIndicatorFormPage?1-2.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.form.feedback.FeedbackIndicatorFormPage?1-2.-form">
 	<input type="text" wicket:id="input" value="" name="input">
 <span wicket:id="feedback"><wicket:panel><span style="color:red;">*</span></wicket:panel></span>
 </form>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/pageWithParameters_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/pageWithParameters_expected.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/pageWithParameters_expected.html
index 665c8b4..f4a5d2b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/pageWithParameters_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/pageWithParameters_expected.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-	<form wicket:id="formpost" id="formpost1" method="post" action="./org.apache.wicket.markup.html.form.FormMethodTestPage?0-1.-formpost&amp;first=foo&amp;second=bar"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="formpost1_hf_0" id="formpost1_hf_0" /></div></form>
-	<form wicket:id="formget" id="formget2" method="get" action="./org.apache.wicket.markup.html.form.FormMethodTestPage"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="formget2_hf_0" id="formget2_hf_0" /><input type="hidden" name="0-1.-formget" value="" /><input type="hidden" name="first" value="foo" /><input type="hidden" name="second" value="bar" /></div></form>
+	<form wicket:id="formpost" id="formpost1" method="post" action="./org.apache.wicket.markup.html.form.FormMethodTestPage?0-1.-formpost&amp;first=foo&amp;second=bar"></form>
+	<form wicket:id="formget" id="formget2" method="get" action="./org.apache.wicket.markup.html.form.FormMethodTestPage"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="0-1.-formget" value="" /><input type="hidden" name="first" value="foo" /><input type="hidden" name="second" value="bar" /></div></form>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/HomePage1_ExpectedResult.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/HomePage1_ExpectedResult.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/HomePage1_ExpectedResult.html
index 561b878..eb9e737 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/HomePage1_ExpectedResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/validation/HomePage1_ExpectedResult.html
@@ -8,7 +8,7 @@
         <span wicket:id="message">If you see this message wicket is properly configured and running</span>
         
         <div wicket:id="bug"><wicket:panel>
-	<form wicket:id="form" id="form8" method="post" action="./org.apache.wicket.markup.html.form.validation.HomePage1?1-1.-bug-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form8_hf_0" id="form8_hf_0" /></div>
+	<form wicket:id="form" id="form8" method="post" action="./org.apache.wicket.markup.html.form.validation.HomePage1?1-1.-bug-form">
 	  <div wicket:id="border"><wicket:border>
 		<wicket:body>
 	    <input wicket:id="name" value="" name="border:border_body:name"/>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1-1.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1-1.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1-1.html
index 0f555fc..46bebb1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1-1.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1-1.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?2-3.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?2-3.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     <wicket:enclosure child="label">
       <input wicket:id="input" type="checkbox" name="input"/>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1.html
index 260cccf..beac698 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-1.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?1-2.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?1-2.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     
   </form>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2-1.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2-1.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2-1.html
index 870e4db..e113306 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2-1.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2-1.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?2-3.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?2-3.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     
   </form>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2.html
index f9831a7..4b1d415 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-2.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?4-5.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?4-5.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     
   </form>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-1.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-1.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-1.html
index 2dbd5c6..215e6e6 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-1.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-1.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?5-6.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?5-6.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     <wicket:enclosure child="label">
       

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-2.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-2.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-2.html
index 6f8a775..3b89d1b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-2.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3-2.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?6-7.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?6-7.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     <wicket:enclosure child="label">
       <input wicket:id="input" type="checkbox" name="input"/>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3.html
index f88c265..5aed66f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-3.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?3-4.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?3-4.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     <wicket:enclosure child="label">
       

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-4.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-4.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-4.html
index b359886..9081a9d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-4.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9-4.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?1-2.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?1-2.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     <wicket:enclosure child="label">
       <input wicket:id="input" type="checkbox" checked="checked" name="input"/>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9.html
index bf42d8d..601179f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/EnclosurePageExpectedResult_9.html
@@ -1,6 +1,6 @@
 <html xmlns:wicket>
 <body>
-  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+  <form wicket:id="form" id="form1" method="post" action="./page?0-1.-form">
     <!-- does Wicket behave different if the enclosure child is a FormComponent?? Needs testing -->
     <wicket:enclosure child="label">
       <input wicket:id="input" type="checkbox" name="input"/>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagNotVisibleWebPageResult.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagNotVisibleWebPageResult.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagNotVisibleWebPageResult.html
index f384cd4..b0f896d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagNotVisibleWebPageResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagNotVisibleWebPageResult.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.tags.InputTagNotVisibleWebPage?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.tags.InputTagNotVisibleWebPage?0-1.-form">
 
 </form>
 </body>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagVisibleWebPageResult.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagVisibleWebPageResult.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagVisibleWebPageResult.html
index 59dfed5..cef08bc 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagVisibleWebPageResult.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/tags/InputTagVisibleWebPageResult.html
@@ -1,6 +1,6 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.tags.InputTagVisibleWebPage?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.markup.html.tags.InputTagVisibleWebPage?0-1.-form">
 <input wicket:id="input" type="text" value="" name="input">
 </form>
 </body>

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessPageWithForm_expected.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessPageWithForm_expected.html b/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessPageWithForm_expected.html
index 6360d02..88cce23 100644
--- a/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessPageWithForm_expected.html
+++ b/wicket-core/src/test/java/org/apache/wicket/stateless/StatelessPageWithForm_expected.html
@@ -1,5 +1,5 @@
 <html>
 <body>
-<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.stateless.StatelessPageWithForm?-1.-form&amp;first=foo&amp;second=bar"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form1_hf_0" id="form1_hf_0" /></div></form>
+<form wicket:id="form" id="form1" method="post" action="./org.apache.wicket.stateless.StatelessPageWithForm?-1.-form&amp;first=foo&amp;second=bar"></form>
 </body>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/25567ba1/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
index 3d867e5..d365128 100644
--- a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
+++ b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
@@ -105,8 +105,8 @@ Wicket.Event.publish(Wicket.Event.Topic.AJAX_HANDLERS_BOUND);
 </script>
 </head>
 <body>
-<form wicket:id="localeForm" id="localeForm2" method="post" action="./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-localeForm"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="localeForm2_hf_0" id="localeForm2_hf_0" /></div>
-<p><select wicket:id="localeSelect" onchange="document.getElementById(&#039;localeForm2_hf_0&#039;).value=&#039;./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-localeForm-localeSelect&#039;;document.getElementById(&#039;localeForm2&#039;).submit();" name="localeSelect">
+<form wicket:id="localeForm" id="localeForm2" method="post" action="./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-localeForm">
+<p><select wicket:id="localeSelect" onchange="var f = document.getElementById(&#039;localeForm2&#039;); f.action=&#039;./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-localeForm-localeSelect&#039;;f.submit();" name="localeSelect">
 <option value="0">cinese (Cina) (Chinese (China))</option>
 <option value="1">cinese (Cina) (Chinese (China))</option>
 <option value="2">cinese (Cina) (Chinese (China))</option>
@@ -130,7 +130,7 @@ Wicket.Event.publish(Wicket.Event.Topic.AJAX_HANDLERS_BOUND);
 </select> [<a href="./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-localeForm-localeUSLink" wicket:id="localeUSLink">set to english</a>]</p>
 </form>
 <p>
-<form wicket:id="form" id="form3" method="post" action="./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-form"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="form3_hf_0" id="form3_hf_0" /></div><input type="text" wicket:id="dateTextField" value="xx/xx/xx" name="dateTextField" id="dateTextField1"/>
+<form wicket:id="form" id="form3" method="post" action="./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-form"><input type="text" wicket:id="dateTextField" value="xx/xx/xx" name="dateTextField" id="dateTextField1"/>
 <span class="yui-skin-sam">&nbsp;<span style="display:none;position:absolute;z-index: 99999;" id="dateTextField1Dp"></span><img style="cursor: pointer; border: none;" id="dateTextField1Icon" src="../resource/org.apache.wicket.extensions.yui.calendar.DatePicker/icon1.gif" alt="" title=""/></span> <input type="submit" value="submit" /></form>
 </p>
 <p>


[7/8] wicket git commit: WICKET-6348 added javadoc and overridable #getEvent()

Posted by sv...@apache.org.
WICKET-6348 added javadoc and overridable #getEvent()


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/75547ab9
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/75547ab9
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/75547ab9

Branch: refs/heads/master
Commit: 75547ab9eb7f615ec987b93bcfec8df73618148c
Parents: ad429c1
Author: Sven Meier <sv...@apache.org>
Authored: Fri Mar 31 15:07:11 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../form/FormComponentUpdatingBehavior.java     | 27 ++++++++++++++------
 1 file changed, 19 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/75547ab9/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
index 89a2174..3bdb883 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
@@ -28,8 +28,17 @@ import org.apache.wicket.util.lang.Args;
 /**
  * A behavior to get notifications when a {@link FormComponent} changes its value.
  * <p>
- * Contrary to {@link AjaxFormComponentUpdatingBehavior} all notification are send via
+ * Contrary to {@link AjaxFormComponentUpdatingBehavior} all notification are sent via
  * standard HTTP requests and the full page is rendered as a response.
+ * <p>
+ * Notification is triggered by an event suitable for the host component this
+ * behavior is added to - if needed {@link #getEvent()} can be overridden to change the default
+ * ({@value change} for {@link DropDownChoice}, {@link ListMultipleChoice} and {@link AbstractTextComponent}, 
+ * {@value click} for anything else).
+ * <p>
+ * Note: This behavior has limited support for {@link FormComponent}s outside of a form, i.e. multiple
+ * choice components ({@link ListMultipleChoice} and {@link RadioGroup}) will send their last selected
+ * choice only.
  * 
  * @see FormComponentUpdatingBehavior#onUpdate()
  */
@@ -93,7 +102,7 @@ public class FormComponentUpdatingBehavior extends Behavior implements IRequestL
 	{
 		CharSequence url = component.urlForListener(this, new PageParameters());
 
-		String event = getJSEvent();
+		String event = getEvent();
 
 		String condition = String.format("if (event.target.name !== '%s') return; ",
 			formComponent.getInputName());
@@ -101,29 +110,31 @@ public class FormComponentUpdatingBehavior extends Behavior implements IRequestL
 		Form<?> form = component.findParent(Form.class);
 		if (form != null)
 		{
-			tag.put(event, condition + form.getJsForListenerUrl(url.toString()));
+			tag.put("on" + event, condition + form.getJsForListenerUrl(url.toString()));
 		}
 		else
 		{
 			char separator = url.toString().indexOf('?') > -1 ? '&' : '?';
 
-			tag.put(event, condition + String.format("window.location.href='%s%s%s=' + %s;", url,
+			tag.put("on" + event, condition + String.format("window.location.href='%s%s%s=' + %s;", url,
 				separator, formComponent.getInputName(), getJSValue()));
 		}
 	}
 
 	/**
-	 * Which JavaScript event triggers notification. 
+	 * Which JavaScript event triggers notification.
+	 * 
+	 * @return {@value change} or {@value click}, depending on the host component 
 	 */
-	private String getJSEvent()
+	protected String getEvent()
 	{
 		if (formComponent instanceof DropDownChoice || formComponent instanceof ListMultipleChoice|| formComponent instanceof AbstractTextComponent)
 		{
-			return "onchange";
+			return "change";
 		}
 		else
 		{
-			return "onclick";
+			return "click";
 		}
 	}
 


[8/8] wicket git commit: WICKET-6348 small improvements

Posted by sv...@apache.org.
WICKET-6348 small improvements

- check host component type
- getFormComponent() final
- new onError()
- support ListMultipleChoice

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c1d389d0
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c1d389d0
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c1d389d0

Branch: refs/heads/master
Commit: c1d389d09ee75f8fcbb58a1ebe9e1d5644563313
Parents: 9bc7ee4
Author: Sven Meier <sv...@apache.org>
Authored: Thu Mar 30 14:55:00 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../form/FormComponentUpdatingBehavior.java     | 73 +++++++++++++++-----
 1 file changed, 56 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/c1d389d0/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
index e57828b..89a2174 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentUpdatingBehavior.java
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.html.form;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.IRequestListener;
+import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.ComponentTag;
@@ -44,18 +45,24 @@ public class FormComponentUpdatingBehavior extends Behavior implements IRequestL
 	}
 
 	@Override
-	public final void bind(final Component hostComponent)
+	public final void bind(final Component component)
 	{
-		Args.notNull(hostComponent, "hostComponent");
+		Args.notNull(component, "component");
+
+		if (!(component instanceof FormComponent))
+		{
+			throw new WicketRuntimeException("Behavior " + getClass().getName()
+				+ " can only be added to an instance of a FormComponent");
+		}
 
 		if (formComponent != null)
 		{
 			throw new IllegalStateException("this kind of handler cannot be attached to " +
 				"multiple components; it is already attached to component " + formComponent +
-				", but component " + hostComponent + " wants to be attached too");
+				", but component " + component + " wants to be attached too");
 		}
 
-		this.formComponent = (FormComponent<?>)hostComponent;
+		this.formComponent = (FormComponent<?>)component;
 
 		formComponent.setRenderBodyOnly(false);
 
@@ -63,11 +70,20 @@ public class FormComponentUpdatingBehavior extends Behavior implements IRequestL
 		onBind();
 	}
 
+	/**
+	 * Called when the component was bound to it's host component. You can get the bound host
+	 * component by calling {@link #getFormComponent()}.
+	 */
 	protected void onBind()
 	{
 	}
 
-	public FormComponent<?> getFormComponent()
+	/**
+	 * Get the hosting component.
+	 * 
+	 * @return hosting component
+	 */
+	public final FormComponent<?> getFormComponent()
 	{
 		return formComponent;
 	}
@@ -101,7 +117,7 @@ public class FormComponentUpdatingBehavior extends Behavior implements IRequestL
 	 */
 	private String getJSEvent()
 	{
-		if (formComponent instanceof DropDownChoice || formComponent instanceof AbstractTextComponent)
+		if (formComponent instanceof DropDownChoice || formComponent instanceof ListMultipleChoice|| formComponent instanceof AbstractTextComponent)
 		{
 			return "onchange";
 		}
@@ -135,23 +151,30 @@ public class FormComponentUpdatingBehavior extends Behavior implements IRequestL
 	 */
 	private void process()
 	{
-		formComponent.validate();
-		if (formComponent.isValid())
+		try
 		{
-			if (getUpdateModel())
+			formComponent.validate();
+			if (formComponent.isValid())
 			{
-				formComponent.valid();
-				formComponent.updateModel();
+				if (getUpdateModel())
+				{
+					formComponent.valid();
+					formComponent.updateModel();
+				}
+	
+				onUpdate();
+			}
+			else
+			{
+				formComponent.invalid();
+				
+				onError(null);
 			}
-
-			onUpdate();
 		}
-		else
+		catch (RuntimeException e)
 		{
-			formComponent.invalid();
+			onError(e);
 		}
-		
-		onUpdate();
 	}
 
 	/**
@@ -173,6 +196,22 @@ public class FormComponentUpdatingBehavior extends Behavior implements IRequestL
 	{
 	}
 
+	/**
+	 * Hook method invoked when updating of the component resulted in an error.
+	 * <p>
+	 * The {@link RuntimeException} will be null if it was just a validation or conversion error of the
+	 * FormComponent.
+	 * 
+	 * @param e optional runtime exception
+	 */
+	protected void onError(RuntimeException e)
+	{
+		if (e != null)
+		{
+			throw e;
+		}
+	}
+	
 	@Override
 	public final void onRequest()
 	{


[4/8] wicket git commit: WICKET-6348 added javadoc; #getUpdateModel(); restored example

Posted by sv...@apache.org.
WICKET-6348 added javadoc; #getUpdateModel(); restored example

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8f8ad374
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8f8ad374
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8f8ad374

Branch: refs/heads/master
Commit: 8f8ad37458e81d93d3fdaeea0e782a41942176df
Parents: e2af756
Author: Sven Meier <sv...@apache.org>
Authored: Wed Mar 29 20:22:15 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../html/form/SelectionChangeBehavior.java      | 130 +++++++++++++++----
 .../wicket/examples/compref/CheckGroupPage.html |   3 +
 .../wicket/examples/compref/CheckGroupPage.java |  14 +-
 3 files changed, 117 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8f8ad374/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
index 8943d12..8298c06 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
@@ -18,10 +18,20 @@ package org.apache.wicket.markup.html.form;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.IRequestListener;
+import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
 
+/**
+ * A behavior to get change notifications when a choice component changes its selection.
+ * <p>
+ * Contrary to {@link AjaxFormChoiceComponentUpdatingBehavior} all notification are send via
+ * standard HTTP requests and the full page is rendered as the response.
+ * 
+ * @see SelectionChangeBehavior#onSelectionChanged()
+ */
 public class SelectionChangeBehavior extends Behavior implements IRequestListener
 {
 
@@ -32,29 +42,46 @@ public class SelectionChangeBehavior extends Behavior implements IRequestListene
 	{
 		return false;
 	}
-	
+
 	@Override
-	public void bind(Component component)
+	public final void bind(final Component hostComponent)
 	{
-		this.formComponent = (FormComponent<?>)component;
-		
+		Args.notNull(hostComponent, "hostComponent");
+
+		if (formComponent != null)
+		{
+			throw new IllegalStateException("this kind of handler cannot be attached to " +
+				"multiple components; it is already attached to component " + formComponent +
+				", but component " + hostComponent + " wants to be attached too");
+		}
+
+		this.formComponent = (FormComponent<?>)hostComponent;
+
 		formComponent.setRenderBodyOnly(false);
+
+		// call the callback
+		onBind();
+	}
+
+	protected void onBind()
+	{
 	}
 
 	public FormComponent<?> getFormComponent()
 	{
 		return formComponent;
 	}
-	
+
 	@Override
 	public void onComponentTag(Component component, ComponentTag tag)
 	{
 		CharSequence url = component.urlForListener(this, new PageParameters());
 
 		String event = getJSEvent();
-		
-		String condition = String.format("if (event.target.name !== '%s') return; ", formComponent.getInputName());
-		
+
+		String condition = String.format("if (event.target.name !== '%s') return; ",
+			formComponent.getInputName());
+
 		Form<?> form = component.findParent(Form.class);
 		if (form != null)
 		{
@@ -63,39 +90,85 @@ public class SelectionChangeBehavior extends Behavior implements IRequestListene
 		else
 		{
 			char separator = url.toString().indexOf('?') > -1 ? '&' : '?';
-				
-			tag.put(event,
-				condition + String.format("window.location.href='%s%s%s=' + %s;", url, separator, formComponent.getInputName(), getJSValue()));
+
+			tag.put(event, condition + String.format("window.location.href='%s%s%s=' + %s;", url,
+				separator, formComponent.getInputName(), getJSValue()));
 		}
 	}
 
-	
+	/**
+	 * Which JavaScript event triggers notification. 
+	 */
 	private String getJSEvent()
 	{
-		if (formComponent instanceof DropDownChoice) {
+		if (formComponent instanceof DropDownChoice)
+		{
 			return "onchange";
-		} else {
+		}
+		else
+		{
 			return "onclick";
 		}
 	}
 
+	/**
+	 * How to get the current value via JavaScript. 
+	 */
 	private String getJSValue()
 	{
-		if (formComponent instanceof DropDownChoice) {
+		if (formComponent instanceof DropDownChoice)
+		{
 			return "this.options[this.selectedIndex].value";
-		} else if (formComponent instanceof CheckBox) {
+		}
+		else if (formComponent instanceof CheckBox)
+		{
 			return "this.checked";
-		} else {
+		}
+		else
+		{
 			return "event.target.value";
 		}
 	}
 
-	private void process() {
-		formComponent.convertInput();
-		formComponent.updateModel();
+	/**
+	 * Process the form component.
+	 */
+	private void process()
+	{
+		formComponent.validate();
+		if (formComponent.isValid())
+		{
+			if (getUpdateModel())
+			{
+				formComponent.valid();
+				formComponent.updateModel();
+			}
+
+			onSelectionChanged();
+		}
+		else
+		{
+			formComponent.invalid();
+		}
+		
 		onSelectionChanged();
 	}
-	
+
+	/**
+	 * Gives the control to the application to decide whether the form component model should
+	 * be updated automatically or not. Make sure to call {@link org.apache.wicket.markup.html.form.FormComponent#valid()}
+	 * additionally in case the application want to update the model manually.
+	 *
+	 * @return true if the model of form component should be updated, false otherwise
+	 */
+	protected boolean getUpdateModel()
+	{
+		return true;
+	}
+
+	/**
+	 * Hook method invoked when selection has changed.
+	 */
 	protected void onSelectionChanged()
 	{
 	}
@@ -104,9 +177,12 @@ public class SelectionChangeBehavior extends Behavior implements IRequestListene
 	public final void onRequest()
 	{
 		Form<?> form = formComponent.findParent(Form.class);
-		if (form == null) {
+		if (form == null)
+		{
 			process();
-		} else {
+		}
+		else
+		{
 			form.getRootForm().onFormSubmitted(new IFormSubmitter()
 			{
 				@Override
@@ -114,23 +190,23 @@ public class SelectionChangeBehavior extends Behavior implements IRequestListene
 				{
 					process();
 				}
-				
+
 				@Override
 				public void onError()
 				{
 				}
-				
+
 				@Override
 				public void onAfterSubmit()
 				{
 				}
-				
+
 				@Override
 				public Form<?> getForm()
 				{
 					return formComponent.getForm();
 				}
-				
+
 				@Override
 				public boolean getDefaultFormProcessing()
 				{

http://git-wip-us.apache.org/repos/asf/wicket/blob/8f8ad374/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
index 260a2c7..b10bf3f 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
@@ -14,11 +14,13 @@
 	A CheckBoxGroup and CheckBoxComponnet components let users select multiple values from a group of checkboxes. These components are more flexible then the CheckBoxMultipleChoice component in that individual checkboxes are full components, unlike with CheckBoxMultipleChoice, and thus can be used anywhere in the markup.
 	</p>
 	<p>
+	 <form wicket:id="form">
 		<span wicket:id="group">
 			<table style="border: 2px dotted #fc0; width: 400px; padding: 5px;">
 			 <tr>
 			  <td valign="top">Select persons</td>
 			  <td>
+				  <input type="checkbox" wicket:id="groupselector">check/uncheck all</input><br/>
 				  <table cellspacing="0" cellpadding="2">
 					<tr>
 						<td><b>Select</b></td>
@@ -42,6 +44,7 @@
 			 </tr>
 			</table>
 		</span>
+	 </form>
 	 <span wicket:id="feedback">feedbackmessages will be put here</span>
 	</p>
     <span wicket:id="explainPanel">panel contents come here</span>

http://git-wip-us.apache.org/repos/asf/wicket/blob/8f8ad374/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
index 12c99fb..738920e 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
@@ -24,7 +24,6 @@ import org.apache.wicket.markup.html.form.Check;
 import org.apache.wicket.markup.html.form.CheckGroup;
 import org.apache.wicket.markup.html.form.CheckGroupSelector;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
@@ -44,9 +43,18 @@ public class CheckGroupPage extends WicketExamplePage
 	public CheckGroupPage()
 	{
 		final CheckGroup<Person> group = new CheckGroup<>("group", new ArrayList<Person>());
-		group.add(new SelectionChangeBehavior());
+		Form<Void> form = new Form<Void>("form")
+		{
+			@Override
+			protected void onSubmit()
+			{
+				info("selected person(s): " + group.getDefaultModelObjectAsString());
+			}
+		};
 
-		add(group);
+		add(form);
+		form.add(group);
+		group.add(new CheckGroupSelector("groupselector"));
 		ListView<Person> persons = new ListView<Person>("persons",
 			ComponentReferenceApplication.getPersons())
 		{


[2/8] wicket git commit: WICKET-6348 guide update for FormComponentUpdatingBehavior

Posted by sv...@apache.org.
WICKET-6348 guide update for FormComponentUpdatingBehavior


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ad429c19
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ad429c19
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ad429c19

Branch: refs/heads/master
Commit: ad429c19d6dd6486bd01b20ddf1d9bd16bca146e
Parents: c1d389d
Author: Sven Meier <sv...@apache.org>
Authored: Thu Mar 30 17:05:14 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../src/main/asciidoc/advanced/advanced_2.adoc  |  4 +-
 .../src/main/asciidoc/forms2/forms2_11.adoc     |  2 +-
 .../asciidoc/modelsforms/modelsforms_6.adoc     | 50 ++++++++------------
 3 files changed, 23 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/ad429c19/wicket-user-guide/src/main/asciidoc/advanced/advanced_2.adoc
----------------------------------------------------------------------
diff --git a/wicket-user-guide/src/main/asciidoc/advanced/advanced_2.adoc b/wicket-user-guide/src/main/asciidoc/advanced/advanced_2.adoc
index c03c060..0ec6a2f 100644
--- a/wicket-user-guide/src/main/asciidoc/advanced/advanced_2.adoc
+++ b/wicket-user-guide/src/main/asciidoc/advanced/advanced_2.adoc
@@ -53,9 +53,9 @@ public abstract class Link<T> extends AbstractLink implements IRequestListener .
 }
 ----
 
-Callback URLs can be generated with _Component_'s method _urlFor(PageParameters)_ or with method _urlFor (Behavior, RequestListenerInterface, PageParameters)_ if we are using a callback interface with a behavior (see the following example).
+Callback URLs can be generated with _Component_'s method _urlForListener(PageParameters)_ or with method _urlForListener(Behavior, PageParameters)_ if we are using a request listener on a component or behavior respectively (see the following example).
 
-Project _CallbackURLExample_ contains a behavior (class _OnChangeSingleChoiceBehavior_) that implements _org.apache.wicket.IRequestListener_ to update the model of an _AbstractSingleSelectChoice_ component when user changes the selected option (it provides the same functionality of method _wantOnSelectionChangedNotifications_). 
+Project _CallbackURLExample_ contains a behavior (class _OnChangeSingleChoiceBehavior_) that implements _org.apache.wicket.IRequestListener_ to update the model of an _AbstractSingleSelectChoice_ component when user changes the selected option (it provides the same functionality as _FormComponentUpdatingBehavior_). 
 The following is the implementation of _onRequest()_ provided by _OnSelectionChangedNotifications_:
 
 [source,java]

http://git-wip-us.apache.org/repos/asf/wicket/blob/ad429c19/wicket-user-guide/src/main/asciidoc/forms2/forms2_11.adoc
----------------------------------------------------------------------
diff --git a/wicket-user-guide/src/main/asciidoc/forms2/forms2_11.adoc b/wicket-user-guide/src/main/asciidoc/forms2/forms2_11.adoc
index 9f8a7ed..371350d 100644
--- a/wicket-user-guide/src/main/asciidoc/forms2/forms2_11.adoc
+++ b/wicket-user-guide/src/main/asciidoc/forms2/forms2_11.adoc
@@ -195,5 +195,5 @@ form.add(new RadioChoice("radioGroup", Model.of(""), fruits));
 
 image::../img/grouped-radiobutton.png[]
 
-Just like CheckBoxMultipleChoice, this component provides the setPrefix and setSuffix methods to configure the prefix and suffix for our options and it supports IChoiceRender as well. In addition, RadioChoice provides the wantOnSelectionChangedNotifications() method to notify the web server when the selected option changes (this is the same method seen for DropDownChoice in paragraph 9.4).
+Just like CheckBoxMultipleChoice, this component provides the setPrefix and setSuffix methods to configure the prefix and suffix for our options and it supports IChoiceRender as well.
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/ad429c19/wicket-user-guide/src/main/asciidoc/modelsforms/modelsforms_6.adoc
----------------------------------------------------------------------
diff --git a/wicket-user-guide/src/main/asciidoc/modelsforms/modelsforms_6.adoc b/wicket-user-guide/src/main/asciidoc/modelsforms/modelsforms_6.adoc
index f7d4b1c..3a4f39e 100644
--- a/wicket-user-guide/src/main/asciidoc/modelsforms/modelsforms_6.adoc
+++ b/wicket-user-guide/src/main/asciidoc/modelsforms/modelsforms_6.adoc
@@ -7,7 +7,7 @@ The example page will look like this:
 
 image::../img/model-chaining.png[]
 
-What we want to do in this example is to chain the model of the DropDownChoice (which contains the selected Person) with the model of the Form. In this way the Form will work with the selected Person as backing object. The DropDownChoice component can be configured to automatically update its model each time we change the selected item on the client side. All we have to do is to override method wantOnSelectionChangedNotifications to make it return true. In practice, when this method returns true, DropDownChoice will submit its value every time JavaScript event onChange occurs, and its model will be consequently updated. To leverage this functionality, DropDownChoice doesn't need to be inside a form.
+What we want to do in this example is to chain the model of the DropDownChoice (which contains the selected Person) with the model of the Form. In this way the Form will work with the selected Person as backing object. The DropDownChoice component can be configured to automatically update its model each time we change the selected item on the client side. All we have to do is to add a FormComponentUpdatingBehavior to it: The behavior will submit the components value every time JavaScript event "change" occurs, and its model will be consequently updated. To leverage this functionality, the form component doesn't need to be inside a form.
 
 The following is the resulting markup of the example page:
 
@@ -55,14 +55,8 @@ The initialization code for DropDownChoice is the following:
 ----
 Model<Person> listModel = new Model<Person>();
 ChoiceRenderer<Person> personRender = new ChoiceRenderer<Person>("fullName");
-personsList = new DropDownChoice<Person>("persons", listModel, loadPersons(), personRender){
-		
-		@Override
-		protected boolean wantOnSelectionChangedNotifications() {
-			return true;
-		}
-		
-};
+personsList = new DropDownChoice<Person>("persons", listModel, loadPersons(), personRender);
+personsList.add(new FormComponentUpdatingBehavior());
 ----
 
 As choice render we have used the basic implementation provided with the org.apache.wicket .markup.html.form.ChoiceRenderer class that we have seen in the previous paragraph. loadPersons() is just an utility method which generates a list of Person instances. The model for DropDownChoice is a simple instance of the Model class.
@@ -79,27 +73,23 @@ public class PersonListDetails extends WebPage {
     Model<Person> listModel = new Model<Person>();
     ChoiceRenderer<Person> personRender = new ChoiceRenderer<Person>("fullName");
     
-    personsList = new DropDownChoice<Person>("persons", listModel, loadPersons(),
-                                                         personRender){
-      @Override
-      protected boolean wantOnSelectionChangedNotifications() {
-        return true;
-      }
-	    };    
-
-	    add(personsList);
-
-	    form = new Form("form", new CompoundPropertyModel<Person>(listModel));    
-	    form.add(new TextField("name"));
-	    form.add(new TextField("surname"));
-	    form.add(new TextField("address"));
-	    form.add(new TextField("email"));
-
-	    add(form);
-	  }
-	       //loadPersons()
-	       //...
-	}
+    personsList = new DropDownChoice<Person>("persons", listModel, loadPersons(), personRender);
+    personsList.add(new FormComponentUpdatingBehavior());
+
+    add(personsList);
+
+    form = new Form("form", new CompoundPropertyModel<Person>(listModel));    
+    form.add(new TextField("name"));
+    form.add(new TextField("surname"));
+    form.add(new TextField("address"));
+    form.add(new TextField("email"));
+
+    add(form);
+  }
+
+       //loadPersons()
+       //...
+}
 ----
 
 The two models work together as a pipeline where the output of method getObject of Model is the model object of CompoundPropertyModel. As we have seen, model chaining allows us to combine the actions of two or more models without creating new custom implementations.


[3/8] wicket git commit: WICKET-6348 move selection change into behavior

Posted by sv...@apache.org.
WICKET-6348 move selection change into behavior


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/e2af7563
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/e2af7563
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/e2af7563

Branch: refs/heads/master
Commit: e2af75630ceaa3da0b7b00a88c87adac3dc7a3f6
Parents: 25567ba
Author: Sven Meier <sv...@apache.org>
Authored: Wed Mar 29 11:40:33 2017 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Tue Apr 4 17:30:04 2017 +0200

----------------------------------------------------------------------
 .../apache/wicket/markup/html/form/Check.java   |  20 ---
 .../wicket/markup/html/form/CheckBox.java       | 121 +---------------
 .../wicket/markup/html/form/CheckGroup.java     |  91 +-----------
 .../wicket/markup/html/form/DropDownChoice.java | 119 +---------------
 .../apache/wicket/markup/html/form/Radio.java   |  20 ---
 .../wicket/markup/html/form/RadioChoice.java    | 126 +---------------
 .../wicket/markup/html/form/RadioGroup.java     |  94 +-----------
 .../html/form/SelectionChangeBehavior.java      | 142 +++++++++++++++++++
 .../wicket/util/tester/BaseWicketTester.java    |  25 +++-
 .../apache/wicket/util/tester/FormTester.java   |  27 +---
 .../org/apache/wicket/MockPageWithForm.java     |  21 +--
 .../wicket/util/tester/FormTesterTest.java      |  16 +--
 .../extensions/yui/calendar/DatesPage1.java     |  20 +--
 .../yui/calendar/DatesPage1_ExpectedResult.html |   2 +-
 .../wicket/examples/compref/CheckGroupPage.html |   3 -
 .../wicket/examples/compref/CheckGroupPage.java |  14 +-
 .../apache/wicket/examples/dates/DatesPage.java |  14 +-
 .../wicket/examples/forminput/FormInput.java    |  37 ++---
 .../wicket/examples/tree/AdvancedTreePage.java  |  23 +--
 19 files changed, 213 insertions(+), 722 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
index 83fa278..6f7ff26 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
@@ -24,7 +24,6 @@ import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.string.Strings;
 
 
@@ -195,25 +194,6 @@ public class Check<T> extends LabeledWebMarkupContainer implements IGenericCompo
 			tag.put("checked", "checked");
 		}
 
-		if (group.wantOnSelectionChangedNotifications())
-		{
-			// url that points to this components IOnChangeListener method
-			CharSequence url = group.urlForListener(new PageParameters());
-
-			Form<?> form = group.findParent(Form.class);
-			if (form != null)
-			{
-				tag.put("onclick", form.getJsForListenerUrl(url));
-			}
-			else
-			{
-				// NOTE: do not encode the url as that would give invalid JavaScript
-				tag.put("onclick", "window.location.href='" + url +
-					(url.toString().indexOf('?') > -1 ? "&" : "?") + group.getInputName() +
-					"=' + this.value;");
-			}
-		}
-
 		if (!isActionAuthorized(ENABLE) || !isEnabledInHierarchy() || !group.isEnabledInHierarchy())
 		{
 			tag.put(ATTR_DISABLED, ATTR_DISABLED);

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
index da8f049..f318060 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
@@ -18,11 +18,8 @@ package org.apache.wicket.markup.html.form;
 
 import java.util.Locale;
 
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.convert.IConverter;
 
 /**
@@ -42,10 +39,6 @@ import org.apache.wicket.util.convert.IConverter;
  * 
  * </p>
  * <p>
- * You can can extend this class and override method wantOnSelectionChangedNotifications() to force
- * server roundtrips on each selection change.
- * </p>
- * <p>
  * A CheckBox always has a valid therefore values from methods
  * {@link FormComponent#setRequired(boolean)} and {@link FormComponent#isRequired()} are not taken
  * into account.
@@ -53,7 +46,7 @@ import org.apache.wicket.util.convert.IConverter;
  * 
  * @author Jonathan Locke
  */
-public class CheckBox extends FormComponent<Boolean> implements IRequestListener
+public class CheckBox extends FormComponent<Boolean>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -77,96 +70,6 @@ public class CheckBox extends FormComponent<Boolean> implements IRequestListener
 	}
 
 	/**
-	 * @see org.apache.wicket.markup.html.form.IOnChangeListener#onSelectionChanged()
-	 */
-	@Override
-	public void onRequest()
-	{
-		Form<?> form = getForm();
-		if (form == null) {
-			convertInput();
-			updateModel();
-			onSelectionChanged(getModelObject());
-		} else {
-			form.onFormSubmitted(new IFormSubmitter()
-			{
-				@Override
-				public void onSubmit()
-				{
-					convertInput();
-					updateModel();
-					onSelectionChanged(getModelObject());
-				}
-				
-				@Override
-				public void onError()
-				{
-				}
-				
-				@Override
-				public void onAfterSubmit()
-				{
-				}
-				
-				@Override
-				public Form<?> getForm()
-				{
-					return CheckBox.this.getForm();
-				}
-				
-				@Override
-				public boolean getDefaultFormProcessing()
-				{
-					return false;
-				}
-			});
-		}
-	}
-
-	/**
-	 * Template method that can be overridden to be notified by value changes.
-	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
-	 * this method to being called.
-	 * <p>
-	 * This method does nothing by default.
-	 * 
-	 * @param newSelection
-	 *            The newly selected object of the backing model NOTE this is the same as you would
-	 *            get by calling getModelObject() if the new selection were current
-	 */
-	protected void onSelectionChanged(Boolean newSelection)
-	{
-	}
-
-	/**
-	 * Whether a request should be generated with each selection change, resulting in the
-	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
-	 * being called. This method returns false by default.
-	 * <p>
-	 * Use an {@link AjaxFormComponentUpdatingBehavior} with <tt>change</tt> event,
-	 * if you want to use Ajax instead.
-	 * 
-	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
-	 */
-	protected boolean wantOnSelectionChangedNotifications()
-	{
-		return false;
-	}
-
-	/**
-	 * @see org.apache.wicket.MarkupContainer#getStatelessHint()
-	 */
-	@Override
-	protected boolean getStatelessHint()
-	{
-		if (wantOnSelectionChangedNotifications())
-		{
-			return false;
-		}
-		return super.getStatelessHint();
-	}
-
-	/**
 	 * Processes the component tag.
 	 * 
 	 * @param tag
@@ -197,28 +100,6 @@ public class CheckBox extends FormComponent<Boolean> implements IRequestListener
 		// type="checkbox" value=""] will always submit as false
 		tag.remove("value");
 
-		// Should a roundtrip be made (have onSelectionChanged called) when the
-		// checkbox is clicked?
-		if (wantOnSelectionChangedNotifications())
-		{
-			CharSequence url = urlForListener(new PageParameters());
-
-			Form<?> form = findParent(Form.class);
-			if (form != null)
-			{
-				tag.put("onclick", form.getJsForListenerUrl(url));
-			}
-			else
-			{
-				// NOTE: do not encode the url as that would give invalid
-				// JavaScript
-				tag.put("onclick", "window.location.href='" + url +
-					(url.toString().indexOf('?') > -1 ? "&" : "?") + getInputName() +
-					"=' + this.checked;");
-			}
-
-		}
-
 		super.onComponentTag(tag);
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
index ead1823..e05b0d5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
@@ -19,9 +19,7 @@ package org.apache.wicket.markup.html.form;
 import java.util.Collection;
 import java.util.List;
 
-import org.apache.wicket.IRequestListener;
 import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
@@ -60,7 +58,7 @@ import org.slf4j.LoggerFactory;
  * @param <T>
  *            The model object type
  */
-public class CheckGroup<T> extends FormComponent<Collection<T>> implements IRequestListener
+public class CheckGroup<T> extends FormComponent<Collection<T>>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -201,91 +199,4 @@ public class CheckGroup<T> extends FormComponent<Collection<T>> implements IRequ
 		tag.remove("disabled");
 		tag.remove("name");
 	}
-
-	/**
-	 * Called when a selection changes.
-	 */
-	@Override
-	public final void onRequest()
-	{
-		Form<?> form = getForm();
-		if (form == null) {
-			convertInput();
-			updateModel();
-			onSelectionChanged(getModelObject());
-		} else {
-			form.onFormSubmitted(new IFormSubmitter()
-			{
-				@Override
-				public void onSubmit()
-				{
-					convertInput();
-					updateModel();
-					onSelectionChanged(getModelObject());
-				}
-				
-				@Override
-				public void onError()
-				{
-				}
-				
-				@Override
-				public void onAfterSubmit()
-				{
-				}
-				
-				@Override
-				public Form<?> getForm()
-				{
-					return CheckGroup.this.getForm();
-				}
-				
-				@Override
-				public boolean getDefaultFormProcessing()
-				{
-					return false;
-				}
-			});
-		}
-	}
-
-	/**
-	 * Template method that can be overridden to be notified by value changes.
-	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
-	 * this method to being called.
-	 * <p>
-	 * This method does nothing by default.
-	 * 
-	 * @param newSelection
-	 *            The newly selected object of the backing model NOTE this is the same as you would
-	 *            get by calling getModelObject() if the new selection were current
-	 */
-	protected void onSelectionChanged(final Collection<T> newSelection)
-	{
-	}
-
-	/**
-	 * Whether a request should be generated with each selection change, resulting in the
-	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
-	 * being called. This method returns false by default.
-	 * <p>
-	 * Use an {@link AjaxFormChoiceComponentUpdatingBehavior} with <tt>change</tt> event,
-	 * if you want to use Ajax instead.
-	 * 
-	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
-	 */
-	protected boolean wantOnSelectionChangedNotifications()
-	{
-		return false;
-	}
-
-	@Override
-	protected boolean getStatelessHint()
-	{
-		if (wantOnSelectionChangedNotifications())
-		{
-			return false;
-		}
-		return super.getStatelessHint();
-	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
index cee8851..a0bd6c4 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
@@ -18,11 +18,8 @@ package org.apache.wicket.markup.html.form;
 
 import java.util.List;
 
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 
 /**
@@ -52,11 +49,6 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
  * 
  * </p>
  * 
- * <p>
- * You can can extend this class and override method wantOnSelectionChangedNotifications() to force
- * server roundtrips on each selection change.
- * </p>
- * 
  * @author Jonathan Locke
  * @author Eelco Hillenius
  * @author Johan Compagner
@@ -64,7 +56,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
  * @param <T>
  *            The model object type
  */
-public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements IRequestListener
+public class DropDownChoice<T> extends AbstractSingleSelectChoice<T>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -204,53 +196,6 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 	}
 
 	/**
-	 * Called when a selection changes.
-	 */
-	@Override
-	public final void onRequest()
-	{
-		Form<?> form = getForm();
-		if (form == null) {
-			convertInput();
-			updateModel();
-			onSelectionChanged(getModelObject());
-		} else {
-			form.getRootForm().onFormSubmitted(new IFormSubmitter()
-			{
-				@Override
-				public void onSubmit()
-				{
-					convertInput();
-					updateModel();
-					onSelectionChanged(getModelObject());
-				}
-				
-				@Override
-				public void onError()
-				{
-				}
-				
-				@Override
-				public void onAfterSubmit()
-				{
-				}
-				
-				@Override
-				public Form<?> getForm()
-				{
-					return DropDownChoice.this.getForm();
-				}
-				
-				@Override
-				public boolean getDefaultFormProcessing()
-				{
-					return false;
-				}
-			});
-		}
-	}
-
-	/**
 	 * Processes the component tag.
 	 * 
 	 * @param tag
@@ -262,68 +207,6 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 	{
 		checkComponentTag(tag, "select");
 
-		// Should a roundtrip be made (have onSelectionChanged called) when the
-		// selection changed?
-		if (wantOnSelectionChangedNotifications())
-		{
-			CharSequence url = urlForListener(new PageParameters());
-
-			Form<?> form = findParent(Form.class);
-			if (form != null)
-			{
-				tag.put("onchange", form.getJsForListenerUrl(url.toString()));
-			}
-			else
-			{
-				tag.put("onchange", "window.location.href='" + url +
-					(url.toString().indexOf('?') > -1 ? "&" : "?") + getInputName() +
-					"=' + this.options[this.selectedIndex].value;");
-			}
-		}
-
 		super.onComponentTag(tag);
 	}
-
-	/**
-	 * Template method that can be overridden to be notified by value changes.
-	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
-	 * this method to being called.
-	 * <p>
-	 * This method does nothing by default.
-	 * 
-	 * @param newSelection
-	 *            The newly selected object of the backing model NOTE this is the same as you would
-	 *            get by calling getModelObject() if the new selection were current
-	 */
-	protected void onSelectionChanged(final T newSelection)
-	{
-	}
-
-	/**
-	 * Whether a request should be generated with each selection change, resulting in the
-	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
-	 * being called. This method returns false by default.
-	 * <p>
-	 * Use an {@link AjaxFormComponentUpdatingBehavior} with <tt>change</tt> event,
-	 * if you want to use Ajax instead.
-	 * 
-	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
-	 */
-	protected boolean wantOnSelectionChangedNotifications()
-	{
-		return false;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	protected boolean getStatelessHint()
-	{
-		if (wantOnSelectionChangedNotifications())
-		{
-			return false;
-		}
-		return super.getStatelessHint();
-	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
index 1c38c11..df26e56 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
@@ -22,7 +22,6 @@ import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 /**
  * Component representing a single radio choice in a org.apache.wicket.markup.html.form.RadioGroup.
@@ -180,25 +179,6 @@ public class Radio<T> extends LabeledWebMarkupContainer implements IGenericCompo
 			tag.put("checked", "checked");
 		}
 
-		if (group.wantOnSelectionChangedNotifications())
-		{
-			// url that points to this components IOnChangeListener method
-			CharSequence url = group.urlForListener(new PageParameters());
-
-			Form<?> form = group.findParent(Form.class);
-			if (form != null)
-			{
-				tag.put("onclick", form.getJsForListenerUrl(url));
-			}
-			else
-			{
-				// NOTE: do not encode the url as that would give invalid JavaScript
-				tag.put("onclick", "window.location.href='" + url +
-					(url.toString().indexOf('?') > -1 ? "&" : "?") + group.getInputName() +
-					"=' + this.value;");
-			}
-		}
-
 		if (!isEnabledInHierarchy())
 		{
 			tag.put(ATTR_DISABLED, ATTR_DISABLED);

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
index 13b8b33..3994204 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
@@ -19,12 +19,9 @@ package org.apache.wicket.markup.html.form;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.settings.DebugSettings;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.lang.Args;
@@ -56,18 +53,13 @@ import org.apache.wicket.util.value.IValueMap;
  * 
  * </p>
  * 
- * <p>
- * You can extend this class and override method wantOnSelectionChangedNotifications() to force
- * server roundtrips on each selection change.
- * </p>
- * 
  * @author Jonathan Locke
  * @author Igor Vaynberg (ivaynberg)
  * 
  * @param <T>
  *            The model object type
  */
-public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IRequestListener
+public class RadioChoice<T> extends AbstractSingleSelectChoice<T>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -247,96 +239,6 @@ public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IRe
 	}
 
 	/**
-	 * @see org.apache.wicket.markup.html.form.IOnChangeListener#onSelectionChanged()
-	 */
-	@Override
-	public void onRequest()
-	{
-		Form<?> form = getForm();
-		if (form == null) {
-			convertInput();
-			updateModel();
-			onSelectionChanged(getModelObject());
-		} else {
-			form.onFormSubmitted(new IFormSubmitter()
-			{
-				@Override
-				public void onSubmit()
-				{
-					convertInput();
-					updateModel();
-					onSelectionChanged(getModelObject());
-				}
-				
-				@Override
-				public void onError()
-				{
-				}
-				
-				@Override
-				public void onAfterSubmit()
-				{
-				}
-				
-				@Override
-				public Form<?> getForm()
-				{
-					return RadioChoice.this.getForm();
-				}
-				
-				@Override
-				public boolean getDefaultFormProcessing()
-				{
-					return false;
-				}
-			});
-		}
-	}
-
-	/**
-	 * Template method that can be overridden to be notified by value changes.
-	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
-	 * this method to being called.
-	 * <p>
-	 * This method does nothing by default.
-	 * 
-	 * @param newSelection
-	 *            The newly selected object of the backing model NOTE this is the same as you would
-	 *            get by calling getModelObject() if the new selection were current
-	 */
-	protected void onSelectionChanged(T newSelection)
-	{
-	}
-
-	/**
-	 * Whether a request should be generated with each selection change, resulting in the
-	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
-	 * being called. This method returns false by default.
-	 * <p>
-	 * Use an {@link AjaxFormComponentUpdatingBehavior} with <tt>change</tt> event,
-	 * if you want to use Ajax instead.
-	 * 
-	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
-	 */
-	protected boolean wantOnSelectionChangedNotifications()
-	{
-		return false;
-	}
-
-	/**
-	 * @see org.apache.wicket.MarkupContainer#getStatelessHint()
-	 */
-	@Override
-	protected boolean getStatelessHint()
-	{
-		if (wantOnSelectionChangedNotifications())
-		{
-			return false;
-		}
-		return super.getStatelessHint();
-	}
-
-	/**
 	 * @return Prefix to use before choice
 	 */
 	public String getPrefix()
@@ -561,32 +463,6 @@ public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IRe
 				.append(Strings.escapeMarkup(idAttr))
 				.append('"');
 
-			// Should a roundtrip be made (have onSelectionChanged called)
-			// when the option is clicked?
-			if (wantOnSelectionChangedNotifications())
-			{
-				CharSequence url = urlForListener(new PageParameters());
-
-				Form<?> form = findParent(Form.class);
-				if (form != null)
-				{
-					buffer.append(" onclick=\"")
-						.append(form.getJsForListenerUrl(url))
-						.append(";\"");
-				}
-				else
-				{
-					// NOTE: do not encode the url as that would give
-					// invalid JavaScript
-					buffer.append(" onclick=\"window.location.href='")
-						.append(url)
-						.append((url.toString().indexOf('?') > -1 ? '&' : '?') + getInputName())
-						.append('=')
-						.append(Strings.escapeMarkup(id))
-						.append("';\"");
-				}
-			}
-
 			// Allows user to add attributes to the <input..> tag
 			{
 				IValueMap attrs = getAdditionalAttributes(index, choice);

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
index 51778a4..ac5ca4a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
@@ -16,9 +16,7 @@
  */
 package org.apache.wicket.markup.html.form;
 
-import org.apache.wicket.IRequestListener;
 import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
@@ -49,7 +47,7 @@ import org.apache.wicket.util.visit.IVisitor;
  * @param <T>
  *            The model object type
  */
-public class RadioGroup<T> extends FormComponent<T> implements IRequestListener
+public class RadioGroup<T> extends FormComponent<T>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -73,34 +71,6 @@ public class RadioGroup<T> extends FormComponent<T> implements IRequestListener
 		setRenderBodyOnly(true);
 	}
 
-	/**
-	 * Whether a request should be generated with each selection change, resulting in the
-	 * model being updated (of just this component) and {@link #onSelectionChanged(Object)}
-	 * being called. This method returns false by default.
-	 * <p>
-	 * Use an {@link AjaxFormChoiceComponentUpdatingBehavior} with <tt>change</tt> event,
-	 * if you want to use Ajax instead.
-	 * 
-	 * @return returns {@value false} by default, i.e. selection changes do not result in a request
-	 */
-	protected boolean wantOnSelectionChangedNotifications()
-	{
-		return false;
-	}
-
-	/**
-	 * @see org.apache.wicket.MarkupContainer#getStatelessHint()
-	 */
-	@Override
-	protected boolean getStatelessHint()
-	{
-		if (wantOnSelectionChangedNotifications())
-		{
-			return false;
-		}
-		return super.getStatelessHint();
-	}
-
 	@Override
 	protected String getModelValue()
 	{
@@ -174,66 +144,4 @@ public class RadioGroup<T> extends FormComponent<T> implements IRequestListener
 		tag.remove("disabled");
 		tag.remove("name");
 	}
-
-	/**
-	 * Called when a selection changes.
-	 */
-	@Override
-	public final void onRequest()
-	{
-		Form<?> form = getForm();
-		if (form == null) {
-			convertInput();
-			updateModel();
-			onSelectionChanged(getModelObject());
-		} else {
-			form.onFormSubmitted(new IFormSubmitter()
-			{
-				@Override
-				public void onSubmit()
-				{
-					convertInput();
-					updateModel();
-					onSelectionChanged(getModelObject());
-				}
-				
-				@Override
-				public void onError()
-				{
-				}
-				
-				@Override
-				public void onAfterSubmit()
-				{
-				}
-				
-				@Override
-				public Form<?> getForm()
-				{
-					return RadioGroup.this.getForm();
-				}
-				
-				@Override
-				public boolean getDefaultFormProcessing()
-				{
-					return false;
-				}
-			});
-		}
-	}
-
-	/**
-	 * Template method that can be overridden to be notified by value changes.
-	 * {@link #wantOnSelectionChangedNotifications()} has to be overriden to return {@value true} for
-	 * this method to being called.
-	 * <p>
-	 * This method does nothing by default.
-	 * 
-	 * @param newSelection
-	 *            The newly selected object of the backing model NOTE this is the same as you would
-	 *            get by calling getModelObject() if the new selection were current
-	 */
-	protected void onSelectionChanged(final T newSelection)
-	{
-	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
new file mode 100644
index 0000000..8943d12
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/SelectionChangeBehavior.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.markup.html.form;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.IRequestListener;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+public class SelectionChangeBehavior extends Behavior implements IRequestListener
+{
+
+	private FormComponent<?> formComponent;
+
+	@Override
+	public boolean getStatelessHint(Component component)
+	{
+		return false;
+	}
+	
+	@Override
+	public void bind(Component component)
+	{
+		this.formComponent = (FormComponent<?>)component;
+		
+		formComponent.setRenderBodyOnly(false);
+	}
+
+	public FormComponent<?> getFormComponent()
+	{
+		return formComponent;
+	}
+	
+	@Override
+	public void onComponentTag(Component component, ComponentTag tag)
+	{
+		CharSequence url = component.urlForListener(this, new PageParameters());
+
+		String event = getJSEvent();
+		
+		String condition = String.format("if (event.target.name !== '%s') return; ", formComponent.getInputName());
+		
+		Form<?> form = component.findParent(Form.class);
+		if (form != null)
+		{
+			tag.put(event, condition + form.getJsForListenerUrl(url.toString()));
+		}
+		else
+		{
+			char separator = url.toString().indexOf('?') > -1 ? '&' : '?';
+				
+			tag.put(event,
+				condition + String.format("window.location.href='%s%s%s=' + %s;", url, separator, formComponent.getInputName(), getJSValue()));
+		}
+	}
+
+	
+	private String getJSEvent()
+	{
+		if (formComponent instanceof DropDownChoice) {
+			return "onchange";
+		} else {
+			return "onclick";
+		}
+	}
+
+	private String getJSValue()
+	{
+		if (formComponent instanceof DropDownChoice) {
+			return "this.options[this.selectedIndex].value";
+		} else if (formComponent instanceof CheckBox) {
+			return "this.checked";
+		} else {
+			return "event.target.value";
+		}
+	}
+
+	private void process() {
+		formComponent.convertInput();
+		formComponent.updateModel();
+		onSelectionChanged();
+	}
+	
+	protected void onSelectionChanged()
+	{
+	}
+
+	@Override
+	public final void onRequest()
+	{
+		Form<?> form = formComponent.findParent(Form.class);
+		if (form == null) {
+			process();
+		} else {
+			form.getRootForm().onFormSubmitted(new IFormSubmitter()
+			{
+				@Override
+				public void onSubmit()
+				{
+					process();
+				}
+				
+				@Override
+				public void onError()
+				{
+				}
+				
+				@Override
+				public void onAfterSubmit()
+				{
+				}
+				
+				@Override
+				public Form<?> getForm()
+				{
+					return formComponent.getForm();
+				}
+				
+				@Override
+				public boolean getDefaultFormProcessing()
+				{
+					return false;
+				}
+			});
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index d7cdf4e..ec7f5aa 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -60,6 +60,7 @@ import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.ajax.markup.html.IAjaxLink;
 import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.core.request.handler.BookmarkableListenerRequestHandler;
 import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
 import org.apache.wicket.core.request.handler.IPageProvider;
@@ -121,7 +122,6 @@ import org.apache.wicket.request.mapper.IRequestMapperDelegate;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.session.ISessionStore.UnboundListener;
 import org.apache.wicket.settings.ApplicationSettings;
 import org.apache.wicket.settings.RequestCycleSettings.RenderStrategy;
 import org.apache.wicket.util.lang.Args;
@@ -1138,6 +1138,29 @@ public class BaseWicketTester
 	}
 
 	/**
+	 * Simulates invoking an {@link IRequestListener} on a component. As opposed to the
+	 * {@link #executeListener(Component)} method, current request/response objects will be used
+	 * 
+	 * After the listener is invoked the page containing the component will be rendered
+	 * (with an optional redirect - depending on {@link RenderStrategy}).
+	 * 
+	 * @param component
+	 * @param listener
+	 */
+	public void invokeListener(Component component, final Behavior behavior)
+	{
+		Args.notNull(component, "component");
+		Args.notNull(behavior, "behavior");
+
+		// there are two ways to do this. RequestCycle could be forced to call the handler
+		// directly but constructing and parsing the URL increases the chance of triggering bugs
+		IRequestHandler handler = new ListenerRequestHandler(new PageAndComponentProvider(
+			component.getPage(), component), component.getBehaviorId(behavior));
+
+		processRequest(handler);
+	}
+
+	/**
 	 * Builds and processes a request suitable for executing an <code>AbstractAjaxBehavior</code>.
 	 * 
 	 * @param behavior

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
index 8bb2760..31448d9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
@@ -38,6 +38,7 @@ import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
 import org.apache.wicket.markup.html.form.ListMultipleChoice;
 import org.apache.wicket.markup.html.form.Radio;
 import org.apache.wicket.markup.html.form.RadioGroup;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.form.upload.FileUploadField;
 import org.apache.wicket.markup.html.form.upload.MultiFileUploadField;
 import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
@@ -505,29 +506,9 @@ public class FormTester
 		ChoiceSelector choiceSelector = choiceSelectorFactory.create(component);
 		choiceSelector.doSelect(index);
 
-		try
-		{
-			Method wantOnSelectionChangedNotificationsMethod = component.getClass()
-				.getDeclaredMethod("wantOnSelectionChangedNotifications");
-
-			try
-			{
-				wantOnSelectionChangedNotificationsMethod.setAccessible(true);
-				boolean wantOnSelectionChangedNotifications = (Boolean)wantOnSelectionChangedNotificationsMethod.invoke(component);
-				if (wantOnSelectionChangedNotifications)
-				{
-					tester.invokeListener(component);
-				}
-			}
-			catch (final Exception x)
-			{
-				throw new RuntimeException(x);
-			}
-
-		}
-		catch (final NoSuchMethodException ignored)
-		{
-			// this form component has no auto page reload mechanism
+		List<SelectionChangeBehavior> behaviors = component.getBehaviors(SelectionChangeBehavior.class);
+		if (behaviors.isEmpty() == false) {
+			tester.invokeListener(component, behaviors.get(0));
 		}
 
 		return this;

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java b/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
index 75cdb92..4b8e706 100644
--- a/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
+++ b/wicket-core/src/test/java/org/apache/wicket/MockPageWithForm.java
@@ -22,6 +22,7 @@ import java.util.List;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.model.Model;
 
 
@@ -60,26 +61,14 @@ public class MockPageWithForm extends WebPage
 		List<String> list = new ArrayList<String>();
 		list.add("Select me");
 		MyForm form = new MyForm("form");
-		DropDownChoice<String> dropDown = new DropDownChoice<String>("dropdown",
-			new Model<String>(), list)
-		{
-			private static final long serialVersionUID = 1L;
-
+		DropDownChoice<String> dropDown = new DropDownChoice<String>("dropdown", new Model<String>(), list);
+		dropDown.add(new SelectionChangeBehavior() {
 			@Override
-			protected void onSelectionChanged(String newSelection)
+			protected void onSelectionChanged()
 			{
 				selected = true;
 			}
-
-			/**
-			 * @see org.apache.wicket.markup.html.form.DropDownChoice#wantOnSelectionChangedNotifications()
-			 */
-			@Override
-			protected boolean wantOnSelectionChangedNotifications()
-			{
-				return true;
-			}
-		};
+		});
 
 
 		form.add(dropDown);

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
index 7500653..945e46e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
@@ -28,6 +28,7 @@ import org.apache.wicket.markup.IMarkupResourceStreamProvider;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.form.upload.FileUpload;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -264,20 +265,13 @@ public class FormTesterTest extends WicketTestCase
 				Form<Object> form = new Form<>("form");
 				add(form);
 				List<String> choices = Arrays.asList("opt 1", "opt 2");
-				form.add(new DropDownChoice<String>("selector", Model.of(""), choices)
-				{
+				form.add(new DropDownChoice<String>("selector", Model.of(""), choices).add(new SelectionChangeBehavior() {
 					@Override
-					protected boolean wantOnSelectionChangedNotifications()
+					protected void onSelectionChanged()
 					{
-						return true;
+						selection = (String)getFormComponent().getDefaultModelObject();
 					}
-
-					@Override
-					protected void onSelectionChanged(final String newSelection)
-					{
-						selection = newSelection;
-					}
-				});
+				}));
 			}
 
 			@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
index da0d26d..43f4067 100644
--- a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
+++ b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1.java
@@ -31,6 +31,7 @@ import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
@@ -109,6 +110,8 @@ public class DatesPage1 extends WebPage
 			});
 			setChoiceRenderer(new LocaleChoiceRenderer());
 			setDefaultModel(new PropertyModel<>(DatesPage1.this, "selectedLocale"));
+			
+			add(new SelectionChangeBehavior());
 		}
 
 		@Override
@@ -116,23 +119,6 @@ public class DatesPage1 extends WebPage
 		{
 			return super.getModelValue();
 		}
-
-		/**
-		 * @see org.apache.wicket.markup.html.form.DropDownChoice#onSelectionChanged(java.lang.Object)
-		 */
-		@Override
-		public void onSelectionChanged(Locale newSelection)
-		{
-		}
-
-		/**
-		 * @see org.apache.wicket.markup.html.form.DropDownChoice#wantOnSelectionChangedNotifications()
-		 */
-		@Override
-		protected boolean wantOnSelectionChangedNotifications()
-		{
-			return true;
-		}
 	}
 
 	private static final Locale LOCALE_EN = new Locale("en");

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
----------------------------------------------------------------------
diff --git a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
index d365128..9bc873a 100644
--- a/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
+++ b/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage1_ExpectedResult.html
@@ -106,7 +106,7 @@ Wicket.Event.publish(Wicket.Event.Topic.AJAX_HANDLERS_BOUND);
 </head>
 <body>
 <form wicket:id="localeForm" id="localeForm2" method="post" action="./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-localeForm">
-<p><select wicket:id="localeSelect" onchange="var f = document.getElementById(&#039;localeForm2&#039;); f.action=&#039;./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.-localeForm-localeSelect&#039;;f.submit();" name="localeSelect">
+<p><select wicket:id="localeSelect" name="localeSelect" onchange="if (event.target.name !== &#039;localeSelect&#039;) return; var f = document.getElementById(&#039;localeForm2&#039;); f.action=&#039;./org.apache.wicket.extensions.yui.calendar.DatesPage1?0-1.0-localeForm-localeSelect&#039;;f.submit();">
 <option value="0">cinese (Cina) (Chinese (China))</option>
 <option value="1">cinese (Cina) (Chinese (China))</option>
 <option value="2">cinese (Cina) (Chinese (China))</option>

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
index b10bf3f..260a2c7 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.html
@@ -14,13 +14,11 @@
 	A CheckBoxGroup and CheckBoxComponnet components let users select multiple values from a group of checkboxes. These components are more flexible then the CheckBoxMultipleChoice component in that individual checkboxes are full components, unlike with CheckBoxMultipleChoice, and thus can be used anywhere in the markup.
 	</p>
 	<p>
-	 <form wicket:id="form">
 		<span wicket:id="group">
 			<table style="border: 2px dotted #fc0; width: 400px; padding: 5px;">
 			 <tr>
 			  <td valign="top">Select persons</td>
 			  <td>
-				  <input type="checkbox" wicket:id="groupselector">check/uncheck all</input><br/>
 				  <table cellspacing="0" cellpadding="2">
 					<tr>
 						<td><b>Select</b></td>
@@ -44,7 +42,6 @@
 			 </tr>
 			</table>
 		</span>
-	 </form>
 	 <span wicket:id="feedback">feedbackmessages will be put here</span>
 	</p>
     <span wicket:id="explainPanel">panel contents come here</span>

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
index 738920e..12c99fb 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/compref/CheckGroupPage.java
@@ -24,6 +24,7 @@ import org.apache.wicket.markup.html.form.Check;
 import org.apache.wicket.markup.html.form.CheckGroup;
 import org.apache.wicket.markup.html.form.CheckGroupSelector;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
@@ -43,18 +44,9 @@ public class CheckGroupPage extends WicketExamplePage
 	public CheckGroupPage()
 	{
 		final CheckGroup<Person> group = new CheckGroup<>("group", new ArrayList<Person>());
-		Form<Void> form = new Form<Void>("form")
-		{
-			@Override
-			protected void onSubmit()
-			{
-				info("selected person(s): " + group.getDefaultModelObjectAsString());
-			}
-		};
+		group.add(new SelectionChangeBehavior());
 
-		add(form);
-		form.add(group);
-		group.add(new CheckGroupSelector("groupselector"));
+		add(group);
 		ListView<Person> persons = new ListView<Person>("persons",
 			ComponentReferenceApplication.getPersons())
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
index 73d9b44..eaaaed2 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/dates/DatesPage.java
@@ -34,6 +34,7 @@ import org.apache.wicket.extensions.yui.calendar.TimeField;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.IModel;
@@ -100,17 +101,8 @@ public class DatesPage extends WicketExamplePage
 			});
 			setChoiceRenderer(new LocaleChoiceRenderer());
 			setDefaultModel(new PropertyModel<>(DatesPage.this, "selectedLocale"));
-		}
-
-		@Override
-		public void onSelectionChanged(Locale newSelection)
-		{
-		}
-
-		@Override
-		protected boolean wantOnSelectionChangedNotifications()
-		{
-			return true;
+			
+			add(new SelectionChangeBehavior());
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java b/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
index 8e3fb4b..ecc3414 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/forminput/FormInput.java
@@ -35,6 +35,7 @@ import org.apache.wicket.markup.html.form.ListMultipleChoice;
 import org.apache.wicket.markup.html.form.Radio;
 import org.apache.wicket.markup.html.form.RadioChoice;
 import org.apache.wicket.markup.html.form.RadioGroup;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.form.SimpleFormComponentLabel;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.link.Link;
@@ -248,29 +249,21 @@ public class FormInput extends WicketExamplePage
 			// set the model that gets the current locale, and that is used for
 			// updating the current locale to property 'locale' of FormInput
 			setModel(new PropertyModel<>(FormInput.this, "locale"));
-		}
-
-		@Override
-		public void onSelectionChanged(Locale newSelection)
-		{
-			// note that we don't have to do anything here, as our property
-			// model already calls FormInput.setLocale when the model is
-			// updated
-
-			// force re-render by setting the page to render to the bookmarkable
-			// instance, so that the page will be rendered from scratch,
-			// re-evaluating the input patterns etc
-			setResponsePage(FormInput.class);
-		}
+			
+			add(new SelectionChangeBehavior() {
+				@Override
+				protected void onSelectionChanged()
+				{
+					// note that we don't have to do anything here, as our property
+					// model already calls FormInput.setLocale when the model is
+					// updated
 
-		/**
-		 * @see org.apache.wicket.markup.html.form.DropDownChoice#wantOnSelectionChangedNotifications()
-		 */
-		@Override
-		protected boolean wantOnSelectionChangedNotifications()
-		{
-			// we want round-trips when a the user selects another item
-			return true;
+					// force re-render by setting the page to render to the bookmarkable
+					// instance, so that the page will be rendered from scratch,
+					// re-evaluating the input patterns etc
+					setResponsePage(FormInput.class);
+				}
+			});
 		}
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/e2af7563/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
index b33b075..4522885 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/tree/AdvancedTreePage.java
@@ -43,6 +43,7 @@ import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.ChoiceRenderer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.SelectionChangeBehavior;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.PropertyModel;
@@ -97,28 +98,10 @@ public abstract class AdvancedTreePage extends AbstractTreePage
 		form.add(tree);
 
 		form.add(new DropDownChoice<Content>("content", new PropertyModel<>(this, "content"),
-			initContents(), new ChoiceRenderer<>("class.simpleName"))
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected boolean wantOnSelectionChangedNotifications()
-			{
-				return true;
-			}
-		});
+			initContents(), new ChoiceRenderer<>("class.simpleName")).add(new SelectionChangeBehavior()));
 
 		form.add(new DropDownChoice<Behavior>("theme", new PropertyModel<>(this, "theme"),
-			initThemes(), new ChoiceRenderer<>("class.simpleName"))
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected boolean wantOnSelectionChangedNotifications()
-			{
-				return true;
-			}
-		});
+			initThemes(), new ChoiceRenderer<>("class.simpleName")).add(new SelectionChangeBehavior()));
 
 		form.add(new Link<Void>("expandAll")
 		{