import org.apache.wicket.validation.CompoundValidator;
import org.apache.wicket.validation.validator.PatternValidator;
import org.apache.wicket.validation.validator.StringValidator;
public class UsernameValidator extends CompoundValidator<String> {
private static final long serialVersionUID = 1L;
public UsernameValidator() {
add(StringValidator.lengthBetween(6, 15));
add(new PatternValidator("[a-z0-9_-]+"));
}
}
//choices in radio button
private static final List<String> TYPES = Arrays.asList(new String[] { "Shared Host", "VPN", "Dedicated Server" });
RadioChoice<String> hostingType = new RadioChoice<String>("hosting", new PropertyModel<String>(this, "selected"), TYPES);
//Java
import org.apache.wicket.markup.html.form.DropDownChoice;
//choices in dropdown box
private static final List<String> SEARCH_ENGINES = Arrays.asList(new String[] {
"Google", "Bing", "Baidu" });
//variable to hold the selected value from dropdown box,
//and also make "Google" is selected by default
private String selected = "Google";
DropDownChoice<String> listSites = new DropDownChoice<String>(
"sites", new PropertyModel<String>(this, "selected"), SEARCH_ENGINES);
//HTML for dropdown box
<select wicket:id="sites"></select>
To fix it, just override the validateOnNullValue() method like this :
FileUploadField fileUpload = new FileUploadField("fileupload",new Model<FileUpload>());
fileUpload .add(new AbstractValidator() {
public boolean validateOnNullValue(){
return true;
}
protected void onValidate(IValidatable validatable) {
FileUpload fileUpload = (FileUpload) validatable.getValue();
}
protected String resourceKey() {
return "yourErrorKey";
}
});
Now, when no file is selected, and submit button is clicked, validation will be performed.
Yes, you can get the ServletContext class via Wicket’s WebApplication class like this :
import javax.servlet.ServletContext;
import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;
import com.withoutbook.hello.Hello;
public class CustomApplication extends WebApplication {
@Override
public Class<? extends Page> getHomePage() {
ServletContext servletContext = WebApplication.get().getServletContext();
return Hello.class; //return default page
}
}
final CheckBox chk0 = new CheckBox("checkbox0", Model.of(Boolean.TRUE));
final CheckBox chk1 = new CheckBox("checkbox1",
new PropertyModel<Boolean>(this, "checkbox1"));
final CheckBox chk2 = new CheckBox("checkbox2",
new PropertyModel<Boolean>(this, "checkbox2"));
<filter-mapping>
<filter-name>wicket.wicketTest</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/error404</location>
</error-page>
public class WicketApplication extends WebApplication {
@Override
protected void init() {
mount(new QueryStringUrlCodingStrategy("error404",ErrorPage404.class));
}
}
Wicket extension comes with a special “Palette” component, which render two select boxes, and allow user to move items from one select box into another.
//Java
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
final Palette<Hosting> palette = new Palette<Hosting>("palette",
new ListModel<Hosting>(selected),
new CollectionModel<Hosting>(listHosting),
renderer, 10, true);
//HTML
<span wicket:id="palette"></span>
See summary steps to create a custom validator :
@Implements IValidator.
import org.apache.wicket.validation.IValidator;
public class Strong PasswordValidator implements IValidator<String>{
...
}
@Override validate(IValidatable validatable).
public class StrongPasswordValidator implements IValidator<String>{
...
@Override
public void validate(IValidatable<String> validatable) {
//get input from attached component
final String field = validatable.getValue();
}
}
@Attached custom validator to form component.
public class CustomValidatorPage extends WebPage {
public CustomValidatorPage(final PageParameters parameters) {
final PasswordTextField password = new PasswordTextField("password",Model.of(""));
//attached custom validator to password field
password.add(new StrongPasswordValidator());
//...
}
}
//Java
import org.apache.wicket.extensions.markup.html.form.select.Select;
import org.apache.wicket.extensions.markup.html.form.select.SelectOption;
//variable to hold the selected value from dropdown box,
//and also make "jQuery" selected by default
private String selected = "jQuery";
Select languages = new Select("languages", new PropertyModel<String>(this, "selected"));
form.add(languages);
languages.add(new SelectOption<String>("framework1", new Model<String>("Wicket")));
languages.add(new SelectOption<String>("framework2", new Model<String>("Spring MVC")));
languages.add(new SelectOption<String>("framework3", new Model<String>("JSF 2.0")));
languages.add(new SelectOption<String>("Script1", new Model<String>("jQuery")));
languages.add(new SelectOption<String>("Script2", new Model<String>("prototype")));
//HTML for dropdown box
<select wicket:id="languages">
<optgroup label="Frameworks">
<option wicket:id="framework1" >Wicket (1.4.7)</option>
<option wicket:id="framework2" >Spring MVC (3.0)</option>
<option wicket:id="framework3" >JSF (2.0)</option>
</optgroup>
<optgroup label="JavaScript">
<option wicket:id="Script1" >jQuery (1.6.1)</option>
<option wicket:id="Script2" >prototype (1.7)</option>
</optgroup>
</select>
//create a textarea field for address
final TextArea<String> address = new TextArea<String>("address",Model.of(""));
address.setRequired(true);
A web application is a subclass of Application which associates with an instance of WicketServlet to serve pages over the HTTP protocol. This class is intended to be subclassed by framework clients to define a web application.
//Java
import org.apache.wicket.markup.html.form.upload.FileUploadField;
form.setMultiPart(true);
form.add(fileUpload = new FileUploadField("fileUpload"));
//HTML
<input wicket:id="fileUpload" type="file"/>
A Model holds a value for a component to display and/or edit :
create a password field
final PasswordTextField password = new PasswordTextField("password", Model.of(""));
//for properties file
password.setLabel(Model.of("Password"));
There are 2 ways to Create New Wicket Page.
Base class for HTML pages: Webpage Class.
Override Wicket application init() method with this “addComponentInstantiationListener(new SpringComponentInjector(this));“.
File : Wicket application class
package com.withoutbook;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import com.withoutbook.user.SimplePage;
public class WicketApplication extends WebApplication {
@Override
public Class<SimplePage> getHomePage() {
return SimplePage.class; // return default page
}
@Override
protected void init() {
super.init();
addComponentInstantiationListener(new SpringComponentInjector(this));
}
}
Now, you can inject Spring bean into Wicket component via @SpringBean.
final TextField username = new TextField("username",Model.of(""));
username.setRequired(true);
username.add(new Username Validator());
Form<?> form = new Form<Void>("userForm") {
@Override
protected void onSubmit() {
final String usernameValue = username.getModelObject();
PageParameters pageParameters = new PageParameters();
pageParameters.add("username", usernameValue);
setResponsePage(SuccessPage.class, pageParameters);
}
};
// single list choice
private static final List<String> FRUITS = Arrays.asList(new String[] { "Apple", "Orange", "Banana" });
ListChoice<String> listFruits = new ListChoice<String>("fruit", new PropertyModel<String>(this, "selectedFruit"), FRUITS);
listFruits.setMaxRows(5);
//choices in list box
private static final List<String> NUMBERS = Arrays.asList(new String[] {"Number 1", "Number 2", "Number 3", "Number 4", "Number 5", "Number 6" });
//variable to hold the selected multiple values from listbox,
//and make "Number 6" selected as default value
private ArrayList<String> selectedNumber = new ArrayList<String>(
Arrays.asList(new String[] { "Number 6" }));
ListMultipleChoice<String> listNumbers = new ListMultipleChoice<String>(
"number", new Model(selectedNumber), NUMBERS);
//HTML for multiple select listbox
<select wicket:id="number"></select>
private static final List<String> LANGUAGES = Arrays.asList(new String[] {"Java", ".NET", "PHP", "Python", "C/C++" });
// hold the checkbox values
private ArrayList<String> languagesSelect = new ArrayList<String>();
final CheckBoxMultipleChoice<String> listLanguages = new CheckBoxMultipleChoice<String>("languages", new Model(languagesSelect), LANGUAGES);
<dependency>
<groupid>org.apache.wicket</groupid>
<artifactid>wicket</artifactid>
<version>1.4.17</version>
</dependency>
Wicket need SLF4J !
You have to include the slf4j logging implementation, otherwise Wicket will be failed to start.
Wicket need resource filter
Remember to add the resource filter, Wicket puts all files in same package folder, if you didn’t define the resource filter to include everything “<include>*</include>” , “html”, “properties” or other resources files may failed to copy to the correct target folder.