Marcos Sousa’s Blog

Blog sobre desenvolvimento de software
  • rss
  • Home
  • Sobre

FacesContext em Seam Remoting calls

Marcos Sousa | June 27, 2009

Faz um tempinho que não escrevo nada por aqui. Além de projetos críticos que estou participando, estava muito envolvido na leitura de dois livros relacionados a Agile, que os comentarei em breve, e também estou escrevendo uma série de artigos para a revista Java Magazine, o primeiro sai na edição 72. A partir de agora devo publicar pelo menos uns 2 post mensais. ;)

O Seam Remoting oferece uma forma conveniente de acessar componentes backing beans via AJAX. Com uma simples anotação é possível chamar ações, intanciar objeto e etc. Porém este recurso é uma maneira limitada de acessar o contexto dos componentes e requer uma certa atenção de nós desenvolvedores. Pessoalmente, pude presenciar soluções fantásticas usando remoting e mas algumas implementações desastrosas. Fica a dica: use o remoting apenas quando os componentes AJAX existentes não solucionam um dado problema.

Por padrão, uma requisição AJAX via Seam Remoting não possui controle de transações e o contexto JSF não é criado. Para ambos os casos é possível habilitá-los. O controle de transações é mais simples, basta adicionar a anotação @Transactional com o tipo REQUIRED. Veja o exemplo:

@WebRemote @Transactional(TransactionPropagationType.REQUIRED)
public void updateUserProfile(Profile profile) {
entityManager.merge(profile);
}

Criar o contexto JSF exige algo um pouco mais avançado. Antes de iniciar a execução das ações, o contexto JSF deve ser criado, e para a sua criação é preciso o HttpServletRequest e o HttpServletResponse. Uma forma seria criando um filtro, mas acredito que não é uma boa solução. O Seam possui um recurso de ExecutionHandler que permite executar determinadas operações em requisições Remoting antes executar a ação. Este recurso usa o padrão Observer, onde o primeiro passo é criar o observer, ele precisa de implementar a interface ExecutionHandler:

public class RemotingFacesContextHandler extends ExecutionHandler {

private ServletContext servletContext;

protected FacesContext getFacesContext(HttpServletRequest request,
HttpServletResponse response) {

FacesContext facesContext = FacesContext.getCurrentInstance();

if (facesContext == null) {
FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext = contextFactory.getFacesContext(servletContext,request, response, lifecycle);
}

return facesContext;
}
@Override
public void handle(HttpServletRequest request, HttpServletResponse response)
throws Exception {
getFacesContext(request, response);
super.handle(request, response);
}
@Override
public void setServletContext(ServletContext ctx) {
this.servletContext = ctx;
super.setServletContext(ctx);
}
}

O método handle chama o método getFacesContext que é responsável por iniciar o contexto. A inicialização do FacesContext é feita por meio do método getFacesContext da classe FacesContextFactory. Além do contexto servlet, do request e do response, é necessário informar o ciclo de vida JSF.O Ciclo de vida é criado por meio da classe LifecycleFactory.

Uma vez criado o observer, basta registrá-lo. Uma das várias alternativas é registrá-lo após a inicialização usando a anotação @Observe:

@Name("registerHandler")
public class RegisterFacesContextHandler {
private static final String REQUEST_PATH_EXECUTE = "/execute";

@Observer("org.jboss.seam.postInitialization")
public void initHandler() {
RequestHandlerFactory.getInstance().registerHandler(REQUEST_PATH_EXECUTE, new RemotingFacesContextHandler());

}

}

Após inicializado o Seam (org.jboss.seam.postInitialization) o observer é registrado. Com isto você pode chamar FacesContext.getCurrentInstance() que não receberá aquele NullPointerException indesejado. ;)

Comments
No Comments »
Categories
Java, Java EE, Java Server Faces, Jboss Seam
Tags
FacesContext, Java, Jboss Seam, JSF, Seam Framework, Seam Remoting, Transactions
Comments rss Comments rss
Trackback Trackback

