創建新視圖時創建了一個全新的視圖範圍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>
)。
如果我採用param方法,我是否需要爲其他人的公司發佈參數的人添加安全性? –
我會說,使用條件包括。 – BalusC