Testando JavaEE 6 com Glassfish e Eclipse
Tagged: annotation, Eclipse, EJB, EJB3, glassfish, Java, javaee6, JEE, Programação, servlet.
Neste post, vou mostrar algumas novidades do Java EE 6.
Eu vou usar os seguintes softwares:
Glassfish v3
Eclipse Galileo JEE Edition
Depois de instalá-los, vou criar um Dynamic Web Project no Eclipse chamado de FirstProjectJEE6:
Agora vou substituir o conteúdo do arquivo web.xml por este abaixo:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
Para compilar nosso projeto, precisamos adicionar um jar externo chamado javaee.jar ao projeto (Build Path), o arquivo jar pode ser encontrado em [glassfish_directory]/glassfish/lib/javaee.jar
Criei também um script ant para fazer o deploy da nossa aplicação diretamente no glassfish. Este script deve ser salvo na raiz do projeto, salvei ele com o nome de build.xml. A seguir segue seu conteúdo:
<?xml version="1.0" encoding="UTF-8"?>
<project name="FirstProject JavaEE 6" basedir="." default="deploy">
<property name="warfile" value="FirstProject" />
<target name="create">
<war destfile="${warfile}.war" webxml="WebContent/WEB-INF/web.xml" update="true">
<classes dir="build/classes" />
<fileset dir="WebContent">
<exclude name="WEB-INF/web.xml" />
</fileset>
</war>
</target>
<target name="copy">
<copy todir="/Users/rodrigolazoti/Programs/glassfishv3/glassfish/domains/domain1/autodeploy" overwrite="true">
<fileset dir=".">
<include name="*.war" />
</fileset>
</copy>
</target>
<target name="deploy">
<antcall target="create" />
<antcall target="copy" />
</target>
</project>
Note que esse local:
/Users/rodrigolazoti/Programs/glassfishv3/glassfish/domains/domain1/autodeploy
Deve ser substituído por:
[your glassfish]/glassfish/domains/domain1/autodeploy
Agora, vamos codificar um pouco, primeiro vamos criar dois EJB’s usando um pouco da nova especificação.
Vou criar um EJB Stateless e um EJB Staleful, o stateful servirá apenas para representar o número de requisições feitas e o stateless servirá para retornar alguma mensagem para o usuário.
Esse é o código do EJB Stateless:
package br.com.rodrigolazoti.firstproject.service;
import javax.ejb.Stateless;
@Stateless
public class MyStatelessSessionBean {
public String createMessage( String username ) {
String message = "Hello World, ";
if ( username != null && !"".equals( username.trim() ) ) {
message += username + "!";
}
else {
message += "stranger!";
}
return message;
}
}
E este é o código do EJB Stateful:
package br.com.rodrigolazoti.firstproject.service;
import javax.ejb.Stateful;
@Stateful
public class MyStatefulSessionBean {
private int amountOfrequests = 0;
public int getAmountOfrequests() {
return ++amountOfrequests;
}
}
Note que em ambos EJB’s, não foi necessário criar interfaces locais ou remotas.
Com nossos EJB’s prontos, vamos criar um servlet para responder ao seguintes métodos http GET e POST.
package br.com.rodrigolazoti.firstproject.controller;
import java.io.IOException;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.rodrigolazoti.firstproject.service.MyStatefulSessionBean;
import br.com.rodrigolazoti.firstproject.service.MyStatelessSessionBean;
@WebServlet( name = "MyServlet", urlPatterns = { "/hello" } )
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = -2206981309178199835L;
@EJB
private MyStatefulSessionBean myStatefulSessionBean;
@EJB
private MyStatelessSessionBean myStatelessSessionBean;
@Override
protected void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
String message = myStatelessSessionBean.createMessage( null );
request.setAttribute( "message", message );
int amountOfRequests = myStatefulSessionBean.getAmountOfrequests();
request.setAttribute( "amountOfRequests", amountOfRequests );
request.getRequestDispatcher( "/hello.jsp" ).forward( request, response );
}
@Override
protected void doPost( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
String username = request.getParameter( "username" );
String message = myStatelessSessionBean.createMessage( username );
request.setAttribute( "message", message );
int amountOfRequests = myStatefulSessionBean.getAmountOfrequests();
request.setAttribute( "amountOfRequests", amountOfRequests );
request.getRequestDispatcher( "/hello.jsp" ).forward( request, response );
}
}
E finalmente, vamos criar os arquivos jsp. O arquivo index.jsp servirá pra fazer as chamados ao servlet e o arquivo hello.jsp irá mostrar o resultado do servlet.
Conteúdo do arquivo index.jsp:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="author" content="Rodrigo Lazoti"/>
<title>First Java EE 6 Example</title>
</head>
<body>
<p><a href="hello">Execute Servlet (GET)</a></p>
<hr width="100%" noshade="noshade"/>
<form action="hello" method="post">
<p>Name:<input type="text" name="username"/></p>
<p><button type="submit">Execute Servlet (POST)</button></p>
</form>
</body>
</html>
E o conteúdo do arquivo hello.jsp:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="author" content="Rodrigo Lazoti"/>
<title>First Java EE 6 Example</title>
</head>
<body>
<h2>Result: ${requestScope.message}</h2><br/>
<h3>This servlet was executed ${requestScope.amountOfRequests} time(s).</h3><br/>
<hr width="100%" noshade="noshade"/>
<h4><a href="index.jsp">Back to main page</a></h4>
</body>
</html>
Pronto, nosso exemplo já esta pronto e pode ser testado. Com vimos algumas novidades como:
- Interface local e remota são opcionais no EJB 3.1.
- No EJB 3.1, vôce pode empacotar seus EJB’s em arquivos WAR junto com componentes da camada web. Você não precisa ter sua classes EJB definidas em um arquivo ejb-jar.
- Agora as annotations podem ser usadas em mais tipos de componentes Java EE e o conjunto de anotações usados para injeção de dependência foi padronizada.
- Ao invés de criar deployment descriptors, você pode anotar as classes para especificar que ela é um servlet.
Este exemplo criado está disponível no github: http://github.com/rlazoti/tutorial-javaee6-first-project
Related Posts
ola Rodrigo,
Legal o post, mas se os codigos tivessem formatado, seria bem melhor.
fica ai uma sugestao!
abracos,
Camilo, tudo bem contigo?
Os codigos estao formatados sim, acho que pode ter ocorrido algum problema no carregamento da pagina quando voce acessou.
De qualquer forma obrigado pela dica.
[]‘s
Caro Rodrigo,
Nesse artigo você usou o sistema operacional MAC?
Se sim, acho que pode me ajudar.
Fiz o dowload da versão 6 do Java EE no site http://java.sun.com/javaee/downloads/index.jsp. Só que quando tento instalar dá o seguinte erro:
Welcome to GlassFish V3 installer
Using the user defined JAVA_HOME : /usr
Entering setup…
Unable to find a $JAVA_HOME at “/usr”, continuing with system-provided Java…
SwixML 1.5 (#144)
SEVERE:
Expression NOME_DO_PRODUTO is undefined on line 86, column 289 in /templates/components.ftl.
SEVERE: Erro fatal
Erro fatal Argumentos=[-p, Default-Product-ID=glassfish, -p, Pkg-Format=zip, -p, Logs-Location=/tmp, -p, Platform-Plugin-Path=/tmp/install.042810095942/install/lib/platforms, -p, Provider-Path=/tmp/install.042810095942/install/lib/providers, -p, Answer-Files=,file:///tmp/install.042810095942/install.properties, -p, Log-Level=INFO, -p, Media-Location=file:///tmp/install.042810095942/install/metadata/, -p, Installable-Unit-Path=file:///tmp/install.042810095942/Product/] : Inicializando Orchestrator Causado por: Erro ao iniciar o assistente Causado por: Erro ao renderizar SWIXML Quadro=content area Causado por: Erro ao processar modelo swimxl Causado por: Expression NOME_DO_PRODUTO is undefined on line 86, column 289 in /templates/components.ftl.
Sabes o que pode ser?
Paulo, tudo bem?
Fiz usando Mac OS X sim.
Entao, uma dica que dou é baixar o Glasshfish Enterprise V3 no formato zip e instala-lo onde quiser.
Eu fiz assim e está funcionando perfeitamente.
[]‘s
Boa tarde Rodrigo,
o post ficou bem legal e me ajudou a sanar algumas duvidas! Vlw parabéns.