10

エンティティを JSF バッキング Bean として使用することは理にかなっていますか?

@Entity
@ManagedBean
@ViewScoped
public class User {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

    public void submit() {
        service.create(this);
    }

    // ...
}

それとも、それらを別々に保持し、最後にバッキング Bean からエンティティにデータを転送する方がよいでしょうか?

@ManagedBean
@ViewScoped
public class UserBean {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

    public void submit() {
        User user = new User();
        user.setFirstname(firstname);
        user.setLastname(lastname);
        service.create(user);
    }

    // ...
}
4

1 に答える 1

21

あなたはそうすることができます。技術的に可能です。しかし、それは (設計) 機能的には意味がありません。基本的に、モデルとコントローラーを密結合しています。通常、JPA エンティティー (モデル) は、JSF マネージド Bean (コントローラー) のプロパティーです。これにより、コードがDRYに保たれます。Bean 検証制約などのアノテーションは言うまでもなく、同じプロパティをすべての場所で複製したくありません。

例えば

@ManagedBean
@ViewScoped
public class Register {

    private User user;

    @EJB
    private UserService service;

    @PostConstruct
    public void init() { 
        user = new User();
    }

    public void submit() {
        service.create(user);
    }

    public User getUser() {
        return user;
    }

}

この Facelets ページ (ビュー) で:

<h:form>
    <h:inputText value="#{register.user.email}" />
    <h:inputSecret value="#{register.user.password}" />
    <h:inputText value="#{register.user.firstname}" />
    <h:inputText value="#{register.user.lastname}" />
    ...
    <h:commandButton value="Register" action="#{register.submit}" />
</h:form>

以下も参照してください。

于 2012-04-24T15:50:37.817 に答える