Vídeo Aulas: Seam Extras partes 8 e 9

Marcos Sousa | November 1, 2008

Foram publicadas no portal Java Magazine a 8ª e a 9ª parte da série de vídeo aulas sobre os extras Seam Framework.

A parte 8, faz a introdução do Seam Remoting. São mostradas as configurações necessárias e a forma de acesso a componentes SEAM. O Seam Remoting é uma forma eficiente acessar componentes SEAM usando AJAX, permitindo ao desenvolvedor resolver problemas que os componentes disponíveis no mercado não atendem. Para utilizá-lo é facil, basta apenas ter o SeamResourceServlet configurado e basta chamar os arquivos javascript ou usar a tag remote para usar os componentes, veja o exemplo:

<script type="text/javascript" src="seam/resource/remoting/resource/remote.js"></script>
<script type="text/javascript" src="seam/resource/remoting/interface.js?newsHome&amp;usersHome"></script>
<!-- Mesmo resultado em relação as 2 linhas anteriores-->
<s :remote include="newsHome,usersHome"/>

A parte 9 aborda uma feature interessante, a resolução de EL. Como uma expression language é resolvida durante a rendereização da página, para usar este recurso é preciso usar a função dentro fora da página em um arquivo Javascript. Depois é só chamar a função da seguinte forma:

Seam.Remoting.eval("#{newsHome.relatedNews}", newsCallback);
// callback function
function newsCallback(newsList) {
// read news
var area = document.getElementById("relatedNews");
for (var i = 0; i < newsList.length; i++) {
var news = newsList[i];
var span = document.createElement("span");
span.innerHTML = "<h4><a href='ViewNews.seam?newsId=" + news.getId() + "'>" +
news.getTitle() + "</a>" + news.getDescription();
area.appendChild(span);
}
}

A última vídeo aula da série mostrará chamadas em lote e a utilização de classes que não são componentes SEAM.

Parte 8
Parte 9

Arquivos Fontes

Comments
11 Comments »
Categories
Java, Java EE, Java Server Faces, Jboss Seam, Vídeo Aulas
Tags
Java, Java EE, Java Vídeo Magazine, JavaServer Faces, Jboss Seam, JSF, Seam Framework, Vídeo Aula, Vídeo Aulas
Comments rss Comments rss
Trackback Trackback

Vídeo Aulas: Seam Extras partes 6 e 7

Marcos Sousa | September 24, 2008

Foram publicadas no portal Java Magazine a 6ª e 7ª parte da série de vídeo aulas sobre os extras Seam Framework.

A parte 6, mostra todos os passos para enviar e-mails usando o módulo de integração do Seam Framework com a JavaMail. O Seam Framework possui um gerenciador de envio de e-mails e para usá-lo é bastante simples. Vejo sempre em fóruns a dificuldade que usuários tem para enviar e-mails usando uma conta SMTP do google, porém o Seam oferece diversas facilidades para configuração. O código abaixo configura o envio de e-mails usando uma conta do Google.

<mail :mail-session host="smtp.gmail.com" port="587" username="testes@marcossousa.com" password="java2008." ssl="false" tls="true"/>

Para configurar a mensagem é bem simples, basta criar um arquivo XHTML usando as tags m:message. Nos fontes há o exemplo demonstrado na vídeoaula.

Já a parte 7 aborda outro tópico interessante, a utilização de CAPTCHA. O Seam oferece uma solução básica, que gera imagens usando representação de somas simples. Na vídeo eu mostro como customizar a classe para gerar imagens mais complexas, no exemplo criado gera códigos alfanuméricos de 6 caracteres. Por padrão, basta apenas configurar o Seam Resource Servlet e usar o código abaixo:

<s :decorate id="verification">
<h :graphicImage value="/seam/resource/captcha" id="captchaimg" />
<h :inputText value="#{captcha.response}"  required="true" id="verify">
<s :validate></s>
<a :support event="onblur" reRender="verification" bypassUpdates="true" ajaxSingle="true"></a>
</h>
</s>

