JSF como criar uma classe "Action"

7 respostas
gugaa_df

Eu sei que basta mapear meu bean no faces-config para que tudo de certo.
Mas eu nao quero fazer minhas ações dentro do bean, eu quer clicar uma classes a parte, como por exemplo UsuarioAction e nessa classe eu gostaria de resgatas as propriedades dos beans e retornar algo…
Como faço isso no JSF para nao ter que fazer tudo dentro dos pojos?

7 Respostas

brunobuild

Cara tenta fazer o seguinte.
Ao invés de você mapear o seu bean no faces-config tenta mapear o seu action.
E no seu action você cria o bean e no contrutor você instancia ele entendeu? se não vou dar um exemplo

Action

public static class Agenda
(
        private AgendaBean	bean;


	/**
	 * 
	 */
	public AgendaFacade()
	{
		this.bean = new AgendaBean();
	}

)

faces-config

<managed-bean>
		<managed-bean-name>Agenda</managed-bean-name>
		<managed-bean-class>AgendaFacade</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
	</managed-bean>

Agora para você chamar o seus metodos dentro do seus xhtml ou jsp simplesmente você coloca action="#{Agenda.nomeMetodo}"

Guga eu só te dou um conselho no JSF tenta utilizar o design pattern facade ao invés de utilizar o action.

Faça uma classe facade que seria uma classe sem muita ingeligência que identificar quais são as regras de negocio que será utilizada essas regras de negocio estarão na classe Service.
Esse tipo é uma arquitetura muito utilizada.

[]´s

Javabuntu

:roll:

faça configuração de seu UsuarioBean e UsuarioAction no faces-config de modo que o seu bean fique como session e o action como request, e coloque uma propriedade bean na action para que o container faça injeção de depedência:

Bean:

public class UsuarioBean(){
 /// seus componentes etc
}

Action:

public class UsuarioAction(){
 
    private UsuarioBean usuarioBean; // getters e setters
    // não precisa instanciá-lo, pois o container vai injetar uma dependência, e não receberá null pointer

}

no seus faces-config

<managed-bean>
		<managed-bean-name>usuarioAction</managed-bean-name>
		<managed-bean-class>seuPacote.UsuarioAction</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<managed-property>
			<property-name>usuarioBean</property-name>
			<property-class> seuPacote.UsuarioBean</property-class>
			<value>#{usuarioBean}</value> // coloca como propriedade e o container injeta
		</managed-property>
	</managed-bean>
	<managed-bean>
		<managed-bean-name>usuarioBean</managed-bean-name>
		<managed-bean-class>seuPacote.UsuarioBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

esta declaração no faces-config é a melhor forma de se trabalhar com jsf, outra interessante seria via Spring atravé de Ioc que também é excelente.

flw Hewerton

brunobuild

Mal o static ai é que eu tava com pressa

gugaa_df

Mas mapeamento apenas a minha Action como que eu vou setar os atributos do formulario direto no bean?
por exemplo <h:inputText value="#{usuarioBean.nome}" />
A idéia do brunobuild parece que me atenta com o que eu preciso, só que eu nao gostei muito da idéia de ter dois mapeamentos, um para o pojo e outro a action…

Jair_Rillo_Junior

gugaa_df:
Mas mapeamento apenas a minha Action como que eu vou setar os atributos do formulario direto no bean?
por exemplo <h:inputText value="#{usuarioBean.nome}" />
A idéia do brunobuild parece que me atenta com o que eu preciso, só que eu nao gostei muito da idéia de ter dois mapeamentos, um para o pojo e outro a action…

Você não precisa de 2 mapeamentos. Faz apenas o mapeamento da “action”. Dentro dela, você terá o atributo do POJO, e na view você referencia assim

Javabuntu

gugaa_df:
Mas mapeamento apenas a minha Action como que eu vou setar os atributos do formulario direto no bean?
por exemplo <h:inputText value="#{usuarioBean.nome}" />
A idéia do brunobuild parece que me atenta com o que eu preciso, só que eu nao gostei muito da idéia de ter dois mapeamentos, um para o pojo e outro a action…

isso foi um exemplo tendo por base que você vai querer utilizar ambos casos, caso não queira o bean, deixe apenas a action e a propriedade bean dentro dela, e assim acesse action.Bean.propriedade.

abstraia as sugestões para seu problema.

gugaa_df

Ok, entendi, mto obrigado pela ajuda!
Eu gostaria de aproveitar o tópico e fazer outra pergunta.
Como faço para nao ter que ficar setando o bean <h:inputText value="#{usuarioAction.usuarioBean.nome}"
gostaria de a injeção de dependencia fizesse esse processo.

Criado 28 de setembro de 2008
Ultima resposta 29 de set. de 2008
Respostas 7
Participantes 4