有条件地将页面中的所有JSF组件加载为文本

时间:2012-03-01 08:41:03

标签: jsf-2 facelets

我的JSF2(带Facelets)应用程序需要在ReadOnly / Editable模式下打开许多页面。以下是所需的确切行为:

  1. 当所有页面组件都首次以ReadOnly模式加载页面 显示为文本。
  2. 用户点击“编辑”按钮,以“可编辑”模式打开页面。
  3. 在可编辑模式下,所有组件都可见且可以操作。
  4. 用户进行更改并点击“保存”,以“只读”模式加载页面(即所有文本,不包含任何组件)。
  5. 如果我在页面上有TextArea,在ReadOnly模式下我不想让它被禁用/ readOnly,我想要一个outputText。在可编辑模式下,它应该表现为TextArea。

    考虑到我需要在应用程序中的多个页面上执行此行为,这将是一种合适的方法。

    我应该编写两个组件(textArea和outputText)并操纵它们的渲染属性来显示一个。

    是否有可能以某种方式控制JSF上元素的行为并渲染文本而不是组件本身(可能通过编写自定义渲染器)?

    非常感谢您的投入。

2 个答案:

答案 0 :(得分:1)

感谢大家的投入...... :-) 嗨找到了一种让它以不同方式工作的方法。我必须写下以下内容:

  1. 自定义标记:此TAG内的所有元素都具有读/写行为
  2. 自定义渲染器:如果它们属于自定义标记,则会在页面上呈现所有文本框,下拉列表等。
  3. 这是我的XHTML

        <rw:readWrite readOnlyOn="#{!rwBean.editMode}">
            <h:panelGrid columns="2">
                <h:outputLabel value="Booking Center P" />
                <h:selectOneMenu id="bookingCentre" value="#{rwBean.bookingCenter}">
                    <f:selectItems value="#{rwBean.bookingCenterList}" />
                </h:selectOneMenu>
    
                <h:outputLabel value="Account Number 1" />
                <h:inputText id="accountNumber1" value="987654" maxlength="7" />
            </h:panelGrid>
        </rw:readWrite>
    

    根据属性“readOnlyOn”的值,我的自定义标记会在其每个子组件中设置一个属性。 我的自定义渲染器会检查标记上此属性的值,并有条件地呈现标记本身或其“值”属性。

    我已经为所有JSF和PrimeFaces标签实现了这个,它似乎对我有用。

答案 1 :(得分:0)

您可以创建复合组件或标记文件,以便最终得到这样的结果:

<my:inputTextArea editable="#{bean.editable}" />

基本上包含复合组件的

<h:inputTextArea rendered="#{cc.attrs.editable}" />
<h:outputText rendered="#{!cc.attrs.editable}" />

或标签文件

<c:choose>
    <c:when test="#{editable}"><h:inputTextArea /></c:when>
    <c:otherwise><h:outputText /></c:otherwise>
</c:choose>