将参数从 ManagedBean 传递到 jsf 页面
Pass a param from ManagedBean to jsf page
我正在使用 JSF 2.2 和 Tomcat 8,我才刚刚开始使用它们。
我在 jsf 页面中有一个命令按钮。
<h:commandButton id="newObject" value="New Object" action="#{someObject.someAction}">
<f:param name="object_id" value="#{someObject.object_id}" />
</h:commandButton>
ManagedBean类似这样:
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class SomeObject implements Serializable{
private static final long serialVersionUID = 1L;
private int object_id;
public int getObject_id() {
return object_id;
}
public void setObject_id(int object_id) {
this.object_id = object_id;
}
public String someAction() {
setObject_id(sqlInsert());
if(getObject_id() != 0) {
System.out.println(getObject_id());
return "new_page";
}
}
}
sqlInsert 方法工作正常。我用它在一些 sql table 中插入一个新行并获取自动生成的键,它是一个 int。如果插入没有发生,它将 return 0.
我可以导航到 new_page,但是参数 object_id 是 0。我添加了 println 来显示 object_id,它是实际的键。
我做错了什么?
由于您在托管 Bean 上使用了唯一的 @ManagedBean
注释并且没有明确指定您的 bean 的任何范围,因此您的 Bean 将表现得好像它是一个 @RequestScoped
bean。[参见 link]
因此,每次单击 New Object
按钮时,Bean 都会重新初始化,并且您会丢失状态(变量值)。
考虑并决定要使用哪个范围[参见 link]。根据您的要求,@ViewScoped
可能会为您完成这项工作。
我正在使用 JSF 2.2 和 Tomcat 8,我才刚刚开始使用它们。
我在 jsf 页面中有一个命令按钮。
<h:commandButton id="newObject" value="New Object" action="#{someObject.someAction}">
<f:param name="object_id" value="#{someObject.object_id}" />
</h:commandButton>
ManagedBean类似这样:
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class SomeObject implements Serializable{
private static final long serialVersionUID = 1L;
private int object_id;
public int getObject_id() {
return object_id;
}
public void setObject_id(int object_id) {
this.object_id = object_id;
}
public String someAction() {
setObject_id(sqlInsert());
if(getObject_id() != 0) {
System.out.println(getObject_id());
return "new_page";
}
}
}
sqlInsert 方法工作正常。我用它在一些 sql table 中插入一个新行并获取自动生成的键,它是一个 int。如果插入没有发生,它将 return 0.
我可以导航到 new_page,但是参数 object_id 是 0。我添加了 println 来显示 object_id,它是实际的键。
我做错了什么?
由于您在托管 Bean 上使用了唯一的 @ManagedBean
注释并且没有明确指定您的 bean 的任何范围,因此您的 Bean 将表现得好像它是一个 @RequestScoped
bean。[参见 link]
因此,每次单击 New Object
按钮时,Bean 都会重新初始化,并且您会丢失状态(变量值)。
考虑并决定要使用哪个范围[参见 link]。根据您的要求,@ViewScoped
可能会为您完成这项工作。