【发布时间】:2015-04-07 20:47:30
【问题描述】:
我正在使用 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 表中插入一个新行并获取自动生成的键,它是一个 int。如果插入没有发生,它将返回 0。
我可以导航到 new_page,但参数 object_id 为 0。我添加了 println 以显示 object_id,它是实际的键。
我做错了什么?
【问题讨论】:
-
除了您误解了JSF 中有关通信的一些基本概念之外,您为什么要将bean 的
objectId传回给它自己?在此处显示的代码中,您实际上是否将objectId的值设置为 0 以外的值? -
在 jsf 页面中,我没有设置 objectId,因为它在数据库中还不存在。 sqlInsert 方法正在创建对象,这就是我在那里设置 objectID 的原因。并且正在返回数据库的正确种子,但在新页面中我得到 0 作为 objectID。
-
我的猜测是有些地方出了问题,@jaec86。其中之一是您没有在 ManagedBean 上声明范围,默认值为 RequestScoped,这意味着它会在 每个 HTTP 请求上重新创建。我建议您从 Bauke Scholtz's JSF link index 开始,而不是先在 StackOverflow 上发布问题。
-
您应该在您尝试检索请求参数的目标页面中发布您的代码部分。您尝试检索参数的如何和在哪里很重要
-
您提供了伪代码,如果不进行一些疯狂的猜测,很难合理地回答。这句话,“我可以导航到
new_page,但参数object_id是0。我添加println()来显示object_id,它是实际的关键。”严重矛盾使用目前难以猜测的托管 bean 代码 sn-p。它试图暗示<f:param>提供零,但在托管 bean 中,您以某种方式获得非零键值。由于某些不确定的原因,<f:param>可能未正确设置为托管 bean 中的object_id。