Função dos managed beans do jsf

Olá pessoal.

To começando a estudar java server faces e gostaria de tirar uma pequena dúvida…

Qual a principal função dos manageds beans do jsf :?: Eles servem de apoio para as paginas… mas eles tem o papel como a de um controller? ou não? Pois os exemplos que vejo por ai usam uma classe como “Pessoa” e chamam direto na pagina um metodo get ou set dessa entidade…

Isso, levando em conta a modelagem de um sistema “profissional” por exemplo… é correto :?:

Desculpem se falei bobagem… :x

Valeu pessoal… qualquer ajuda é bem vinda!!

grande abraço :!:

Oi
Também sou novo em JSF. Eu entendo que os Managed Beans têm a função de controller. No meu caso, utilizo um MB para atualizar listas de registros (ex: numa busca) e fazer a paginação de resultados. O acesso a classes de persistência é feito através de um Facade.

A pricipal função de um ManagedBean, no JavaServer Faces é sim a de um Controller, ou seja, ele é responsavel em receber as requisições vindas das Views, “Gerenciar” os Models, seus objetos de modelo, como por exemplo Pessoa. Seguindo o Design Pattern de MVC, os métodos com sua logica de negócio, serão implementados em seus ManagedBean, separando as coisas.

Não é correto usar um Objeto - Pessoa, ou um JavaBean por exemplo, como um ManagedBean em qualquer aplicação que siga o Design Pattern de MVC (Model-View-Controller)

Links relacionados:

http://java.sun.com/blueprints/patterns/MVC.html
http://java.sun.com/blueprints/patterns/MVC-detailed.html
http://en.wikipedia.org/wiki/Model-view-controller

[ ]s,

Se você nunca precisar mudar sua camada de apresentação tudo bem, mas e se um dia eu mudar de JSF para Wicket ou VRaptor? Terei que implementar toda a lógica de negócios de novo? Não vale dizer que é só fazer ctrl + c, ctrl + v :XD:

Ola tnaires.

Muito bem lembrado. Ficar amarrado a um framework ou alguma implemetação é um um ponto importante a ser discutido. - em bora as vezes não existe opção, por exemplo implementacao de Java EE, EJB.

Tudo ira depender do desenvolvedor.
Uma mudança de Faces para VRaptor por exemplo, nao sofrera muitas alteraçoes;

Assinaturas de metodos nao precisam ser alteradas;
Parametros tambem nao sofrem alteracoes - mas tudo depende.

Ja participei de algumas experiencias como citei acima, o mesmo exmplo. E foi um sucesso.

Obrigado pelo comentario.

[ ]s,

[quote=mateusprado]Uma mudança de Faces para VRaptor por exemplo, nao sofrera muitas alteraçoes;

Assinaturas de metodos nao precisam ser alteradas;
Parametros tambem nao sofrem alteracoes - mas tudo depende.

Ja participei de algumas experiencias como citei acima, o mesmo exmplo. E foi um sucesso.[/quote]
É verdade, porque tanto os managed beans do JSF como os controllers do VRaptor são POJOs.
Mas às vezes a gente declara no managed bean atributos correspondentes aos controles contidos na view = HtmlInputText, por exemplo. Aí nesses casos, ainda vai ter um trabalhinho.

Valeu pelas respostas pessoal… ajudou bastante para mim poder continuar meus estudos… :wink:

Vocês poderiam me ajudar dando um exemplo de função de um controller?

Assim… recentemente eu estava desenvovendo uma pequena aplicação desktop para gerenciamento de uma lan house… nos formulários de cadastros de clientes por exemplo, haviam todos aqueles campos nescessários para o cadastro de um cliente, e então eu tinha uma classe, que deveria ser/era meu controller, que pegava os dados do formulario, e passava para a classe responsavel por cadastrar o novo cliente…

Mas ficava uma coisa bizarra e com certeza… errada :!: :?

era um método tipo assim:

