在JBoss AS 7.1.0.Final上部署。
我有一个非常简单的测试应用程序。它正在按预期工作直到前一天(着名的最后一句话)并且不再做最基本的事情,即设置输入组件的值并在动作组件中使用它。我把这件事情剥夺了基础,无法弄清楚发生了什么。
index.xhtml就在这里
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>contacts</title>
</h:head>
<h:form>
<h:outputLabel value="Message:" />
<h:inputText value="#{contactView.siteCode}" />
<h:commandButton action="#{contactView.save}" value="Save" />
</h:form>
</html>
ViewScoped bean就在这里
@Named
@ViewScoped
public class ContactView implements Serializable {
public ContactView() {
}
private String siteCode;
public String getSiteCode() {
System.out.println("getSiteCode: "+ siteCode);
return siteCode;
}
public void setSiteCode(String siteCode) {
System.out.println("setSiteCode: "+ siteCode);
this.siteCode = siteCode;
}
public String save(){
System.out.println("Saving sitecode: " + siteCode);
return "index.jsf";
}
}
我做错了什么?当我点击保存按钮时,我在输出中得到了这个
10:50:37,663 INFO [stdout] (http--0.0.0.0-8080-2) setSiteCode: 22
10:50:37,663 INFO [stdout] (http--0.0.0.0-8080-2) Saving sitecode: null
10:50:37,663 INFO [stdout] (http--0.0.0.0-8080-2) getSiteCode: null
答案 0 :(得分:5)
那是因为bean由CDI @Named
管理,而不是由JSF @ManagedBean
管理。包{J}的JSF范围注释仅适用于由JSF管理的bean。在CDI托管bean上,您需要使用javax.faces.bean
中的CDI注释。但是,CDI没有视图范围的概念。最近的是javax.enterprise.context
,但管理起来比较复杂。如果未在CDI托管bean上指定范围,则默认为请求范围。
每当您想使用@ConversationScoped
时,请确保您的bean由JSF管理。
@ViewScoped
此外,您还需要确保在您想要保留视图范围时,您的操作方法会返回import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class ContactView implements Serializable {
// ...
}
或null
。