Olá! André, fico contente em ter esclarecido a sua dúvida, obrigado. Agora vamos a sua segunda pergunta:
Normalmente, um ManagedBean do JSF está ligado a uma View (aliás, uma view pode referenciar através de expression language outros ManagedBeans). Em JSF view é sinônimo de página. Vejamos o LivroBean com informações que não dizem respeito ao livro, um exemplo:
@ManagedBean
public class LivroBean {
private Livro livro = new Livro();
private boolean exibido = false;
// getters e setters
}
O que é o atributo exibido
? Com certeza não é algo do livro. Ele é usado para controlamos algum componente visual do JSF. Por exemplo, na view livro.xhml
(lembre-se que view é sinônimo de página) poderíamos ter:
<!-- em livro.xhtml -->
<h:outputLabel value="Livro em promoção" render="#{livroBean.exibido}"/>
Neste caso, como usamos o atributo render
, o componente só será exibido se o valor de livroBean.exibido
é true
. Ai, voltamos para a primeira resposta. O atributo exibido
de LivroBean
é alguma informação do Livro? Com certeza não. Ele só está lá para que você possa controlar como sua view será exibida.
Agora, vamos voltar à sua pergunta sobre o GenericBean. Primeiro, você está de parabéns por ter a preocupação de não repetir código, aplicando o princípio DRY (don't repeat your self), porém, no contexto de um ManagedBean, não faz muito sentido um ManagedBean genérico. Mas qual a razão disso?
Um ManagedBean, como lhe mostrei, tem como papel expor seu model para a view, em nosso caso, Livro, porém ele também contém atributos que estão atrelados à sua view. Por exemplo, guardar um valor para saber se um botão foi pressionado, um para exibir ou esconder algo. Sendo assim, um ManagedBean está muito atrelado à view a qual ele está fornecendo dados e não faz muito sentido criar um ManageBean genérico. O que seria genérico se cada página é muito diferente uma das outras?
Mas Flávio, que tal se eu criasse um único ManagedBean que fosse utilizado para todas as páginas, tipo um GenericBean. O problema dessa abordagem é que você teria que colocar os dados do livro, autor, papaguaio, calopsita e vários métodos que não possuem relação entre si. Daí, seu GenericBean ficaria gigante e a manutenção problemática, ferindo assim o princípio de responsabilidade única (SRP -> Single Responsability Principle).
Então, você pode criar um ManagedBean por classe (Autor, Livro) que você deseja expor em sua view, ou não. Tudo depende. Você pode ter um ConfiguracaoBean que faz um monte de coisa no seu sistema, mas não existe a classe Configuração.
É isso. Espero ter esclarecido ainda melhor sua dúvida.
Abraço