我们在Tomcat 7上使用PrimeFaces 4.0 + spring 4.
我去PrimeFaces展示案例,打开向导,输入第一个名字和姓氏点击下一个按钮。然后我从左侧面板中选择其他菜单(如AutoComplete
)我返回向导,名字和姓氏字段清晰。这就是我的预期。
我开发了一个与上面相同的向导,但每次回到向导页面时,向导仍保留先前输入的值,并且不会重置。
我的托管bean如下(我使用了文档中提到的ViewScoped
没有SessionScope
):
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@Named
@ViewScoped
public class AccountController {
@Valid
private Account account = new Account()
//Setters and getters
}
编辑:
我发现问题出在JSF和Spring的集成上。当我删除@Named
并使用@ManagedBean
时,它可以正常工作。有什么意见吗?!
答案 0 :(得分:1)
Spring没有对JSF ViewScope
的内置支持,但您可以将此范围添加到JSF中:
public class ViewScope implements Scope {
public Object get(String name, ObjectFactory<?> objectFactory) {
Map<String, Object> viewMap = FacesContext.getCurrentInstance()
.getViewRoot().getViewMap();
if (viewMap.containsKey(name)) {
return viewMap.get(name);
} else {
Object object = objectFactory.getObject();
viewMap.put(name, object);
return object;
}
}
public Object remove(String name) {
return FacesContext.getCurrentInstance().getViewRoot().getViewMap()
.remove(name);
}
public String getConversationId() {
return null;
}
public void registerDestructionCallback(String name, Runnable callback) {
// Not supported
}
public Object resolveContextualObject(String key) {
return null;
}
}
请参阅http://blog.primefaces.org/?p=702
在applicationConetext.xml
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="view">
<bean class="utils.ViewScope" />
</entry>
</map>
</property>
</bean>
最后:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@Named
@ViewScoped
@Scope("view")
public class AccountController {
@Valid
private Account account = new Account()
//Setters and getters
}