2011-07-18 34 views
2

我似乎無法獲取視圖範圍內管理與豆到setPropertyActionListener工作:查看範圍的託管bean與setPropertyActionListener

<h:commandButton value="Edit" action="edit-company.xhtml"> 
    <f:setPropertyActionListener target="#{companyHolder.item}" value="#{company}"/>    
    </h:commandButton> 

此工作正常,如果companyHolder是會話或請求範圍,但不工作,如果它認爲作用域。這是正常的嗎?

回答

6

創建新視圖時創建了一個全新的視圖範圍bean。目標視圖保存視圖範圍的bean的不同實例,該視圖範圍的bean的屬性是通過窗體的初始視圖上的操作方法設置的。

這看起來確實很不直觀,但這就是視圖範圍的工作原理。只要視圖存在,視圖範圍的bean就會一直存在。畢竟這是有道理的。

您最好的選擇是使用<f:param>而不是<f:setPropertyActionListener>,並讓目標視圖設置爲<f:viewParam>

E.g.

<h:commandButton value="Edit" action="edit-company.xhtml"> 
    <f:param name="companyId" value="#{company.id}"/>    
</h:commandButton> 

<f:metadata> 
    <f:viewParam name="companyId" value="#{bean.company}" required="true" /> 
</f:metadata> 

@ManagedBean 
@ViewScoped 
public class Bean { 

    private Company company; 

    // ... 
} 

@FacesConverter(forClass=Company.class) 
public class CompanyConverter implements Converter { 

    @Override 
    public void getAsObject(FacesContext context, UIComponent component, Object value) throws ConverterException { 
     try { 
      return companyService.find(Long.valueOf(value)); 
     } catch (Exception e) { 
      throw new ConverterException(new FacesMessage(
       String.format("Cannot convert %s to Company", value)), e); 
     } 
    } 

    // ... 
} 

作爲一個完全不同的選擇,你也可以只通過返回導航回到了同樣的觀點3210或null並有條件地呈現包含。

<ui:include src="#{bean.editmode ? 'edit' : 'view'}.xhtml" /> 

然而,這如果需要支持GET而不是POST不起作用(您將需要通過<h:button>的方式來代替<h:commandButton>)。

+0

如果我採用param方法,我是否需要爲其他人的公司發佈參數的人添加安全性? –

+0

我會說,使用條件包括。 – BalusC