Versão 3.5.2
Liberada a versão 3.5.2 do framework. Verifique no arquivo de Release Notes as mudanças. Baixe na seção de downloads.
Liberada a versão 3.5.2 do framework. Verifique no arquivo de Release Notes as mudanças. Baixe na seção de downloads.
Disponibilizado uma versão intermediária do Next. Esse é um nightly build, mas já foi utilizado em alguns projetos com sucesso.
Download JAR next-3.5.1-build20110420.jar
Download Source next-3.5.1-build-20110420-src.zip
Release Notes
Essa versão não foi disponibilizada na seção de downloads pois é um nightly build.
Será necessário fazer o download do arquivo 3.5.1-Full na seção de downloads.
Para utilizar essa versão substitua o JAR do Next, pelo JAR dessa versão.
(Se ao fazer o download, a extensão do arquivo vier como .zip, basta renomear para .jar)
Um novo tutorial sobre AJAX está disponível na área de Tutoriais. AJAX utilizando a tag a:call
Esse é um tutorial que demonstra algumas utilizações para a tag a:call do next. A tag a:call é uma tag que monta as funções javascript necessárias para se fazer chamadas AJAX.
Chamadas AJAX são basicamente invocações de métodos no servidor de forma assincrona, onde é possível atualizar partes da página atual ou executar operações no servidor sem a necessidadde de recarregar a página inteira. Isso economiza recursos tanto do servidor quanto do cliente, possibilitando aplicações mais ricas e ao mesmo tempo mais eficientes. É um recurso muito utilizado e dá bastante vida as páginas.
Para utilizar a tag a:call do next, é necessário que seu módulo utilize o arquivo base.jsp. Veja a documentação de referência para mais informações sobre o base.jsp. Capítulo 6 – MVC.
O primeiro passo para utilizar a tag, é importar a tag lib de ajax. Para isso, adicione no seu JSP o seguinte import.
<%@ taglib prefix="a" uri="ajax"%>
A taglib ajax possui apenas uma tag call. Dois atributos dessa tag são obrigatórios:
A tag call possui outros 3 atributos, que são opcionais.
Nesse exemplo será mostrada a chamada mais simples de chama AJAX. Será renderizado um botão que ao ser clicado envia uma requisição ao servidor, que devolve um comando alert para o browser.
package controller;
import org.nextframework.controller.Controller;
import org.nextframework.controller.DefaultAction;
import org.nextframework.controller.MultiActionController;
import org.nextframework.view.ajax.View;
@Controller(path="/modulo/ajax")
public class AjaxController extends MultiActionController{
/**
* Action default.
* Será chamada pelo browser diretamente para renderizar a página
* @return
*/
@DefaultAction
public String pagina(){
return "pagina";
}
public void actionAjax(){
/*
* A classe View possui alguns métodos para facilitar o envio de informações para o cliente.
* Basicamente cada comando representa um print na saída do response.
*/
View.getCurrent().alert("Conteúdo AJAX enviado pelo servidor");
}
}
<%@ taglib prefix="a" uri="ajax"%>
Essa é a página que utilizará AJAX.
<button onclick="chamarAjax()">Clique para efetuar o AJAX</button>
<a:call functionName="chamarAjax" action="actionAjax" />
No segundo exemplo iremos alterar o conteúdo de um DIV, com o conteúdo enviado pelo servidor.
package controller;
import org.nextframework.controller.Controller;
import org.nextframework.controller.DefaultAction;
import org.nextframework.controller.MultiActionController;
import org.nextframework.view.ajax.View;
@Controller(path="/modulo/ajax")
public class AjaxController extends MultiActionController{
/**
* Action default.
* Será chamada pelo browser diretamente para renderizar a página
* @return
*/
@DefaultAction
public String pagina(){
return "pagina";
}
public void actionAjax(){
//o eval só funcionará se a função callback do cliente for
//a função default (ou seja, callback não especificado)
View
.getCurrent()
.eval("document.getElementById(’conteudo’).innerHTML = " +
"’Novo conteúdo enviado pelo servidor’;")
.eval("document.getElementById(’conteudo’).style.backgroundColor = " +
"’#DEDE55′;"); //é possível enviar vários comandos
}
}
<%@ taglib prefix="a" uri="ajax"%>
Essa é a página que utilizará AJAX.
<div id="conteudo" style="border:1px solid red">
Conteúdo que será alterado
</div>
<button onclick="chamarAjax()">Clique para efetuar o AJAX</button>
<a:call functionName="chamarAjax" action="actionAjax" />
Nesse exemplo é mostrado como é possível passar parâmetros para o servidor.
package controller;
import org.nextframework.controller.Controller;
import org.nextframework.controller.DefaultAction;
import org.nextframework.controller.MultiActionController;
import org.nextframework.view.ajax.View;
@Controller(path="/modulo/ajax")
public class AjaxController extends MultiActionController{
@DefaultAction
public String pagina(){
return "pagina";
}
public void actionAjax(){
//pegamos o parametro enviado pelo cliente para montar a resposta
String id = getParameter("id");
View
.getCurrent()
.eval("document.getElementById(’"+id+"’).innerHTML = " +
"’Novo conteúdo enviado pelo servidor’;")
.eval("document.getElementById(’"+id+"’).style.backgroundColor = " +
"’#DEDE55′;"); //é possível enviar vários comandos
}
}
<%@ taglib prefix="a" uri="ajax"%>
Essa é a página que utilizará AJAX.
<div id="conteudo" style="border:1px solid red">
Conteúdo que será alterado
</div>
<button onclick="chamarAjax()">Clique para efetuar o AJAX</button>
<a:call functionName="chamarAjax" action="actionAjax" parameters="id=conteudo"/>
É também possível montar os parâmetros dinamicamente via código javascript, para isso utilizaremos uma construção especial no atributo parameters. Antes de clicar no botão para chamar o AJAX preencha no input o valor 1, 2 ou 3.
package controller;
import org.nextframework.controller.Controller;
import org.nextframework.controller.DefaultAction;
import org.nextframework.controller.MultiActionController;
import org.nextframework.view.ajax.View;
@Controller(path="/modulo/ajax")
public class AjaxController extends MultiActionController{
@DefaultAction
public String pagina(){
return "pagina";
}
public void actionAjax(){
//pegamos o parametro enviado pelo cliente para montar a resposta
String id = getParameter("id");
View
.getCurrent()
.eval("document.getElementById(’"+id+"’).innerHTML = " +
"’Novo conteúdo enviado pelo servidor’;")
.eval("document.getElementById(’"+id+"’).style.backgroundColor = " +
"’#DEDE55′;"); //é possível enviar vários comandos
}
}
<%@ taglib prefix="a" uri="ajax"%>
<%@ taglib prefix="n" uri="next"%>
Essa é a página que utilizará AJAX.
<div id="conteudo1" style="border:1px solid red;">
Conteúdo que será alterado 1
</div>
<div id="conteudo2" style="border:1px solid green;">
Conteúdo que será alterado 2
</div>
<div id="conteudo3" style="border:1px solid blue;">
Conteúdo que será alterado 3
</div>
Digite qual conteúdo deseja alterar (1, 2 ou 3): <n:input type="integer" value="1" id="numero"/>
<button onclick="chamarAjax()">Clique para efetuar o AJAX</button>
<a:call functionName="chamarAjax" action="actionAjax" parameters="javascript:’id=conteudo’+document.getElementById(’numero’).value"/>
Também é possível alterar a montagem dos parametros para delegar a uma função javascript, conforme exemplo:
<a:call functionName="chamarAjax" action="actionAjax" parameters="javascript:montarParametros()"/>
<script type="text/javascript">
function montarParametros(){
return ‘id=conteudo’ + document.getElementById(’numero’).value;
}
</script>
Como visto nos exemplos a chamada ajax no servidor é feita de forma bem simples. Basicamente a tag a:call monta a função javascript e você apenas chama na sua página onde for necessário. No servidor a classe View, possui alguns métodos utilitários para escrever no response.
O servidor Tomcat, por padrão não vem com o sistema de log bem configurado. Se acontece uma exceção no sistema por exemplo, ela não é mostrada. Quando estiver utilizando o Next e como servidor o Tomcat, você poderá fazer a configuração do log através do arquivo log4j.properties esse arquivo deve ficar na raiz dos seus fontes (pasta src). Você pode usar como conteúdo desse arquivo o código abaixo, que mostrará mensagens importantes no log.
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
# Set the hbm2ddl logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.hibernate.tool.hbm2ddl=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4p: %c{1} %m%n
A maior revista sobre Java do país, que agora se chama MundoJ, está na edição 42 com um artigo sobre o Next Framework. O artigo está em formato de tutorial, bastante detalhado, sobre como criar uma aplicação do tipo Blog. Abrange vários assuntos, desde a criação de CRUDs, validação até upload de arquivos.
Parabéns e obrigado a todos os usuários do Next Framework que possibilitam o crescimento e a qualidade da ferramenta.
A documentação do Next Framework foi atualizada para refletir as mudanças da versão 3.5.1 do framework. Basta acessar a seção de documentação do site.
Liberada mais uma versão do framework no dia 19/05/2010. Veja o release notes da versão para saber quais foram as atualizações. Em breve a documentação será atualizada para refletir as mudanças. As principais evoluções dessa versão são:
Foi publicado um link para o lançamento do Next Framework no site do UOL Tecnologia, dia 03/03/2010. http://tecnologia.uol.com.br/programacao
Chegamos ao release final da versão 3.5.0 do Next Framework. Obrigado pela colaboração de todos no projeto. Para baixar o next vá atá a seção de downloads. Veja a documentação e tutoriais para explorar ao máximo essa poderosa ferramenta. Aproveite para se cadastrar no fórum e trocar a experiencia com outros usuários.