Java JSF2:在AJAX请求(@all和显式ID)上未重新提交页面

Java JSF2:在AJAX请求(@all和显式ID)上未重新提交页面,java,ajax,jsf,jsf-2,richfaces,Java,Ajax,Jsf,Jsf 2,Richfaces,我试图实现一个简单的RichFaces 4皮肤切换器,所以代码所做的就是在bean上设置一个新的String属性,并重新渲染整个视图。以下是JSF: <rich:panel styleClass="shadow"> ... <h:form style="float: right;"> <h:outputText value="Skin:&#160;" /> <h:selectOneMenu value=

我试图实现一个简单的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>
登录选择更改:

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表单位于切换器表单的外部,但什么也没有发生。寻找bug也没有发现任何有用的东西。即使是显式ID也无法更新,这让我觉得这是不一样的

注意:我在JBoss上使用Mojarra 2.0.4作为7.0.1


谢谢

我想你是想做类似的事情。很抱歉问一下,但是您确定您已经使用org.RichFaces.skin参数和EL将SkinBean连接到web.xml中的RichFaces skin吗


因为,你的代码看起来很好。也许我应该尝试onchange事件而不是change,但是由于您已经记录了属性更新…

请尝试使用完整请求而不是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>
问候,,
Palo

因为我到处使用@viewscope bean,所以不希望使用完整请求,因为这样在更改皮肤时会重新创建新bean。它不应该像贴的那样工作吗?也许我有误解……是的,web.xml有正确的EL:{skinBean.skin}。正如日志所示,语法也是正确的。顺便说一句,我主要是从你发布的链接复制代码,我只使用CDI而不是JSF2注释。
<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>