2

JSF 中的最佳实践是什么,例如在模板中创建一个 main<h:form>并将所有内容放入其中或为每个部分设置几个表单,例如,如果我们在页面上有两个逻辑代码块,我们应该包装这些块以两种不同的形式 ???

4

1 回答 1

3

这是一个过于宽泛的问题,它也与 JSF 无关。这是一个HTML理解和设计的问题。

如果您抽象出所有 JSF 细节,您会发现呈现的组件是纯 HTML <form>。回想一下规范,一种形式是:

包含正常内容、标记、称为控件的特殊元素(复选框、单选按钮、菜单等)以及这些控件上的标签的文档部分。用户通常通过修改表单的控件(输入文本、选择菜单项等)来“完成”表单,然后将表单提交给代理进行处理(例如,提交给 Web 服务器、邮件服务器等)。

所以最终整个表单将被提交到服务器。对于基于组件的框架,如 JSF,组件的绑定值将使用提交的数据填充支持 bean,以防万一没有错误。

但是会提交什么数据呢?表单内的所有数据。因此,如果您有一种全局形式,这意味着将收集所有不相关的信息:例如用户凭据、产品选择、偏好选择等。而且所有这些都将一次性完成。很可能它不会产生所需的功能,但会产生意想不到的结果。

问题是混合了关注:一份表格包含不相关的数据,这些数据并非旨在一起提交。这为我们留下了每个用户交互一个表单,例如用于用户身份验证/注销的表单,用于存储用户偏好的另一种表单,以及用于保留产品选择的另一种表单等。一个全局表单也可能会离开您嵌套表格问题,需要一些时间来解决。

关于放置该表单的位置的选择,也取决于逻辑分离:如果您在每个页面上都有用户登录/注销,则可以将其放置在主模板中。Per-view 表单可能会放在模板客户端中。此外,有时将它们并排放置以区分功能会很方便。

此外,形式可能会改变预期的行为。最后一个例子:用户对产品的选择。考虑两种情况。

第一个:

<h:form>
    <ui:repeat value="#{bean.purchasedProducts}" var="product">
        <h:outputText value=#{product.name}/>
        <h:inputText value=#{product.quantity}/>
        <h:commandButton value="Change"/>
    </h:dataTable>
</h:form>

第二个:

<ui:repeat value="#{bean.purchasedProducts}" var="product">
    <h:form>
        <h:outputText value=#{product.name}/>
        <h:inputText value=#{product.quantity}/>
        <h:commandButton value="Change"/>
    </h:form>
</h:dataTable>

第一个示例将更新所有产品,而第二个示例将仅更新相关产品

最后,没有“最佳实践”或“通用解决方案”。我认为在设计 HTML 文档时最好远离关注点分离。

而且,是的,我投票结束这个问题。

于 2013-05-21T11:40:27.360 回答