我正在开发一个具有以下依赖关系的JSF上的简单应用程序
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-impl</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.apache.myfaces.core</groupId>
<artifactId>myfaces-api</artifactId>
<version>2.0.2</version>
</dependency>
并且是一个支持bean的简单页面。
XHTML
<?xml version="1.0" encoding="UTF-8"?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<head>
<title></title>
</head>
<body >
<h:form>
<f:view >
<h:commandButton id="otxMainPanelTextBt" value="click"
action="#{otherController.doSome}"/>
</f:view>
</h:form>
</body>
</html>
Java代码
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = "otherController")
@ViewScoped
public class Other implements Serializable {
private static final long serialVersionUID = -6493758917750576706L;
public String doSome() {
System.out.println(this);
return "";
}
}
如果我根据toString源代码多次点击commandButton,它应该写
class name+hashCode
但它写了类似下面的内容
de.controller.Other@118ea91
de.controller.Other@1e8f930
de.controller.Other@1a38f3c
因此,每次我们点击时都会有一个不同的hashcoped bean哈希码。这是不正确的?我尝试过会话bean,但这不会发生。
修改
我按照以下方式修改了@BalusC建议之后的课程。
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name = "otherController")
@ViewScoped
public class Other implements Serializable {
private static final long serialVersionUID = -6493758917750576706L;
@PostConstruct
public void init()
{
System.out.println("Post Construction");
}
public Other()
{
System.out.println("Constructor");
}
public void doSome() {
System.out.println(this);
}
}
点击多次后我发现了这个输出。
Constructor
Post Construction
de.controller.Other@b748dd
de.controller.Other@1620dca
de.controller.Other@116358
de.controller.Other@73cb2d
de.controller.Other@1cc3ba0
因此,构造函数和PostConstructor方法只调用一次,尽管如此,对象在每次调用中仍然具有不同的哈希码。这很奇怪,因为没有参数的构造函数应该在托管bean实例化上调用,但它不是,所以我仍然不明白如何多次创建对象?
答案 0 :(得分:0)
从动作方法返回非null
时,会创建一个新视图。
如果您想让当前视图保持活动状态,只需从操作方法返回null
或void
。
E.g。
public void doSome() {
System.out.println(this);
}
那就是说,你的结论是这是一个问题是正确的,但是基于你的结论的基础,“不正确的哈希码实现”,没有任何意义。每次只是物理上不同的bean实例。在类中添加一个默认构造函数,在其上放置一个断点,你会看到每次从action方法返回后调用它,创建一个全新的实例。