public void novoCliente(String nome, String idade, String cpf, Date dataNasc… e assim para todos os campos do formulario…

que então pegava os parametros e mandava para uma outra classe responsavel pelo cadastro propriamente dito…

A duvida é:
:arrow: É realmente necessário pegar todos aqueles parametros na chamada do método do controller?

Axo que tenho que estudar mais :lol:

Valeu pessoal :!:

Concerteza Malkav.Felipe, isso não é uma boa pratica.

Isso poderia ser feito assim:

public void adiciona() {

// logica de adicionar um objeto aqui

//exemplo usando JPA com Hibernate

session.save(this.cliente);


}

E voce teria uma referencia ao seu objeto Cliente, assim:

private Cliente cliente = new Cliente();

Finalizando, nas sua JSPs(views) os atributos value dos componente, apontariam para essa referencia.

<h:inputText value="#{clienteController.cliente.nome}" />

Ah ja que foi citado o VRaptor, imaginem uma migração de JSF para VRaptor! - neste caso.

Seu “MB”:

public void adiciona(Cliente cliente) {

session.save(cliente);

}

So para termos uma noção !
Espero que fique um pouco mais claro. Com isso vc elimina aquela todo quantidade de parametros desnecessarios, e utiliza seus objetos.

[ ]s,

Então no managed bean é que iria aquele método adiciona? e a logica de adicionar também? isso é correto? Tipo, é no controller que devemos implementar as regras de negócio mesmo?

Não sei se entendi direito… :oops:

Valeu pela atenção mateus…

Felipe.

Exatamente Felipe ! Seus metodos de logica de negocio que iram “Gerenciar”(Manager) seus objetos iram nas suas classes com caracteristicas de um Controller.
E uma das caracteristicas é essa.

[ ]s,

Mateus… não imagina como esta me ajudando… valeu mesmo… to começando a entender :smiley:

Não sei se manjas de aplicação desktop também… mas aquilo que se faz com um componente web, como em:

<h:inputText value="#{clienteController.cliente.nome}" /> 

é possivel fazer nos componentes swing também? Acredito que sim né?

Grato! 8)

Felipe, o Design Pattern MVC, nao precisa ser usado necessariamente somente para aplicacoes WEB.
Recomendo que leia sobre isso. De uma olhada nesses links:

http://java.sun.com/docs/books/tutorial/uiswing/

http://www.guj.com.br/posts/list/25071.java

[ ]s,

Então cara…

Managed Beans tem a função de controller, como citado acima.

Pense o seguinte:

  • Você precisa setar a ManageBean no faces-config de sua aplicação para cada bean que desejares manipular com o jsf.
  • Geralmente são configurados o nome, a classe e o escopo para cada managed bean.

Onde:
é o nome pelo qual o jsf vai manipular a bean da aplicação.
é a bean que desejas acessar pelo nome setado no managed-bean-name.
é o escopo do tipo de acesso à bean. Exemplo: se você quer um request, usa-se request

Espero ter ajudado.
Abraços

Ajudou sim kikoblues… muito obrigado!

A duvida seguinte seria como implementar um “bom” controller… entenderam? Existem algumas técnicas utilizadas? Padrões de projetos? Para que haja uma boa arquitetura da aplicação?

Valu galera! Vocês são d+ :!: 8)

Felipe.

[quote=Malkav.Felipe]Ajudou sim kikoblues… muito obrigado!

A duvida seguinte seria como implementar um “bom” controller… entenderam? Existem algumas técnicas utilizadas? Padrões de projetos? Para que haja uma boa arquitetura da aplicação?

Valu galera! Vocês são d+ :!: 8)

Felipe. [/quote]

Então cara…

Desenvolvi uma aplicação simples aqui e te envio o meu faces-config para ver se ajuda.

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xi="http://www.w3.org/2001/XInclude"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
	<managed-bean>
		<managed-bean-name>calc</managed-bean-name>
		<managed-bean-class>CalcBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
	</managed-bean>
	<navigation-rule>
		<from-view-id>/index.jsp</from-view-id>
		<navigation-case>
			<from-outcome>resultado</from-outcome>
			<to-view-id>/resultado.jsp</to-view-id>
		</navigation-case>
	</navigation-rule>
</faces-config>