【问题标题】:JSF 2: page not rerendered on AJAX request (@all and explicit IDs)JSF 2:页面未在 AJAX 请求上重新呈现(@all 和显式 ID)
【发布时间】:2011-12-07 07:00:32
【问题描述】:

我正在尝试实现一个简单的 RichFaces 4 皮肤切换器,所以代码所做的只是在 bean 上设置一个新的 String 属性并重新渲染整个视图。这是 JSF:

  <rich:panel styleClass="shadow">
    ...
    <h:form style="float: right;">
      <h:outputText value="Skin:&#160;" />
      <h:selectOneMenu value="#{skinBean.skin}" id="skin-selector">
        <f:ajax event="change" execute="@form" render="@all" listener="#{skinBean.listener}" />
        <f:selectItem itemValue="DEFAULT" itemLabel="Default" />
        <f:selectItem itemValue="classic" itemLabel="Classic" />
        <f:selectItem itemValue="blueSky" itemLabel="Blue Sky" />
        <f:selectItem itemValue="deepMarine" itemLabel="Deep Marine" />
        <f:selectItem itemValue="emeraldTown" itemLabel="Emerald Town" />
        <f:selectItem itemValue="japanCherry" itemLabel="Japan Cherry" />
        <f:selectItem itemValue="ruby" itemLabel="Ruby" />
        <f:selectItem itemValue="wine" itemLabel="Wine" />
      </h:selectOneMenu>
    </h:form>
  </rich:panel>

这是皮豆:

@Named
@SessionScoped
public class SkinBean implements Serializable
{
    private static final long serialVersionUID = 7477768262527797286L;

    private static final Logger log = Logger.getLogger(SkinBean.class);

    private String skin;

    @PostConstruct
    public void init()
    {
        log.info("Initializing skin bean!");

        // default
        this.skin = "wine";
    }

    @PreDestroy
    public void remove()
    {
        log.info("Removing skin bean!");
    }

    public String getSkin()
    {
        return skin;
    }

    public void setSkin(String skinName)
    {
        log.info("Setting skin to " + skinName);

        this.skin = skinName;
    }

    public void listener(AjaxBehaviorEvent abe)
    {
//      log.info("Skinning event!" + abe);
    }
}

登录选择更改:

07:34:49,869 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After RESTORE_VIEW 1
07:34:49,870 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before APPLY_REQUEST_VALUES 2
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After APPLY_REQUEST_VALUES 2
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before PROCESS_VALIDATIONS 3
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After PROCESS_VALIDATIONS 3
07:34:49,871 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before UPDATE_MODEL_VALUES 4
07:34:49,872 INFO  [com.company.project.skin.SkinBean] (http--127.0.0.1-8080-5) Setting skin to classic
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After UPDATE_MODEL_VALUES 4
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before INVOKE_APPLICATION 5
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After INVOKE_APPLICATION 5
07:34:49,872 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) Before RENDER_RESPONSE 6
07:34:50,226 INFO  [com.company.project.util.PhaseTracker] (http--127.0.0.1-8080-5) After RENDER_RESPONSE 6

我的日志清楚地显示新值设置正确,但它不会更新视图。它只会在重新加载整个页面时更新(这有点毫无意义)。

有人知道为什么视图没有更新吗?我还尝试了一些 ID 而不是 render="@all",例如render=":repo-form"(在切换器表单之外),但没有任何反应。寻找错误也没有发现任何有用的东西。即使是明确的 ID 也无法更新,这让我觉得有些不同……?

注意:我在 JBoss AS 7.0.1 上使用 Mojarra 2.0.4。

谢谢

【问题讨论】:

    标签: java ajax jsf jsf-2 richfaces


    【解决方案1】:

    尝试使用完整请求设置皮肤,而不是 Ajax:

    <rich:panel styleClass="shadow">
        ...
        <h:form style="float: right;">
          <h:outputText value="Skin:&#160;" />
          <h:selectOneMenu value="#{skinBean.skin}" id="skin-selector" onchange="submit()">
            <f:selectItem itemValue="DEFAULT" itemLabel="Default" />
            <f:selectItem itemValue="classic" itemLabel="Classic" />
            <f:selectItem itemValue="blueSky" itemLabel="Blue Sky" />
            <f:selectItem itemValue="deepMarine" itemLabel="Deep Marine" />
            <f:selectItem itemValue="emeraldTown" itemLabel="Emerald Town" />
            <f:selectItem itemValue="japanCherry" itemLabel="Japan Cherry" />
            <f:selectItem itemValue="ruby" itemLabel="Ruby" />
            <f:selectItem itemValue="wine" itemLabel="Wine" />
          </h:selectOneMenu>
        </h:form>
    </rich:panel>
    

    问候, 帕洛

    【讨论】:

    • 由于我在各处使用@ViewScoped bean,因此不希望使用完整请求,因为这会在更改皮肤时重新创建新bean。它不应该像发布的那样工作吗?可能是我这边有误会……
    【解决方案2】:

    我猜你正在尝试做类似here 的事情。抱歉,您确定您已使用“org.richfaces.skin”参数和 EL 将您的“SkinBean”连接到 web.xml 中的 RichFaces 皮肤吗?

    因为,您的代码看起来相当不错。也许我会尝试“onchange”事件而不是“change”,但既然你已经记录了属性更新......

    【讨论】:

    • 是的,web.xml 有正确的 EL:#{skinBean.skin}。如日志所示,&lt;f:ajax event="change"&gt; 语法也是正确的。顺便说一句,我主要是从您发布的链接中复制代码,我只使用 CDI 而不是 JSF 2 注释。
    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2023-03-27
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2013-05-17
    • 2012-12-08
    相关资源
    最近更新 更多