【问题标题】:Accessing bean properties in JSF 2.0在 JSF 2.0 中访问 bean 属性
【发布时间】:2013-12-31 10:03:49
【问题描述】:

我有以下型号代码,我应该使用它。

    public class Client extends User {

    private String userName;

    public Client(String firstName, String lastName, String userName){
        super(firstName, lastName);
        this.userName = userName;
    }

    //getters and setters
}

public abstract class User {
    String firstName;
    String lastName;

   //getters and setters
}

现在我创建了以下 bean:

@ManagedBean(name = "client")
@SessionScoped
public class ClientBean implements Serializable {

    private final long serialVersionUID = 1L; 
    private Client client;

    public Client getClient(){
        return client;
    }

    public void setClient(Client client){
        this.client = client;
    }

}

现在我想在 xhtml 页面中使用这个 bean 设置客户的名字:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <head>
        <title>Register as a client</title>
    </head>
    <body>
        <h:form>
            First Name:<h:inputText value="#{???}"></h:inputText>
            <br/>                  
            <h:commandButton value="Register" action="registered?faces-redirect=true"/>
        </h:form>
    </body>
</html> 

现在我的问题是:如何访问客户的名字?我是否应该创建一个代表用户的新 bean 并在 ClientBean 中扩展它? (如果是这样,有模型代码有什么用?我会到处都有双重代码?)或者在 JSF 2.0 中是否有其他更简单的方法来实现这一点?

【问题讨论】:

  • 你试过 client.client.firstName 吗?
  • 不起作用,客户端是客户端的未知属性
  • 您需要将 getter 和 setter 设为公开
  • 哦,废话,我为什么要把它们设为私有:O
  • 在尝试此操作后,我在运行时收到以下错误:/registerClient.xhtml @15,79 value="#{client.client.firstname}": Target Unreachable, 'null' returned nul

标签: java jsf jsf-2


【解决方案1】:

您需要以下内容才能使页面正确显示姓氏。

-- 类 User 必须有一个如下构造函数以及 firstname 和 lastname 的 getter 和 setter。

  public User (String firstName, String lastName)

-- Client 类中用户名的公共 getter 和 setter 方法。

-- 在ClientBean 类中,我建议您将名称更改为clientBean。此外,将 getter 和 setter 方法更改为 public 而不是 private。如果您需要在屏幕上显示它,您需要创建一个客户端类型的对象并将客户端对象初始化为某个值。在提供的代码中,您没有创建对象或为任何名称属性赋予任何值。

-- 在 JSF 页面中,您可以使用 "#{clientBean.client.firstName}" 访问这些值

【讨论】:

    【解决方案2】:

    公开 getter 和 setter

     public Client getClient(){
            return client;
        }
    
        public void setClient(Client client){
            this.client = client;
        }
    

    如果您的Clientnull,只需实例化它即可。

    private Client client = new Client();
    

    【讨论】:

    • 在尝试此操作后,我在运行时收到以下错误:/registerClient.xhtml @15,79 value="#{client.client.firstname}": Target Unreachable, 'null' returned nul (见上面的评论)
    • 你需要创建一个pojo的实例,可以在托管bean的构造函数中。
    • @Spindizzy 我假设他还希望注入一个 ManagedBean。你的方法更好:)
    • JSF 有很多方法,DI 也是一种选择。我没想到。
    【解决方案3】:

    如果您想将值持久保存在数据库中,或者做一些其他神奇的事情,例如调用 web 服务,您可以使用托管 bean 和 pojo 的这种方法。

    要访问你写的名字#{client.client.firstName}确实看起来有点棒,所以我建议给托管bean另一个名字。

    您可以在托管 bean 中创建 pojo 的实例:

    public class ClientBean implements Serializable {
    
        private Client client = new Client();
        ...
    }
    

    您还可以直接在托管 bean 中包含名字和姓氏,如果您在某些操作期间创建 pojo 以保存值,这将是有意义的。

    JSF 不会强迫你穿紧身胸衣,而是你可以选择适合你的方式。

    【讨论】:

    • 问题是:客户端没有空的构造函数,我们不应该改变模型代码
    • 是的,那么您应该使用@PostConstruct 方法并以某种方式将正确的信息获取到您的支持bean 中,以便能够正确地初始化客户端,例如通过请求参数。或者最初放入虚拟数据。
    • 我同意,@PostConstruct 是另一种创建 bean 的方法,然后用有意义的数据填充值。
    猜你喜欢
    • 2012-06-30
    • 2014-12-11
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2014-09-25
    • 2012-07-31
    • 2012-06-19
    • 2015-05-20
    相关资源
    最近更新 更多