将属性设置为jsf managed-bean

时间:2010-11-30 09:13:58

标签: jsf properties set managed-bean

首先关注.jsf:

<ui:repeat var="prod" value="#{showProducts.decoys}">
     <h:form>
       {prod.price} 
       {prod.weight} 
       {prod.size} >
    <h:commandButton value="Buy" action="shoppingCart"/>
    </h:form>
</ui:repeat>

有以下shoppingCart.jsf:

<h:form>
 <h:dataTable value="#{prod}">
  <h:column>
   #{prod.name}<br/>
  </h:column>
  <h:column>
   #{prod.price}<br/>
  </h:column>
  <h:column>        
   <h:inputText value="#{prod.count}" size="3"/>
  </h:column>
</h:dataTable>  
<h:inputText value="#{order.phone}"/><br/>
<h:inputText value="#{order.mail}"><br/>
<h:inputText value="#{order.city}"/><br/>
<h:commandButton value="Order" action="#{showProducts.persistOrder}">
</h:form>

面 - 配置:

    <managed-bean>
        <managed-bean-name>showProducts</managed-bean-name>
            <managed-bean-class>main.ShowProducts</managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
...
            <managed-property>
               <property-name>product</property-name>
               <value>#{product}</value>
            </managed-property>
        </managed-bean>

    <managed-bean>
        <managed-bean-name>product</managed-bean-name>
        <managed-bean-class>main.Product</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
...

问题:
托管bean名称定义为product
迭代就这样(shoppingCart.jsf):
h:dataTable value="#{prod}">
所以这意味着这个迭代不会与名为product的bean无关

如何将属性prod.price,prod.weight,prod.count设置为真正的托管bean属性:

product.price,product.weight,product.size

1 个答案:

答案 0 :(得分:5)

有两个问题:

  1. 您没有在会话范围bean中设置特定的prod。你应该这样做。

    <h:commandButton value="Buy" action="shoppingCart">
        <f:setPropertyActionListener target="#{showProducts.product}" value="#{prod}" />
    </h:commandButton>
    

    顺便说一句,managed-property声明只在父bean的ceration期间将一个新的/空的bean设置为属性。这不一定与prod中的相同 ui:repeat实例一样。您可以从#{product}

  2. 中删除faces-config.xml bean
  3. h:dataTable在这里没有任何意义。您需要h:panelGrid

    <h:panelGrid columns="3">
        <h:outputText value="#{showProducts.product.name}" />
        <h:outputText value="#{showProducts.product.price}" />
        <h:outputText value="#{showProducts.product.count}" />
    </h:panelGrid>