Business Delegate e Service Locator

Rodrigo,

Se você quer usar Struts, ótimo, use.

Se você vai usar Struts porque é ‘padrãod e mercado’, se for esperto vai aprender a tecnologia, mas não se agarrar à ela como o cálice de salvação.

Se for procurar a melhor solução, vai saber que o Struts não é.

Deixa eu te contar uma historinha.

Se você olhar alguns posts aqui de alguns anos atrás, vai ver que muita gente (inclusive eu) recomendava o Struts. O que as pessoas diziam?

As pessoas que realmente vivem tecnologia, que gostam e procuram as melhores soluções já estavbam de saco cheio de saber que o modelo Servlet+JSP estava obsoleto para aplicações que exigem um pouco mais de elaboração.

De tanto encher o saco, as pessoas começaram a usar e gostar do Struts. Começou a se tornar o ‘padrão da indústria’. Emrpesas como as citadas acima começaram a usar. Pena que isso acotneceu há poucos meses, e agora o Struts parou no tempo. A API nunca foi grande coisa, mas ela simplesmente está fora da realidade atual, do que se procura no desenvolvimento de sistemas.

Você ouve a galera aqui e em tantos outros lugares falando em IoC, containers leves, fora-EJB, fora-Struts… amanhã isso tudo vai ser padrão de mercado, porque quem procura saber o que fala acaba ditando a moda.

Eu posso te citar uma lsita ainda maior de emrpesas que usam ASP ou CGI… você iria usar isso por causa desta lista?

Ah, de onde você tirou esse seu 100%? Me manda um link apra essa informação, por favor.

Raramente eu vejo um clietne requisitar Struts, C/C++, java… na verdade eu muito mal vejo cliente requisitando computadores. Eu acho que eles já tem muita obrigação requisitando processos e domínios de negócio para se preocupar com isso, que não vale nada para eles.

Pcalcado,

Muito legal sua resposta.

Antes de começar, o 100% foram dos que eu conheci. Nem de longe somam uma amostra relevante da população para se basear qualquer afirmação científica. É, tipo assim… “eu acho”.

Agora respondendo:

Antes mesmo de começar a usar o Struts eu já sabia que existia soluções melhores. No próprio livro do Programming Jakarta Struts, fala sobre várias alternativas… Então nesta ocasião eu escolhi o Struts. Por que: documentação eh muito boa (I love the Apache Project) e já havia uma tendência do mercado graças ao suporte oferecido pela IBM.

Alias, permita me um comentario pessoal, mas o suporte da IBM muda a forma com que o mundo enxerga uma tecnologia. Foi assim com os PCs, com o java (j2ee), etc.

De fato, existem tecnologias maneirissimas por ai. Ontem mesmo estava falando com um amigo meu que desenvolve em Oracle sobre o prevayler, e a ideia de manter objetos em memoria. E eu sei que o banco de dados como a gente conhece ja eh uma coisa ultrapassada, mesmo nao existindo algo que o possa substituir assim, sem maiores retoques. E este meu amigo concorda com isso.

Dai a abandonar o banco de dados porque existem ideias melhores, nao rola! Claro que empresas pessoais que nao tem requisitos de nenhuma diretoria iberoamericana nem diretriz mundial, e/ou coisas do genero, podem arriscar caminhos maisalternativos(modernos).

Para ter-se uma ideia do que eh “modernidade”: eh sempre um sufoco convercer as pessoas a utilizarem as surrogate keys. O mundo acredita, pasme!, que isto eh " totalmente fora da realidade".

Nao meu amigo… sem o suporte de pelo menos alguma empresa grande eh muito dificil escolher por alguma tecnologia e o que eu vejo neste sentido eh que os grandes vendors de servidores de aplicacao estao no auge do suporte ao Struts (IBM Websphere, Bea Weblogic Workshop, Oracle Developer, Exadel) e migrando para um suporte ao JSF.

(acho que ja escrevi metade do que queria escrever… mas vou dar outra pausa)
(versão 0.2 _ :smiley: )

Olá galera ! gostei da foquinha ! Queria mas detalhe de como surgiu essa grande e ilária idéia.

Opinião sobre o Struts…

a anos se vc fosse em uma entrevista e falasse que não conhecia VB (lembra Microsoft Visual Basic tinha o 2, 3, 4, service pack n…) tava fora.

e hj é a mesmo coisa com o struts…

se vc usa .do coitado tá no passado

se vc usa .faces tá ficando ninja e olhando pro futuro.

opnião própria sem preconceito pois struts é como mulher feia e pantufa a gente usa em casa mas tem vergonha de sair na rua kkkkkkkkk

Pelo que li nas discussões, acho que esse aqui é o link de onde começou a história maldosa no qual incluiram as focas!

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

Se usarmos spring ou webwork Deus salva as foquinhas???

rsrs…

