<h:selectOneRadio>渲染表格元素,如何避免这种情况?

问题描述 投票:0回答:2

有没有办法告诉 JSF 在使用

<table>
时不应该渲染
<h:selectOneRadio>
元素? 我不使用表格,在这种情况下它完全没有意义。

如有任何帮助,我们将不胜感激!

jsf html-table selectoneradio
2个回答
27
投票

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 在 Mojarra 中提供。

带有直通元素的 JSF 2.2

如果您已经使用 JSF 2.2,请利用其新的 passthrough elements/attributues 功能,您可以将

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}" />

深入的技术解释可以在此博客中找到:在 JSF 2.2 中使用 h:selectOneRadio 自定义布局

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>

您还可以循环遍历可用的项目,您只需要在 view build time:

期间执行此操作
<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 UI,请使用 Tomahawk 的

<t:selectOneRadio>
,它呈现与
<h:selectOneRadio>
相同的纯 HTML 输出,但支持
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
投票

我不知道这对您来说是否足够合理,但是,这是一个示例解决方法。

xhtml代码:

<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 上为单选选项分配值,因此您需要从请求参数中获取它并在操作方法中手动分配它。

© www.soinside.com 2019 - 2024. All rights reserved.