As próximas vídeo aulas da série abordarão as funcionalidades do Seam Remoto. :)

Parte 6
Parte 7

Arquivos Fontes

Comments
11 Comments »
Categories
Java, Java EE, Java Server Faces, Jboss Seam, Vídeo Aulas
Tags
Captcha, Java, Java EE, Java Vídeo Magazine, JavaMail, Jboss Seam, JSF, Vídeo Aula
Comments rss Comments rss
Trackback Trackback

« Previous Entries

Núvens de tags

Agile Agile Conference Facelets GET Hibernate incompatiblidades Itext Java Java EE Java Magazine Java Server Faces JavaServer Faces Java Vídeo Magazine Jboss jboss-seam-itext Jboss Developer Studio Jboss Seam JDBC type: 7 JPA JSF linux mare marébh maré de agilidade Microsoft No Dialect mapping for JDBC type: 7 Page Actions PostGreSQL RHDS rich:fileUpload RichFaces Rich Faces RichFaces 3.2 Scrum Seam-gen Seam Framework Seam PDF Spring Spring Framework TDD URL Rewrite URL User Friendly Variable Resolver Vídeo Aula XP

Meus últimos tweets

  • @acarlos1000 This site should help you: http://www.mandarintools.com/numbers.html ;) 3 days ago
  • My new toys. Now I have cool things to read. #epicwin http://yfrog.com/mwub1zj 1 week ago
  • rs RT @gisahcorrea: geralmente, acho que estar na TPM é um saco. mas daí eu olho pro tamanho que meus peitos ficam e penso "é, vale a pena." 2 weeks ago
  • Bom livro grátis escrito por quem fez o Prawn e o Ruport, para quem já sabe Ruby http://rubybestpractices.com/ (via @lucabastos) 2 weeks ago
  • Parabéns!!! RT @rodrigoy: Aha... just bought http://kanbansket.ch domain! #KanbanSketch #ProjetoAgileBrazil #Switzerland 2 weeks ago
  • @pac_man Parabéns pelo projeto, o delay é muito pequeno! Menor que o da NET! 2 weeks ago
  • Algumas fotos do mini-curso de rails ontem na Una http://tinyurl.com/25vjen4 #railsuna 2 weeks ago
  • @danielvlopes Desenvolver em rails o ajuda a se tornar um desenvolvedor melhor #railsuna http://yfrog.com/3mafappj 2 weeks ago
  • ;) @joaovitor Pegadinha do malandro em Ruby http://gist.github.com/470707 #railsuna se alguém escrever algo assim na sua equipe dá um pedala 2 weeks ago
  • Django 1.2 template application for appengine: http://tinyurl.com/36nuqzz 2 weeks ago

Anúcios

Categorias

  • .net
  • Agile
  • Agile Conference 2009
  • Artigos
  • Atualidades
  • c++
  • cinema
  • Django
  • DRY
  • Eventos
  • Flex
  • Formula 1
  • Hibernate
  • IDE
  • Inutilidades
  • Java
  • Java EE
  • Java Server Faces
  • Jboss Seam
  • linux
  • Mac OS
  • Microsoft
  • Open-source
  • Palestras
  • Python
  • RAD
  • RIA
  • RichFaces
  • Scrum
  • Software Livre
  • Spring
  • Spring Annotations
  • TDD
  • Testes
  • Uncategorized
  • Vídeo Aulas

Links recomendados

  • AJ Soluções
  • Ary Júnior
  • Erko Bridee
  • Fragmental
  • Fragmental TW
  • Guilherme Chapiewski
  • Handerson Frota
  • Jeveaux
  • Juliano Carniel
  • Onipresente
  • Passes de Letra
  • PortalJava.com
  • Rafael Carneiro
  • Rafael Pontes

DevMedia Post’s

Get Adobe Flash playerPlugin by wpburn.com wordpress themes
rss Comments rss valid xhtml 1.1 design by jide powered by Wordpress get firefox