Protocolo de comunicacao Java custom tag x Tag Handler?
6 respostas
P
Pittella
Ola pessoal… pergunta:
Vamos utilizar aqui Java custom tags para uma solucao…
Mas a pagina que ira conter a Custom taga java nao roda no mesmo servidor que a Tag handler roda…
(Temos diferentes projetos web de diferente sub-domains da empresa que vao usar essa custom tag…e a Tag handler (solucao Server-side) ficaria em outro servidor…).
Eu entendi que a pagina JSP faz um include do TLD…e que a JSP eh na vdd um Servlet rodando no servidor…mas se a minha Tag Handler esta em outro servidor…
Mas eu ainda nao entendi qual o protocolo de comunicacao usado se a Tag Handler nao eh ‘local’ ao servet…
Por exemplo (perguntas):
corro o risco de ter essa comunicacao bloqueada por um firewall ?
Corro o risco de na minha pagina eu injetar informacao que vai ser enviada pela Custom tag para o outro servidor que contem a Tag Handler e ter problema de seguranca?
As custom tags funcionam exatamente do jeito que você está descrevendo. Uma JSP, como você já sabe, é convertida em um Servlet, que envia para um OutputStream o HTML gerado. Quando uma custom tag é encontrada, tudo o que o container faz é incluir uma chamada do tagHandler no Servlet gerado.
O resumo da obra é que a custom tag é necessária no momento da compilação JSP -> Servlet e que o TagHandler é invocado pelo Servlet para gerar o HTML. Sendo assim, não existe “protocolo de comunicação” entre uma coisa e outra. É preciso que a taglib esteja no mesmo servidor que a sua aplicação, obrigatoriamente, isso se o .jar não precisar dentro da pasta WEB-INF/lib.
P
Pittella
Oi mendes,
Sim entendo…verdade…!!! Obrigado pela explicacao!
outra coisa:
1) Com eu mencionei na minha explicacao, eu teria paginas de diferente projetos usando essa minha tag…
Neste caso, como vc mencionou, a classe java (Tag handler / .jar ) teria que ser replicada para todos os os servidores aonde o Servlet e a Custom tag rodam certo ?
Nao faria sentido pensar que a Tag Handler (.jar) ficaria em um servidor unico entao…
nao existiria uma forma de centralizer a Tag Handler jar para todos projetos?
2) Imagina que a minha Tag Hanlder toda vez que chamada, teria que chamar um Servico (Webservice)…
Esse WebService estaria no mesmo servidor que eu tinha inicialmente entendido que a minha Tag Handler (.jar) teria que ficar…
Entao ficaria um cenario mais ou menos assim…
Usuario chama a pagina JSP> JSP convertido em Servlet > Servlet carrega Tag handler e roda doTag() > doTag tem uma implementacao que faz uma chamada externa para meu servidor …
Isso esta correto, certo?
Obrigado novamente,
rmendes08
Sim. Eu iria além, eu distribuiria o .jar da taglib com cada projeto, pois geralmente o desenvolvedor não se tem acesso ao tomcat (pensando que a aplicação será hospedada por terceiros). Distribuindo com cada projeto é uma forma que a aplicação não vai quebrar por falta da taglib.
Chamar um WebService no doTag() … isso até funciona, mas com certeza não vai ficar bom. Isso porque você vai submeter o tempo de carga da sua página ao tempo de resposta e processamento do WebService. Imagine por exemplo que o serviço esteja fora do ar. Se o timeout do serviço for uns 30s o usuário da sua página vai ficar esses 30s olhando para uma página em branco no navegador.
P
Pittella
Mas a ideia e que eu pudesse atualizar a logica da minha TagHandler e pudesse refletir essa atualizacao para todos os outros projetos/paginas.
Estranho, se eu quero trabalhar desta forma, significa que a a Tag handler (nao a Custom tag) nao foi desenhada para ser reusada por diferente projetos em diferente dominios…tendo que replicar sempre ?
1.1) …ainda pensando se teria uma outra forma de fazer alguma coisa para solutionar o problema do topico 1).
Eu poderia ter toda a logica em em outro component …remoto…mas dai eu caio na situacao 2 abaixo…
Pois e, concordo. Maaass…se eu consider garantir SLA para esse servico (high availability) na minha empresa…vc acha que o cenario abaixo funcionaria:
JSP > Servlet executa TagHandler > TagHandler chamada remota para um servico que le um arquivo XML…
Eu nao posso cortar caminho e fazer a Tag HAndler ler o XML…esse rquivo nao pode ser replicado…e seria um caos para atualizar ele quando necessario…eu realmente preciso ter uma logica unificada no server…
Alternativa:
Pagina e carrega no browser (depois do processamento JSP) > Javascript / Ajax (client logic with asynch call) > chama meu servico e retorna um XML como resposta para fazer parser no browser.
Desta forma eu nao tenho o meu request hanging durante o processamento da pagina…e talvez isso nao impacte o page-loading pq minha chamada js/ajax seria asynchrona…
Faria sentido ? Alguam outra alternativa?
Obrigado novamente!!!
rmendes08
Ora, isso é assim com toda biblioteca. Se você distribui os .jar’s do Hibernate3 com o seu projeto eles não serão atualizados automaticamente para a versão 4. Caso contrário, você correria um grande risco da sua aplicação parar de funcionar. O mesmo vale para as taglibs. Elas são como uma .jar qualquer da sua aplicação. Lembre-se que taglibs são componentes de view, sendo assim, a única lógica que um tagHandler deve conter é a lógica para desenhar o componente, sendo que lógica de busca de dados deve ficar de fora.
Ajax seria uma boa opção, não fosse por um porém. Pelo que eu pesquisei, não há um componente onload em tags como div ou span por exemplo, de forma que você pudesse encapsular a lógica no componente.
Sendo assim, eu seguiria com a separação clara de responsabilidade. Na tag hadler eu simplesmente desenho o componente e deixo para buscar os dados através de Ajax ou trago junto com o restante dos dados da página.
P
Pittella
Ola, Mendes…desculpe pela demora e obrigado pelo follow-up!!
Sim, faz sentido.
Na vdd eu preciso de uma logica server-side aonde eu pudesse receber requests de diversas paginas e pudesse gerar codigo javascript para essas paginas processarem. Pensei nas CUstom tags pq elas me dariam uma forma pratica de renderizer o javascript e ter o browser automaticamente rodando o codigo.
Alguma outra alternativa? Se eu fizer isso com javascript-ajax + Servlet/WS …a unica forma seria retornar um XML/JSON com o codigo js para fazer o parser? como chamo a funcao javascript depois de fazer o parser?