JSF ViewScope bean不正确的哈希码实现?

时间:2014-02-18 16:15:41

标签: jsf-2

我正在开发一个具有以下依赖关系的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实例化上调用,但它不是,所以我仍然不明白如何多次创建对象?

1 个答案:

答案 0 :(得分:0)

从动作方法返回非null时,会创建一个新视图。

如果您想让当前视图保持活动状态,只需从操作方法返回nullvoid

E.g。

public void doSome() {
    System.out.println(this);
}

另见:


那就是说,你的结论是这是一个问题是正确的,但是基于你的结论的基础,“不正确的哈希码实现”,没有任何意义。每次只是物理上不同的bean实例。在类中添加一个默认构造函数,在其上放置一个断点,你会看到每次从action方法返回后调用它,创建一个全新的实例。