Até alguns dias eu também era adepto dos odiadores do struts, pois o achava muito fraco na camada de view.
(percebo que muita gente não dá importancia, mas o que o usuário vê é a view)
Mas conheci a extensão struts layout.
Parece ser excelente. Não usei mais pelo que dá para perceber aumenta muito a produtividade forcenedo vários componentes.
Eu concordo que o struts complica o simples.

Mas o tópico tomou outro rumo…

Legal jprogramer,
agora entendi

é que nunca tinha usado struts dessa maneira achei

achei estranha a arquitetura do Business Delegate

um uso simples que adoto é esse

import java.util.ArrayList;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import java.io.*;

public class ImprimeVendasAction extends Action {
	/* (non-Javadoc)
	 * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public ActionForward execute(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response) {
		// FAZER Auto-generated method stub
		this.salvaVendas(request);

		return mapping.findForward("view");
	}
	public void salvaVendas(HttpServletRequest request ) {
		ArrayList list =
			(ArrayList) request.getSession().getAttribute("listaVendas");
		ListaVendas obj;
	//implement interator

	}

}

[quote=jprogrammer]Mas conheci a extensão struts layout.
Parece ser excelente. Não usei mais pelo que dá para perceber aumenta muito a produtividade forcenedo vários componentes.
Eu concordo que o struts complica o simples.[/quote]

Pra isso tambem ja tem resposta, o Sitemesh :slight_smile:

Dá uma olhada nisso.
http://struts.application-servers.com/doc/index.html

Eu achei bem bacana.
Agora o que o seu código tem a ver com Business Delegate ?

Mas Business Delegate serve para instanciar as classes de dominio e regras de negócio.

No meu modo de ver Business Delegate:

class Funcionarios
{
public void inserir(Funcionario func)
{
// aqui regras de negócio e validações
FuncionarioDAO.inserir(func);
}

}

class BusinessDelegate
{
public Funcionarios getFuncionarios()
{
// se estiver instancia local
return new Funcionarios();

   // senão chama Service Locator para criar objeto de EJB, Web Service, etc

}
}

BusinessDelegate businessDelegate = new BusinessDelegate ()
Funcionarios funcionarios = businessDelegate.getFuncionarios();
Funcionario func = new Funcionario();
func.setCodigo(1);
func.setNome(“Maria”)

funcionarios.inserir(func);

Focao: desse jeito, vc esta acoplando a Action e a especificacao de Servlets (ao usar HttpServletRequest etc). O que voce faria caso precisasse rodar isso sem subir as classes num web container, por exemplo, pra testes unitarios?

É por essa e outras que existe a acampanha.

import java.util.ArrayList;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import java.io.*;

public class ImprimeVendasAction extends Action {
	/* (non-Javadoc)
	 * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public ActionForward execute(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response) {
		// FAZER Auto-generated method stub
		this.salvaVendas(request);

		return mapping.findForward("view");
	}
	public void salvaVendas(HttpServletRequest request ) {
		ArrayList list =
			(ArrayList) request.getSession().getAttribute("listaVendas");
		ListaVendas obj;
	//implement interator

	}

}
import java.util.ArrayList;
....

public class ImprimeVendasAction extends ActionSuport {

    private List listVendas = null;

    public void salvaVendas() {
      //Delega o acao de salvar a lista de vendas.
    }
    public void setListVendas(List listVendas) {
      this.listVendas = listVendas;
    }
}

Que diferença.

:mrgreen:

putz cv ! O ruim o o bom de usar uma ide poderosa é isso

no JDeveloper 10g

vc falow de como subir as classes num web container, por exemplo, pra testes unitarios.

isso é trivial e transparente. por debug ou por JUnit

Apesar que eu não acho legal o delagate om problema é Abstrair os clientes da complexidade de comunicação remota com componentes de serviços de negócio (Business services).

Mas valeu gostei muito da galera daqui e dos foruns que rola

mas ainda teimo que seria mais elegante assim

ComponeteNegocioBusinessDelegate.java
...
import br.ufrj.nce.tees4.ComponenteNegocio;
import br.ufrj.nce.tees4.ComponenteNegocioHome;
import br.ufrj.nce.tees4.servicelocator.ServiceLocator;
public class ComponeteNegocioBusinessDelegate {
private static final String JNDI_NAME_COMPONENTE_NEGOCIO = "ejb/br/ufrj/nce/tees4/ComponenteNegocioHome";
public String metodoNumeroUm() throws BusinessDelegateException, ExcecaoNegocio1
	{
	ComponenteNegocio bean = this.getBean();
...	return bean.metodoNumeroUm(); ...	}
private ComponenteNegocio getBean() throws BusinessDelegateException
	{
	ComponenteNegocio bean; ...
	ServiceLocator sl = new ServiceLocator();
	ComponenteNegocioHome home = (ComponenteNegocioHome)sl.getRemoteHome(JNDI_NAME_COMPONENTE_NEGOCIO,ComponenteNegocioHome.class);
	bean = home.create(); ... 	return bean; 	} }

aí sim estariamos reduzindo o acoplamento entre os clientes da camada de apresentação e os serviços de negócios
ocultando detalhes de implementação dos serviços de negócios, como detalhes de pesquisa e acesso da arquitetura EJB

e olha isso que chique nu úrtimo como diz uma camarada mineirinho

ComponenteNegocioBean.java
...
public class ComponenteNegocioBean implements javax.ejb.SessionBean {
...	
	public String metodoNumeroUm() throws ExcecaoNegocio1
	{
		return "Método Número 1 !!";
	}
	
	public String metodoNumeroDois() throws ExcecaoNegocio2
	{
		return "Método Número 2 !!";
	}

}

abrçs a todos

Putz nada seria válido sem o

ServiceLocator.java

...

public class ServiceLocator {
...
public ServiceLocator() throws ServiceLocatorException {
	try {
		ic = new InitialContext();
...
	}
public EJBHome getRemoteHome(String jndiHomeName, Class className)
	throws ServiceLocatorException {
	EJBHome home = null;
	try {
		Object objref = ic.lookup(jndiHomeName);
		Object obj = PortableRemoteObject.narrow(objref, className);
		home = (EJBHome) obj;
		} catch (NamingException ne) {
		throw new ServiceLocatorException(ne);
		}
		return home;
	} ... }

até :slight_smile:

[quote=Focão]putz cv ! O ruim o o bom de usar uma ide poderosa é isso

no JDeveloper 10g

vc falow de como subir as classes num web container, por exemplo, pra testes unitarios.

isso é trivial e transparente. por debug ou por JUnit
[/quote]

A pergunta foi bem simples: como voce roda um teste unitario em uma Action do Struts sem subir um container e sem fazer todo tipo de malabarismo com mocks, e a resposta tambem eh simples: nao da, e eh por essas e outras que pessoas que usam Struts de proposito (ou seja, aqueles que nao sao forcados a usa-lo por PHBs) acabam desenvolvendo habitos pouco ortodoxos, como andar pelo escritorio batendo o proprio saco nas quinas dos cubiculos.

Nao venha me dizer que usar JDeveloper ajuda nessa situacao, pq merda perfumada continua sendo… merda.

O que vc prefere que eu use pra te bater por isso, um PicoContainer, um Spring ou um Hivemind? :mrgreen:

Pessoas, encham o Focao de links sobre IoC e DI, ele precisa ser catequizado :stuck_out_tongue:

hehe Focão, dá um procurada por Inversion of Control e Proxy Pattern.

Aqui alguns links:


O cv é meio metidinho mesmo ( :XD: ), mas não me lembro uma vez que me arrependi de seguir alguma sugestão dele, assim como de alguns outros aqui no fórum :thumbup:

Pra teste unitario nao ajuda nao. Tambem uso ele e nesse ponto nao faz muita diferenca do restante de IDE.
Por sinal pra JUnit nao tem como o Eclipse, mas tambem ja era de se esperar por isso neh. :mrgreen:

]['s

[quote=cv]
A pergunta foi bem simples: como voce roda um teste unitario em uma Action do Struts sem subir um container e sem fazer todo tipo de malabarismo com mocks, e a resposta tambem eh simples: nao da, e eh por essas e outras que pessoas que usam Struts de proposito (ou seja, aqueles que nao sao forcados a usa-lo por PHBs) acabam desenvolvendo habitos pouco ortodoxos, como andar pelo escritorio batendo o proprio saco nas quinas dos cubiculos.

Nao venha me dizer que usar JDeveloper ajuda nessa situacao, pq merda perfumada continua sendo… merda.[/quote]

E se eu dizer que palavras de baixos calão não ajudam a convencer ninguém !? Para CV! você sabe como argumentar… Se não tá afim de usar bons argumentos não precisa nem postar nada (é pelo menos mais amistoso, mais agradável ver um forum assim).

NOTA IMPORTANTE: NÃO DEFENDO O STRUTS…
ASSIM MESMO SE QUISER FAZER UM TESTE DE UNIDADE…
NÃO PRECISA DAS CENAS DE MASOQUISMO, SÓ UM FRAMEWORK (StrutsTestCase).

// Pre-condincao
StrutsTestFrame myStruts = new StrutsTestFrame("struts-config.xml");
request = myStruts.getRequest();
response = myStruts.getResponse();
request.set( qualquer coisa);
MyActionForm form = new MyActionForm();
form.set(qualquer coisa);
MyAction action = new MyAction();

// invoque o test
ActionForward find = action.execute(request, response, form, mapping); 

...

Bom, o fato de vc precisar de um framework a mais pra fazer testes unitarios - que nao deveriam depender de nada, especialmente de um framework - ja diz bastante coisa, nao? :wink:

Compare isso com o teste unitario de uma Action do WebWork, onde voce so precisa do JUnit ou do TestNG :slight_smile: