визуализирует элемент таблицы, как этого избежать? - PullRequest
16 голосов
/ 15 сентября 2011

Есть ли способ сообщить JSF, что он НЕ должен отображать элемент <table> при использовании <h:selectOneRadio>? Я не использую таблицы, и в этом случае нет абсолютно никакого смысла.

Любая помощь приветствуется!

Ответы [ 2 ]

20 голосов
/ 15 сентября 2011

JSF 2.3 с атрибутом group

Согласно спецификации JSF 329 Я добавил новый атрибут group к <h:selectOneRadio>, который должен сделать все это гораздо менее утомительным.Все компоненты переключателя, имеющие одинаковое значение group в родительском UIForm, будут сгруппированы друг с другом.Также они не будут отображать никакой разметки, кроме самой радиокнопки и необязательной метки, если выбранный элемент имеет ненулевое значение label.Если имеется, метка появляется сразу после переключателя.

<!-- Just markup them the way you want! -->
<ul>
    <ui:repeat id="items" value="#{bean.items}" var="item">
        <li>
            <h:selectOneRadio group="foo" value="#{bean.selectedItem}">
                <f:selectItem itemValue="#{item}" />
            </h:selectOneRadio>
        </li>
    </ui:repeat>
</ul>

Возможны также следующие сценарии.Если имеется несколько компонентов с одинаковым group, а атрибут value и / или дочерний элемент UISelectItem отсутствуют, он будет ссылаться на компоненты первого компонента группы.

<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
    <f:selectItems value="#{bean.availableItems}" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" />
<h:selectOneRadio group="foo" />

<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
    <f:selectItem itemValue="one" />
    <f:selectItem itemValue="two" />
    <f:selectItem itemValue="three" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" />
<h:selectOneRadio group="foo" />

<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
    <f:selectItem itemValue="one" />
</h:selectOneRadio>
<h:selectOneRadio group="foo">
    <f:selectItem itemValue="two" />
</h:selectOneRadio>
<h:selectOneRadio group="foo">
    <f:selectItem itemValue="three" />
</h:selectOneRadio>

<h:selectOneRadio group="foo" value="#{bean.selectedItem}">
    <f:selectItem itemValue="one" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" value="#{otherBean.selectedItem}">
    <f:selectItem itemValue="two" />
</h:selectOneRadio>
<h:selectOneRadio group="foo" value="#{lastBean.selectedItem}">
    <f:selectItem itemValue="three" />
</h:selectOneRadio>

Будет доступно в Мохарре в соответствии с 2.3.0-m07.

JSF 2.2 со сквозной передачейelements

Если вы уже используете JSF 2.2, используйте его новую функцию passthrough elements / attribtues , посредством которой вы явно устанавливаете атрибут name в качестве атрибута passthrough.Чтобы установить отправленное значение в модели, вам понадобятся только дополнительные <h:inputHidden>.

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:jsf="http://xmlns.jcp.org/jsf"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:a="http://xmlns.jcp.org/jsf/passthrough">

...

<!-- Just markup them the way you want! -->
<ul>
    <ui:repeat id="items" value="#{bean.items}" var="item">
        <li>
            <input type="radio" jsf:id="item" a:name="#{hiddenItem.clientId}"
                value="#{item}" a:checked="#{item eq bean.selectedItem ? 'checked' : null}" />
            <h:outputLabel for="item" value="#{item}" />
        </li>
    </ui:repeat>
</ul>

<!-- This one won't display anything. -->
<h:inputHidden id="selectedItem" binding="#{hiddenItem}" value="#{bean.selectedItem}"
    rendered="#{facesContext.currentPhaseId.ordinal ne 6}" />

Подробное техническое объяснение можно найти в этом блоге: Пользовательский макет с h: selectOneRadio inJSF 2.2 .

PrimeFaces (JSF 2.x)

Если вам случится использовать PrimeFaces , то вы также можете использовать <p:selectOneRadio layout="custom"> с <p:radioButton>.

<html ... xmlns:p="http://primefaces.org/ui">

<!-- This one won't display anything. -->
<p:selectOneRadio id="foo" value="#{bean.selectedFoo}" layout="custom">
    <f:selectItems value="#{bean.availableFoos}" />
</p:selectOneRadio>

<!-- Just markup them the way you want! -->
<ul>
    <li><p:radioButton for="foo" itemIndex="0" /></li>
    <li><p:radioButton for="foo" itemIndex="1" /></li>
    <li><p:radioButton for="foo" itemIndex="2" /></li>
</ul>

Вы также можете циклически перебирать доступные элементы, делать это нужно только во время просматривать время сборки :

<ul>
    <c:forEach items="#{bean.availableFoos}" varStatus="loop">
        <li><p:radioButton for="foo" itemIndex="#{loop.index}" /></li>
    </c:forEach>
</ul>

Томагавк (JSF 1.x или 2.x)

Если вы еще не используете JSF 2.2 или вам не нравится интерфейс PrimeFaces, возьмите Томагавка <t:selectOneRadio>, который отображает тот же простой вывод HTML, что и <h:selectOneRadio>, но поддерживает атрибут layout="spread", так что вы можете расположить элементы на <t:radio> так, как вы хотите.

Например:

<html ... xmlns:t="http://myfaces.apache.org/tomahawk">

<!-- This one won't display anything. -->
<t:selectOneRadio id="foo" value="#{bean.selectedFoo}" layout="spread">
    <f:selectItems value="#{bean.availableFoos}" />
</t:selectOneRadio>

<!-- Just markup them the way you want! -->
<ul>
    <li><t:radio for="foo" index="0" /></li>
    <li><t:radio for="foo" index="1" /></li>
    <li><t:radio for="foo" index="2" /></li>
</ul>

Пользовательский рендер

Предоставить пользовательский Renderer.Это только немного работы.Начните с первой ссылки «См. Также», показанной ниже:

См. Также:

2 голосов
/ 28 апреля 2015

Я не знаю, достаточно ли это для вас, но вот пример обхода.

HTML-код:

<ui:repeat value="#{myBean.valueList}" var="radioValue">
    <input type="radio" name="radioSelection" value="#{radioValue}" checked="#{radioValue == myBean.selectedRadioValue ? 'checked' : ''}">#{radioValue}</input>
</ui:repeat>

бэк-бин:

    private String selectedRadioValue;

    private List<Integer> valueList;

    public MyBean() {
        valueList = new ArrayList<Integer>();
        for (int i = 0; i < 15; i++) {
            valueList.add(i);
        }
    }

    public String getSelectedRadioValue() {
        return selectedRadioValue;
    }

    public List<Integer> getValueList() {
        return valueList;
    }

    public void actionMethod() {
        HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        selectedRadioValue = request.getParameter("radioSelection");
    }

, поскольку вы не можете назначить значение для выбора радиостанции непосредственно в xhtml, вам необходимо получить его из параметров запроса и назначить его вручную в методе действия.

...