使用JSF显示只读表单(值显示为文本而不是禁用的输入控件)?

使用JSF显示只读表单(值显示为文本而不是禁用的输入控件)?,jsf,uiview,readonly,Jsf,Uiview,Readonly,我有一个数据输入表单,用户在其中输入大量数据。当用户来到页面查看现有数据时,页面应以只读模式显示(所有值均显示为文本),当用户单击“编辑”按钮时,应显示带有所有输入控件的正常表单,以便用户可以更改和保存数据 我们将JSF2.0与PrimeFaces库一起使用。对于文本框和文本区域,很容易实现上述行为,但对于复选框、多选、单选等,则很难实现,。。。。。控制。有没有什么简单的方法可以实现上述行为,而不是编写我们自己的代码(这可能会运行到很多行中,从而使后台bean代码变得丑陋) 感谢您的帮助……我在

我有一个数据输入表单,用户在其中输入大量数据。当用户来到页面查看现有数据时,页面应以只读模式显示(所有值均显示为文本),当用户单击“编辑”按钮时,应显示带有所有输入控件的正常表单,以便用户可以更改和保存数据

我们将JSF2.0与PrimeFaces库一起使用。对于文本框和文本区域,很容易实现上述行为,但对于复选框、多选、单选等,则很难实现,。。。。。控制。有没有什么简单的方法可以实现上述行为,而不是编写我们自己的代码(这可能会运行到很多行中,从而使后台bean代码变得丑陋)


感谢您的帮助……

我在上一个项目中使用了具有“预览”属性的复合组件,在实现中,当该属性为true时,我渲染文本,当该属性为false时,我渲染真实(编辑)。对于预览模式下的复选框,您可以显示复选框本身,但已禁用;对于收音机-显示所选项目

MyFaces Tomahawk库[1]包含标准组件的扩展版本,该扩展版本为此目的添加了displayValueOnly属性。这可能对你有帮助(我没有用过)


[1] -

我在上一个项目中使用了具有“预览”属性的复合组件,在实现中,当该属性为true时,我渲染文本,当属性为false时,我渲染真实(编辑)。对于预览模式下的复选框,您可以显示复选框本身,但已禁用;对于收音机-显示所选项目

MyFaces Tomahawk库[1]包含标准组件的扩展版本,该扩展版本为此目的添加了displayValueOnly属性。这可能对你有帮助(我没有用过)


[1] -

我不知道您为什么认为需要额外的支持bean代码来实现这一点。您已经在支持bean中获得了所有需要的值。你的问题更多地表现在这些价值观上。只需通过相应地编写视图代码,以所需的格式显示它们。也许你认为这太难了

例如,您可以显示“是”或“否”值,而不是“选择布尔”复选框


您可以在输出文本中显示值,而不是选择一个菜单/收音机

<h:selectOneMenu value="#{bean.selectedItem}" rendered="#{bean.edit}">
    <f:selectItems value="#{data.availableItems}" />
</h:selectOneMenu>
<h:outputText value="#{bean.selectedItem}" rendered="#{not bean.edit}" />

例如,您可以在循环中显示以逗号分隔的所有值,而不是选择多个列表框/复选框

<h:selectManyListbox value="#{bean.selectedItems}" rendered="#{bean.edit}">
    <f:selectItems value="#{data.availableItems}" />
</h:selectManyListbox>
<h:panelGroup rendered="#{not bean.edit}">
    <ui:repeat value="#{bean.selectedItems}" var="selectedItem" varStatus="loop">
        #{selectedItem}#{not loop.last ? ', ' : ''}
    </ui:repeat>
</h:panelGroup>

#{selectedItem}{not loop.last?',':'}

您可以将其全部封装在标记文件或复合文件中,以最大限度地减少样板文件和代码重复。

我不确定您为什么认为需要额外的支持bean代码。您已经在支持bean中获得了所有需要的值。你的问题更多地表现在这些价值观上。只需通过相应地编写视图代码,以所需的格式显示它们。也许你认为这太难了

例如,您可以显示“是”或“否”值,而不是“选择布尔”复选框


您可以在输出文本中显示值,而不是选择一个菜单/收音机

<h:selectOneMenu value="#{bean.selectedItem}" rendered="#{bean.edit}">
    <f:selectItems value="#{data.availableItems}" />
</h:selectOneMenu>
<h:outputText value="#{bean.selectedItem}" rendered="#{not bean.edit}" />

例如,您可以在循环中显示以逗号分隔的所有值,而不是选择多个列表框/复选框

<h:selectManyListbox value="#{bean.selectedItems}" rendered="#{bean.edit}">
    <f:selectItems value="#{data.availableItems}" />
</h:selectManyListbox>
<h:panelGroup rendered="#{not bean.edit}">
    <ui:repeat value="#{bean.selectedItems}" var="selectedItem" varStatus="loop">
        #{selectedItem}#{not loop.last ? ', ' : ''}
    </ui:repeat>
</h:panelGroup>

#{selectedItem}{not loop.last?',':'}

您可以将其全部包装在标记文件或复合文件中,以最大限度地减少样板文件和代码重复。

当控件的标签不等于其值时,它就不是那么直接了。例如,对于“选择布尔”复选框,向用户显示的值是“男性”和“女性”。选择时,“M”或“F”将根据用户的选择存储在数据库中。在这种情况下,在视图模式下,要显示“男性”或“女性”,必须编写额外的支持bean代码,以将数据库值转换为用户可呈现的文本。其他控制措施也会出现同样的问题。对于上述方法,控件的标签必须等于value,这在大多数情况下是不可能的。如果我遗漏了什么,请告诉我。这些值已经存在于
后面的数据中。只需访问并相应地打印即可。将来只需像在注释中那样直截了当地问一个问题。当控件的标签不等于其值时,就不是那么直截了当了。例如,对于“选择布尔”复选框,向用户显示的值是“男性”和“女性”。选择时,“M”或“F”将根据用户的选择存储在数据库中。在这种情况下,在视图模式下,要显示“男性”或“女性”,必须编写额外的支持bean代码,以将数据库值转换为用户可呈现的文本。其他控制措施也会出现同样的问题。对于上述方法,控件的标签必须等于value,这在大多数情况下是不可能的。如果我遗漏了什么,请告诉我。这些值已经存在于
后面的数据中。只需访问并相应地打印即可。将来,你只需像在评论中那样直截了当地问一个问题。