JSF 2.0: используйте Перечислимые значения для selectOneMenu [дубликат]

Самый простой путь - для пользовательских плагинов групп потоков , например:

  1. Ultimate Thread Group

    enter image description here

  2. Группа степпингов

    enter image description here [115 ]

Вы можете установить эти группы потоков как часть пакета Custom Thread Groups, используя JMeter Plugins Manager

enter image description here [ 1113]

В качестве альтернативы вы также можете использовать Таймеры для введения логики замедления, однако это будет в основном зависеть от времени отклика вашего приложения

enter image description here

Подробнее о вышеперечисленных подходах: Как снизить скорость в JMeter

27
задан skaffman 19 August 2010 в 08:59
поделиться

3 ответа

Хорошо, вот последний способ: - Зарегистрируйте стандартный преобразователь перечисления в faces-config.xml (необязательно):

<converter>
  <converter-for-class>java.lang.Enum</converter-for-class>
  <converter-class>javax.faces.convert.EnumConverter</converter-class>
</converter>

Добавьте функцию, например, в управляемый компонент, который преобразует значения Enum в массив SelectItems:

@ManagedBean
public class GenderBean {
  public SelectItem[] getGenderValues() {
    SelectItem[] items = new SelectItem[Gender.values().length];
    int i = 0;
    for(Gender g: Gender.values()) {
      items[i++] = new SelectItem(g, g.getLabel());
    }
    return items;
  }
}

Затем привяжите эту функцию к selectOneMenu в JSF:

<h:selectOneMenu id="gender" value="#{person.gender}">
  <!-- use property name not method name -->
  <f:selectItems value="#{genderBean.genderValues}" />
</h:selectOneMenu>

Вот и все! Не первое объяснение этой проблемы в сети. Но я думаю, что это самый простой и самый короткий;)

48
ответ дан 28 November 2019 в 04:21
поделиться

Я столкнулся с этой проблемой некоторое время назад и решил ее так же, как и вы, но потом я понял, что с этим решением я не смог использовать i18n, потому что строки были жестко закодированы в классе enum. Поэтому я изменил свой enumConverter, чтобы использовать messages для рендеринга.

Также иногда вы можете захотеть отобразить перечисление как некоторый уникальный идентификатор, а не как читаемый пользователем текст (для внутреннего использования внутри некоторых компонентов).

Это мой конвертер:

import java.util.ResourceBundle;

/*
 * 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.
 */




import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

import com.eyeprevent.configuration.ConfigurationReader;


/**
 * converts an enum in a way that makes the conversion reversible (sometimes)
 * <ul>
 * <li>input: uses its classname and ordinal, reversible<li>
 * <li>else: uses its name, non reversible<li>
 * </ul>
 */
public class EnumConverter implements Converter
{
    @SuppressWarnings("unchecked")
    public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException
    {
        if (value == null || value.length() < 1)
        {
            return null;
        }

        int pos = value.indexOf('@');
        if (pos < 0)
        {
            throw new IllegalArgumentException(value + " do not point to an enum");
        }

        String className = value.substring(0, pos);
        Class clazz;
        int ordinal = Integer.parseInt(value.substring(pos+1), 10);

        try
        {
            clazz = Class.forName( className, true, Thread.currentThread().getContextClassLoader() );
            // if the clazz is not an enum it might be an enum which is inherited. In this case try to find the superclass.
            while (clazz != null && !clazz.isEnum())
            {
                clazz = clazz.getSuperclass();
            }
            if (clazz == null)
            {
                throw new IllegalArgumentException("class " + className + " couldn't be treated as enum");
            }

            Enum[] enums = (Enum[]) clazz.getEnumConstants();
            if (enums.length >= ordinal)
            {
                return enums[ordinal];
            }
        }
        catch (ClassNotFoundException e1)
        {
            throw new RuntimeException(e1);
        }

        throw new IllegalArgumentException("ordinal " + ordinal + " not found in enum " + clazz);
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException
    {
        if (value == null)
        {
            return "";
        }

        Enum<?> e = (Enum<?>) value;

        if (component instanceof UIInput || UIInput.COMPONENT_FAMILY.equals(component.getFamily()))
        {
            return e.getClass().getName() + "@" + Integer.toString(e.ordinal(), 10);
        }
        ResourceBundle messages =ConfigurationReader.getMessages(context.getViewRoot().getLocale());
        return messages.getString(e.name());

    }
}
4
ответ дан pakore 28 November 2019 в 04:21
поделиться

Посмотрев минуту на свой собственный пример Seam, я создал метод в managed bean вот так :

@ManagedBean
public class MyManagedBean {
  public Gender[] getGenderValues() {
    return Gender.values;
  }
}   

И в своей разметке я поставил

<h:selectOneMenu id="gender" value="#{person.gender}">
  <f:selectItems value="#{myManagedBean.genderValues}" var="g" 
    itemValue="#{g}" itemLabel="#{g.label}"/>
</h:selectOneMenu>

Теперь мне нужно посмотреть, правильно ли enum сохраняется в моей сущности при отправке формы. Я посмотрю, смогу ли я сделать это сам - в любом случае, я был бы признателен за советы или лучшие практики по этому вопросу!

21
ответ дан 28 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: