【问题标题】:Component attributes doesn't set after "reRender" on AJAX request在 AJAX 请求上“重新渲染”后未设置组件属性
【发布时间】:2011-05-08 23:21:21
【问题描述】:

目前我正在开发一些复杂的网络前端并使用:

  • JSF 1.2
  • Facelets 1.1.15
  • RichFaces 3.3.3.Final

我创建了一个自定义 JSF 组件,它可以使用纯 JavaScript 验证 inputText 字段。这个组件只有一个属性:type。此属性负责验证算法,该算法将在用户按下键盘键时应用。

在创建初始视图时的restoreView 阶段,此属性由 JSF(实际上由 Facelets)设置。这意味着我有一个带有属性“类型”的 setter 和 getter 的组件类。以及使用 xhtml 文档中指定的值调用的“类型”设置器。

如果我在 reRender 属性中指定组件对象,则每次在 restoreView 阶段都会重新创建它们。但是当它重新创建时,我需要的属性类型没有设置。 它只是创建新的组件对象……仅此而已。可能是我不明白某些东西,这是正常行为,但是在这种情况下如何获取属性值?

代码:

简单的测试页面:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:u="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a="http://richfaces.org/a4j"
      xmlns:r="http://richfaces.org/rich"
      xmlns:v="http://nobodyhere.ru/jsf/validation">
    <head>
        <title>Test Page</title>
    </head>
    <body>
        <h:form id="testForm">
            <h:inputText id="textInput" value="test">
                <v:keyValidator type="time"/>
            </h:inputText>
            <a:commandButton value="Make AJAX request" reRender="testForm"/>
        </h:form>
    </body>
</html>

组件类:

public class KeyValidator extends UIComponentBase
{

    public KeyValidator()
    {
        System.out.println("new KeyValidator");
    }

    public KeyValidatorType getValidatorType()
    {
        return type;
    }

    public String getType()
    {
        return getValidatorType().toString();
    }

    public void setType(String type)
    {
        this.type = KeyValidatorType.valueOf(type.toUpperCase());
    }

    @Override
    public String getFamily()
    {
        return KeyValidator.class.getName();
    }

    private KeyValidatorType type;
}

当我按下“发出 AJAX 请求”按钮时,我的组件被重新创建。但是组件中没有设置属性“类型”。

主要问题始于组件渲染器中的renderView 阶段,当调用encodeBegin 时,它会尝试获取此属性,当然它会获取null 而不是正确的值。

所以,更准确的问题可能是:
如何在renderView阶段获取AJAX请求组件的属性值?

任何帮助将不胜感激。

【问题讨论】:

    标签: java jsf richfaces facelets ajax4jsf


    【解决方案1】:

    您必须覆盖组件中的saveStaterestoreState 才能保存和恢复所需的属性。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2018-05-01
      • 2015-05-24
      • 2020-07-18
      • 1970-01-01
      • 2018-10-09
      • 2019-04-18
      • 1970-01-01
      • 2022-08-19
      相关资源
      最近更新 更多