【问题标题】:Ajax and Request Scoped beans in JSF 1.2 and Rich FacesJSF 1.2 和 Rich Faces 中的 Ajax 和 Request Scoped bean
【发布时间】:2012-06-04 08:32:33
【问题描述】:

我正在使用 JSF 1.2 和 RichFaces 3.3,我有一个名为 NewsItemDetails 的页面,其结构如下

<h:form>
  <h:panelBar>
    <h:panelBarItem>
      <myTag:searchModule />
    </h:panelBarItem>
  </h:panelBar>
</h:form>

并且该页面的支持bean属于请求范围,这里是faces-config.xml的sn-p:

<managed-bean>
  <managed-bean-name>newsItemDetails</managed-bean-name>
  <managed-bean-class>class.location...</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
     <property-name>id</property-name>
     <value>#{param['id']}</value>
  </managed-property>
</managed-bean>

为了完整,这里是 searchModule 标签的 sn-p:

<ui:composition>
   <rich:tabPanel>
     <rich:tab label="Images">
       <h:panelGrid columns="2">
         <h:inputText value="#{newsItemDetails.searchLabel}" />
         <a4j:commandButton value="Search" actionListener="#{newsItemDetails.onSearch}" reRender="mediaItemsSearchResults, imagesDataTable" />
       </h:panelGrid>

       <a4j:outputPanel id="mediaItemsSearchResults" ajaxRendered="true">
         <rich:dataTable id="imagesDataTable" value="#{newsItemDetails.searchResults}" var="image">
           <h:column>
             <h:outputText value="#{image.title}"/>
           </h:column>
         </rich:dataTable>
       </a4j:outputPanel>

     </rich:tab>
   </rich:tabPanel>
</ui:composition>

现在的问题是,每当我点击搜索按钮时,都不会调用动作监听器, 但我可以看到通过 Firebug 发送到服务器的请求。如果我在 rich:panelBarItem 之外调用相同的 searchModule 标记,这就是奇怪的事情,我点击了调用动作侦听器的搜索按钮,但是 dataTable 没有重新渲染,它只在我第一次点击时被调用按钮。

因此,如果有人知道为什么会发生这种情况,我将不胜感激。

提前致谢

【问题讨论】:

  • 第一次进入页面时是否默认渲染panelBarItem?如果要进行 ajax 调用,为什么要使用 h:commandButton 而不是 a4j:commandButton? (reRender 属性在 h:commandButton 中没有意义)。
  • panelBarItem 有条件但默认是渲染的,关于 h:commandButton,我其实用的是 a4j:commandButton,但打错了
  • 我能想到的唯一可以阻止调用 actionListener 的是 commandButton 没有在 restoreView 阶段呈现。尝试将支持 bean 的范围从请求更改为会话。如果这个修复它,那么问题是包含 commandButton 的东西不被认为是在 restoreView 阶段呈现的。
  • 我认为问题出在 rich:panelBar 及其子组件中,正如我之前所说,我在它之外调用标签并且它可以工作,并且调用动作侦听器,除了那个 id不会重新渲染数据表,而是从 rich:panelBar 中不会发生这种情况。

标签: java ajax jsf jakarta-ee richfaces


【解决方案1】:

我已经找到了答案,显然支持 bean 的范围必须设置为会话范围而不是请求。完成后,一切都很好。 所以 faces-config.xml 中的条目是:

<managed-bean>
  <managed-bean-name>newsItemDetails</managed-bean-name>
  <managed-bean-class>class.location...</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

如您所见,我必须删除该条目,而是从支持 bean 中的请求对象中获取它。

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 2014-01-03
    • 2011-01-01
    • 2013-07-04
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多