AbstractReadonlyModel in wicket Framework
package org.apache.wicket.examples.ajax.builtin;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
imp开发者_如何学编程ort java.util.Map;
import java.util.Set;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
/**
* Linked select boxes example
*
* @author Igor Vaynberg (ivaynberg)
*/
public class ChoicePage extends BasePage
{
private String selectedMake;
private final Map<String, List<String>> modelsMap = new HashMap<String, List<String>>(); // map:company->model
/**
* @return Currently selected make
*/
public String getSelectedMake()
{
return selectedMake;
}
/**
* @param selectedMake
* The make that is currently selected
*/
public void setSelectedMake(String selectedMake)
{
this.selectedMake = selectedMake;
}
/**
* Constructor.
*/
public ChoicePage()
{
modelsMap.put("AUDI", Arrays.asList(new String[] { "A4", "A6", "TT" }));
modelsMap.put("CADILLAC", Arrays.asList(new String[] { "CTS", "DTS", "ESCALADE", "SRX",
"DEVILLE" }));
modelsMap.put("FORD", Arrays.asList(new String[] { "CROWN", "ESCAPE", "EXPEDITION",
"EXPLORER", "F-150" }));
IModel<List<? extends String>> makeChoices = new AbstractReadOnlyModel<List<? extends String>>()
{
@Override
public List<String> getObject()
{
Set<String> keys = modelsMap.keySet();
List<String> list = new ArrayList<String>(keys);
return list;
}
};
IModel<List<? extends String>> modelChoices = new AbstractReadOnlyModel<List<? extends String>>()
{
@Override
public List<String> getObject()
{
List<String> models = modelsMap.get(selectedMake);
if (models == null)
{
models = Collections.emptyList();
}
return models;
}
};
Form<?> form = new Form("form");
add(form);
final DropDownChoice<String> makes = new DropDownChoice<String>("makes",
new PropertyModel<String>(this, "selectedMake"), makeChoices);
final DropDownChoice<String> models = new DropDownChoice<String>("models",
new Model<String>(), modelChoices);
models.setOutputMarkupId(true);
form.add(makes);
form.add(models);
makes.add(new AjaxFormComponentUpdatingBehavior("onchange")
{
@Override
protected void onUpdate(AjaxRequestTarget target)
{
target.addComponent(models);
}
});
}
}
What is the use two AbstractReadonlyModel here?i couldnt understand the logic of this program.can anybody plz help to understand this one
These AbstractReadOnlyModels
are used, because their content must not be changed.
The first model provides a list of car brands, which may be selected via a dropdownlist. The second model returns dependent on the selected brand a list of car types, which is selectable via another dropdownlist.
Here it wouldn't make sense to alter the list of brands or car types.
You are referring to this wicket example.
Each DropDownChoice
needs its own model with the data to show its choices.
The first AbstractReadOnlyModel
simply takes the keys of the Map modelsMap
as its data.
The second one uses an Array-List based on the choice of the first dropdown-selection.
精彩评论