Selendroid является платформой автоматизации тестирования для собственных или гибридных приложений для Android и мобильного Интернета.
Selendroid является платформой автоматизации тестирования, которая прогоняет UI Android исходные и гибридные приложения (приложения) и мобильный Интернет. Тесты записаны с помощью Селена 2 клиента API!
Selendroid может использоваться на эмуляторах и физических устройствах и может быть интегрирован как узел в Сетку Селена для масштабирования и параллельного тестирования.
---------121 тег--------95183----JSF для создания одно-избранного меню.JSF отмечают для создания одно-избранного меню.
A <h:selectOneMenu>
компонент UI JSF, который генерирует HTML <select>
элемент, который позволяет Вам связывать выбранное значение со свойством управляемого компонента.
Можно использовать <f:selectItem>
определить пункты меню, которые сгенерированы как HTML <option>
элементы.
Посмотреть:
<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItem itemValue="foo" itemLabel="Foo label" /> <f:selectItem itemValue="bar" itemLabel="Bar label" /> <f:selectItem itemValue="baz" itemLabel="Baz label" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form>
Модель:
private String selectedItem; // +getter +setter public void submit() { System.out.println("Selected item: " + selectedItem); }
itemValue
то, что будет установлено как свойство управляемого компонента. itemLabel
то, что будет отображено как маркировка опции в UI. Если itemLabel
опущен, затем это примет значение по умолчанию к тому же значению как itemValue
.
Можно предварительно выбрать объект путем предоставления selectedItem
значение в бобе (сообщение) конструктор. Например.
@PostConstruct public void init() { selectedItem = "bar"; }
Это покажет меню с "Маркировкой панели", предварительно выбранной.
Можно использовать <f:selectItems>
отобразить список, который динамично заполняется в отступающем бобе. Можно использовать javax.faces.model.SelectItem
представить пару значения объекта и маркировки.
Посмотреть:
<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.availableItems}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form>
Модель:
private String selectedItem; // +getter +setter private List<SelectItem> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = new ArrayList<SelectItem>(); availableItems.add(new SelectItem("foo", "Foo label")); availableItems.add(new SelectItem("bar", "Bar label")); availableItems.add(new SelectItem("baz", "Baz label")); }
availableItems
может также быть a SelectItem[]
. Если Вы опускаете маркировку объекта и таким образом можете использовать значение объекта и в качестве значения опции и в качестве маркировки опции, то можно также использовать a List<String>
или String[]
вместо этого.
private String selectedItem; // +getter +setter private List<String> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = Arrays.asList("foo", "bar", "baz"); }
A Set
также поддерживается.
private String selectedItem; // +getter +setter private Set<String> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = new LinkedHashSet<String>(Arrays.asList("foo", "bar", "baz")); }
Обратите внимание, что необходимо использовать a LinkedHashSet
поддерживать порядок вставки или a TreeSet
если Вы хотите автоматическую сортировку по значению. A HashSet
по своей природе не заказан.
Можно использовать SelectItemGroup
к объектам группы.
private String selectedItem; // +getter +setter private List<SelectItem> availableItems; // +getter (no setter necessary) @PostConstruct public void init { availableItems = new ArrayList<SelectItem>(); SelectItemGroup group1 = new SelectItemGroup("Group 1"); group1.setSelectItems(new SelectItem[] { new SelectItem("Group 1 Value 1", "Group 1 Label 1"), new SelectItem("Group 1 Value 2", "Group 1 Label 2"), new SelectItem("Group 1 Value 3", "Group 1 Label 3") }); availableItems.add(group1); SelectItemGroup group2 = new SelectItemGroup("Group 2"); group2.setSelectItems(new SelectItem[] { new SelectItem("Group 2 Value 1", "Group 2 Label 1"), new SelectItem("Group 2 Value 2", "Group 2 Label 2"), new SelectItem("Group 2 Value 3", "Group 2 Label 3") }); availableItems.add(group2); }
Вот то, как это похоже в браузере (обратите внимание, что Группа 1 и Группа 2 не можно выбрать):
<f:selectItems>
также поддержки a Map<K, V>
где K
должен быть представлен как маркировка объекта и V
должен быть представлен как значение объекта.
Посмотреть:
<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.availableItems}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form>
Модель:
private String selectedItem; // +getter +setter private Map<String, String> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = new LinkedHashMap<String, String>(); availableItems.put("Foo label", "foo"); availableItems.put("Bar label", "bar"); availableItems.put("Baz label", "baz"); }
Если Вы хотите подкачать K
и V
в стороне представления так, чтобы Вы могли заполнить значения объекта и маркировали наоборот как, следует
@PostConstruct public void init() { availableItems = new LinkedHashMap<String, String>(); availableItems.put("foo", "Foo label"); availableItems.put("bar", "Bar label"); availableItems.put("baz", "Baz Label"); }
Затем сначала необходимо удостовериться, что поддержка сред EL 2.2 (часть Сервлета 3.0, т.е. целевой сервер является Tomcat 7, Glassfish 3, и т.д. и web.xml
объявляется приспосабливают Сервлету 3.0), затем можно выполнить итерации Map#entrySet()
в <f:selectItems>
следующим образом:
<f:selectItems value="#{bean.availableItems.entrySet()}" var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" />
Обратите внимание, что необходимо использовать a LinkedHashMap
поддерживать порядок вставки или a TreeMap
если Вы хотите автоматическую сортировку по ключу карты. A HashMap
по своей природе не заказан.
Начиная с JSF 2.0 можно также использовать a List<Bean>
или Bean[]
вместо этого, где Bean
просто произвольный javabean класс. Предположение, что у Вас есть a Country
боб с два String
свойства code
и name
и Вы хотите сохранить code
как значение выбранного пункта и дисплей name
как маркировка объекта, затем можно использовать var
атрибут <f:selectItems>
без потребности преобразовать его в List<SelectItem>
или SelectItem[]
.
Посмотреть:
<h:form> <h:selectOneMenu value="#{bean.countryCode}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.countries}" var="country" itemValue="#{country.code}" itemLabel="#{country.name}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form>
Модель:
private String countryCode; // +getter +setter private List<Country> countries; // +getter (no setter necessary) @EJB private DataService service; @PostConstruct public void init() { countries = service.getCountries(); // If this is a static list, you'd rather put this // in a separate application scoped bean instead. } public void submit() { System.out.println("Selected country code: " + countryCode); }
От примера в предыдущем разделе можно также установить целое Country
как свойство управляемого компонента. Необходимо было бы только создать преобразователь, который преобразовывает между Country
и String
. Более конкретный пример может быть найден в тех ответах:
Эта страшная ошибка произойдет, когда примерно следующее произойдет под покрытиями JSF во время представления формы:
String submittedValue = request.getParameter(component.getClientId()); Converter converter = component.getConverter(); Object selectedItem = (converter != null) ? converter.getAsObject(context, component, submittedValue) : submittedValue; boolean valid = false; for (Object availableItem : bean.getAvailableItems()) { if (selectedItem.equals(availableItem)) { valid = true; break; } } if (!valid) { throw new ValidatorException("Validation Error: Value is not valid"); }
Вы видите, произойдет, когда выбранный пункт не будет равняться ни одному из доступных объектов. Это может в свою очередь иметь 3 причины:
equals()
метод типа объекта позади объекта отсутствует или поврежденный.null
на getAsObject()
.См. также этот ответ: Ошибка Проверки: Значение не допустимо.
Можно также использовать enum
как доступные объекты и выбранный пункт.
Посмотреть:
<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.availableItems}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form>
Модель:
public enum Option { FOO, BAR, BAZ; } private Option selectedItem; // +getter +setter public void submit() { System.out.println("Selected item: " + selectedItem); } public Option[] getAvailableItems() { return Option.values(); }
См. также этот ответ, как изменить и интернационализировать маркировки объекта: Как использовать перечислимые значения в f:selectItem (s).
Можно использовать JSF 2.0 <f:ajax>
отметьте для динамичного заполнения нижестоящего меню в зависимости от выбранного пункта текущего меню. Вот пример, который делает это для городов стран.
Посмотреть:
<h:selectOneMenu value="#{bean.country}" converter="countryConverter"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.countries}" var="country" itemValue="#{country}" itemLabel="#{country.name}" /> <f:ajax listener="#{bean.loadCities}" render="cities" /> </h:selectOneMenu> <h:selectOneMenu id="cities" value="#{bean.city}" converter="cityConverter"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.cities}" var="city" itemValue="#{city}" itemLabel="#{city.name}" /> </h:selectOneMenu>
Модель в @ViewScoped
боб:
private Country country; // +getter +setter private City city; // +getter +setter private List<Country> countries; // +getter private List<City> cities; // +getter @EJB private DataService service; @PostConstruct public void loadCountries() { countries = service.getCountries(); } public void loadCities() { cities = service.getCities(country); }