2012-03-01 63 views
1

我的JSF2(带有Facelets)应用程序需要在ReadOnly/Editable模式下打开许多页面。以下是所需的确切行为:将文件有条件加载到页面中的所有JSF组件

  1. 当所有页面组件 显示为文本时,页面首次以只读模式加载。
  2. 用户单击编辑按钮以在可编辑模式下打开页面。
  3. 在可编辑模式下,所有组件都可见并且可以被操纵。
  4. 用户进行更改并点击保存,该页面以只读模式(即所有文本和没有组件)加载页面。

如果我在页面上有一个TextArea,在ReadOnly模式下,我不想让它禁用/只读,我想要一个outputText来代替。在可编辑模式下,它应该表现为TextArea。

考虑到我在应用程序中的多个页面上需要这种行为,什么是实现此目的的合适方法。

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

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

非常感谢您的投入。

回答

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> 
1

感谢大家对他们的投入...... :-) H我找到了一种让它以不同方式工作的方法。我不得不写如下:

  1. 自定义标记:所有的元素在此标签内下跌将具有读/写行为
  2. 定制呈现:在页面上这将使所有的文本框,下拉菜单等如果它们属于自定义标签。

这里是我的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标签,它似乎为我工作。

+0

为什么这么过分复杂? – BalusC 2012-03-03 05:46:44

+0

如果我使用你的方法,我将不得不编写许多自定义标签(一个用于inputText,一个用于SelectOne等),但是使用这种方法,我只写了两个类(一个用于组件和一个用于渲染器)。所有组件都将由相同的自定义渲染器渲染,这将有条件地选择渲染组件本身(如果处于读取模式下)或将渲染委托给相应的渲染器(如果处于编辑模式)。 – Ameya 2012-03-06 07:11:15