| |
| |
| With class @org.apache.wicket.behavior.Behavior@ Wicket provides a very flexible mechanism to share common features across different components and to enrich existing components with further functionalities. As the class name suggests, @Behavior@ adds a generic behavior to a component modifying its markup and/or contributing to the header section of the page (@Behavior@ implements the interface @IHeaderContributor@). |
| |
| One or more behaviors can be added to a component with @Component@'s method @add(Behavior...)@, while to remove a behavior we must use method @remove(Behavior)@. |
| |
| Here is a partial list of methods defined inside class @Behavior@ along with a brief description of what they do: |
| |
| * *beforeRender(Component component)*: called when a component is about to be rendered. |
| * *afterRender(Component component)*: called after a component has been rendered. |
| * *onComponentTag(Component component, ComponentTag tag)*: called when component tag is being rendered. |
| * *getStatelessHint(Component component)*: returns if a behavior is stateless or not. |
| * *bind(Component component)*: called after a behavior has been added to a component. |
| * *unbind(Component component)*: called when a behavior has been removed from a component. |
| * *detach(Component component)*: overriding this method a behavior can detach its state before being serialized. |
| * *isEnabled(Component component)*: tells if the current behavior is enabled for a given component. When a behavior is disabled it will be simply ignored and not executed. |
| * *isTemporary(Component component)*: tells component if the current behavior is temporary. A temporary behavior is discarded at the end of the current request (i.e it's executed only once). |
| * *onConfigure(Component component)*: called right after the owner component has been configured. |
| * *onRemove(Component component)*: called when the owner component has been removed from its container. |
| * *renderHead(Component component, IHeaderResponse response)*: overriding this method behaviors can render resources to the header section of the page. |
| |
| For example the following behavior prepends a red asterisk to the tag of a form component if this one is required: |
| |
| {code} |
| public class RedAsteriskBehavior extends Behavior { |
| |
| @Override |
| public void beforeRender(Component component) { |
| Response response = component.getResponse(); |
| StringBuffer asterisktHtml = new StringBuffer(200); |
| |
| if(component instanceof FormComponent |
| && ((FormComponent)component).isRequired()){ |
| asteriskHtml.append(" <b style=\"color:red;font-size:medium\">*</b>"); |
| } |
| response.write(asteriskHtml); |
| } |
| } |
| {code} |
| |
| Since method @beforeRender@ is called before the coupled component is rendered, we can use it to prepend custom markup to component tag. This can be done writing our markup directly to the current Response object, as we did in the example above. |
| |
| Please note that we could achieve the same result overriding component method @onBeforeRender@. However using a behavior we can easily reuse our custom code with any other kind of component without modifying its source code. As general best practice we should always consider to implement a new functionality using a behavior if it can be shared among different kinds of component. |
| |
| Behaviors play also a strategic role in the built-in AJAX support provided by Wicket, as we will see in the next chapter. |