我正在尝试思考一个问题,即JSF页面可以将一个托管bean的属性传递给通过表单提交的另一个托管bean的属性。两个托管bean都是RequestScoped,以保持应用程序尽可能简单,并从一个页面视图移动到下一个 - 没有Ajax。
Bean A
@ManagedBean
@RequestScoped
public class BeanA implements Serializable{
private long ID;
private String name;
//code default constructor and getter/setter
public String viewBean(long ID){
//set up a new beanA using ID argument and database call for the object beanA is based upon
return "page2";
}
}
Bean B(bean B具有基于bean A ID的属性)
@ManagedBean
@RequestScoped
public class BeanB implements Serializable{
private long beanAnumID;
private String name;
//code default constructor and getter/setter
public String saveBean(long beanAnumID)
//save the beanB.name and beanAnumID in database
return "page1";
}
}
第1页(其中设置了Bean A的详细信息;假设bean A是从服务器中的数据库创建的,然后输入到页面中 - 在应用程序中,可以有几个用户可以选择的bean,这个bean的列表是从dataTable呈现的,显示beanA' s的列表:
[.xhtml page content]
<h:form>
<h:commandLink action="#{beanA.viewBean(beanA.ID)}" value="#{beanA.name}" />
</h:form>
[.xhtml page content]
第2页(此页面允许用户命名bean B,然后在将表单发送回服务器后将其保留到DB):
[.xhtml page content]
<h:form>
<h:inputText id="beanBName" value="#{beanB.name}" />
<h:commandButton id="saveBean" action="#{beanB.saveBean(beanA.ID)}" value="Save Bean" />
</h:form>
[.xhtml page content]
我遇到的问题是,当我提交page2表单时,它会将commandButton操作中的beanA.ID视为空指针并且应用程序崩溃。我会认为它会在页面创建时将其呈现为一个值 - 我也尝试过它作为@ViewScoped并且它仍然无法正常运行。
这似乎应该有效;我在这里错过了什么吗?
感谢。