ajax - 在 ajax 表单提交后保留 bean 属性

标签 ajax jsf primefaces

我有一个 @ViewScoped @ManagedBean 创建一个唯一的 ID。此 ID 以如下形式呈现:

<h:form> 
   <h:outputText value="#{myBean.uid}" id="uid"/>
   <h:hiddenInput value="#{myBean.uid}" id="hiddenId" />  
   ....
  <p:commandButton actionListener="#{myBean.create}" ajax="true" update="@form" value="Create" /> 
</h:form>

到目前为止一切顺利。在第一次请求时,页面被正确呈现。提交表单后,如果验证失败,outputText 为空,但隐藏的输入字段保留其变量。 任何线索我必须做​​些什么来防止这种行为并让 outputText 保持其状态? 我意识到这个 bean 似乎是在每个 ajax 请求之后被初始化的。但是,为什么隐藏的输入字段保留旧变量呢?

下面是我的bean的相关代码:

@ManagedBean(name = "myBean", eager = true)
@Stateful
@Model
@ViewScoped
public class MyBean implements Serializable {

  ...
  private String uid;
  ...

  @PostConstruct
  public void initWithData() {
      this.uid = UUID.randomUUID().toString();
  }

}

最佳答案

JSF input components有 3 个存储值(状态)的地方:

  1. Submitted value (原始的未转换/未验证的 String request parameter 值)。
  2. Local value (成功转换/验证的对象值,存储在组件本身内)。
  3. Model value (当整个表单被成功处理时,存储为 bean 属性)

JSF processes输入组件如下:

  • 通过组件的客户端ID获取HTTP请求参数值并将其作为提交值存储。
  • 如果转换/验证成功,将其设置为本地值并将提交的值设置为null
  • 如果成功处理了整个表单,将其设置为模型值并将本地值设置为null

JSF renders输入组件的值如下:

  • 如果提交的值不是null,则显示它。
  • 否则,如果本地值不为 null,则显示它。
  • 否则显示模型值。

因此,在一般验证失败的特定情况下,JSF 对于隐藏的输入组件只是重新显示本地值而不是模型值。如果你想用输出文本实现同样的效果,我认为最好的方法是像 JSF 一样:

<h:outputText value="#{empty hiddenId.submittedValue ? empty hiddenId.localValue ? hiddenId.value : hiddenId.localValue : hiddenId.submittedValue}" />
<h:inputHidden id="hiddenId" binding="#{hiddenId}" value="#{myBean.uid}" />  

或者,您可以只使用只读输入,并在必要时通过 CSS 删除边框:

<h:inputText id="hiddenId" value="#{myBean.uid}" readonly="true" style="border: none;" />  

至于你的 bean,我不确定那里发生了什么,因为这个类似乎耦合得非常紧密。我宁愿将它分为 3 个类:一个真正的支持 bean、一个无状态服务和一个模型实体。此外,您还应该确保没有将 View 构建时间标签或属性绑定(bind)到 View 作用域 bean 的属性。否则它确实会保证在每次请求时都被重建。

另见:


顺便说一下,eager=trueonly@ApplicationScoped bean 中产生效果。

关于ajax - 在 ajax 表单提交后保留 bean 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15898457/

相关文章:

javascript - 使用 Phonegap、ajax 和 php 构建应用程序

javascript - 如何根据 ajax 错误响应禁用元素

javascript - JSF setPropertyActionListener 设置 javascript 整数值

javascript - jQuery `on` 方法未绑定(bind)事件

java - <p :lineChart> Tag Library supports namespace: http://primefaces. org/ui,但没有为名称定义标签:lineChart

mysql - 如果页面上需要进行大量 Ajax 过滤,那么提取整个数据集是否会更好?

javascript - AJAX/jquery 不适用于返回的 PHP 站点

css - JSF 富 :datatable column display very long text in multiple lines

jsf - 从 Facelets 中向数据表行添加最后一行

JSF 复合组件支持 bean EL 表达式作为必需属性的默认值失败,方法未知