Professional Documents
Culture Documents
J2EE
Referncias ........................................................................... 71
Histrico
Desde a adoo da tecnologia Java/J2EE pela Caixa no fim do ano 2000,
muitos sistemas foram desenvolvidos e implantados sem seguir corretamente as
recomendaes da Sun Microsystems e JavaSoft para o desenvolvimento Java,
fazendo com que a sustentao desses sistemas seja extremamente onerosa do
ponto de vista humano e tecnolgico.
Objetivo
Atualmente, com a escassez de recursos tecnolgicos e o alto ndice de
turn-over de pessoal nas equipes de desenvolvimento, homologao e
sustentao, se faz altamente necessrio que a Caixa tenha um manual
tecnolgico de boas-prticas e padres para Java/J2EE, visando garantir a
qualidade do software e andamento dos processos de desenvolvimento,
homologao e implantao, previsto na MDS, e que a sustentao desses
sistemas seja mais fcil.
Este manual tem como objetivo reunir os documentos criados pela equipe
da Sun desde Maio/2004 que busca a padronizao de componentes de software
Java/J2EE, seguindo as boas prticas da tecnologia Java, da plataforma J2EE e
do ambiente de Servidores de Aplicao e Sun Java System Web Server, visando
garantir a implantao e sustentao de aplicaes J2EE.
O ambiente J2EE por ser um pouco mais complexo que seus primos, exige
que aplicaes baseadas nessa plataforma tenham um processo de arquitetura
melhor elaborado e realizado, e que realmente suporte a qualidades no
funcionais de um software.
HTML: http://www.w3.org/MarkUp/
CSS: http://www.w3.org/Style/CSS/
JavaScript: http://www.w3schools.com/js/ - http://javascript-reference.info/ -
http://www.mozilla.org/js/language
Esta camada coordena o fluxo da camada Client, ou seja, o que deve ser
recebido, direcionado e exibido a cada transao do usurio com o sistema. (J2EE
Core Design Patterns)
Obs: Deve-se utilizar TagLibs para a construo dos JSPs. A Caixa no mais
valida sistemas que utilizem scriptlets.
No caso de uma aplicao Java Stand-Alone, este tipo de Client, por estar
suportado pela plataforma J2SE, pode incorporar um grande conjunto de
funcionalidades e inteligncia.
Na figura abaixo vemos como esta camada utilizada e quais servios ela
usa:
No application.xml definimos:
<?xml version="1.0"?>
<application>
<description>Application description</description>
<display-name>estore</display-name>
<module>
<ejb>estoreEjb.jar</ejb>
</module>
<module>
<web>
<web-uri>estore.war</web-uri>
<context-root>estore</context-root>
</web>
</module>
<security-role>
<description>Sales Manager</description>
<role-name>SALES_MANAGER</role-name>
</security-role>
</application>
<sun-application>
<web>
<web-uri>estore.war</web-uri>
<context-root>estore</context-root>
</web>
<pass-by-reference>true</pass-by-reference>
<unique-id>-1</unique-id>
<security-role-mapping>
<role-name>ADMIN</role-name>
<group-name>LDAP_ADMIN</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>SALES_MANAGER</role-name>
<group-name>LDAP_SALES</group-name>
</security-role-mapping>
</sun-application>
<distributable/>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>samples.AdminServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SalesServlet</servlet-name>
<servlet-class>samples.SalesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SalesServlet</servlet-name>
<url-pattern>/sales</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
<sun-web-app>
<security-role-mapping>
<role-name> ADMIN </role-name>
<group-name> LDAP_ADMIN </group-name>
</security-role-mapping>
<security-role-mapping>
<role-name> SALES_MANAGER </role-name>
<group-name> LDAP_SALES </group-name>
</security-role-mapping>
<cache max-entries="4096" timeout-in-seconds="30" enabled="true">
<default-helper/>
</cache>
<jsp-config/>
</sun-web-app>
Exemplo:
Notas:
<resource-ref>
<description>Mail Connector Name</description>
<res-ref-name>mail/ApplicationMailSession</res-ref-name>
<res-type>javax.mail.Session</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<web-app>
<session>
<description>Descrio do EJB</description>
<display-name>Nome de Exibio</display-name>
<ejb-name>EJBName</ejb-name>
<home>homeInterface</home>
<remote>remoteInterface</remote>
<ejb-class>beanClass</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<resource-ref>
<res-ref-name>mail/ApplicationMailSession</res-ref-name>
<res-type>javax.mail.Session</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</session>
</enterprise-beans>
Como todo recurso J2EE, o conector de e-mail deve ter um nome nico
<jndi-name>, pois ele poder ser usado e compartilhado por mais de uma
aplicao. O <jndi-name> usado pelas aplicaes para localizar o servio de e-
mail.
http://docs.sun.com/source/819-0215/javamail.html
Generics
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
For-Each Loop
http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
Annotations
http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html
Autoboxing/Unboxing
http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html
http://java.sun.com/j2se/1.5.0/docs/guide/language/index.html
Definies de HA
Critrios de mapeamento
Levando em conta como o SJSAS8 trata a distribuio de sesso e contexto
para as aplicaes Web, um JSP tem a necessidade de estar mapeado se e
somente se:
Ex1:
File: teste.jsp
Ex2:
File: teste2.jsp
Ex3:
File: teste3.jsp
Ex4:
File: teste4.jsp
Seguindo os critrios acima, caso o JSP necessite ser mapeado, ele deve
ser includo no web.xml como um Servlet, seguindo a seguinte estrutura:
<servlet>
<servlet-name> login </servlet-name>
<jsp-file> login.jsp </jsp-file>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name> login </servlet-name>
<url-pattern> /login.jsp </url-pattern>
</servlet-mapping >
http://struts.apache.org/1.3.5/index.html
http://struts.apache.org/1.3.5/userGuide/index.html
Definindo o WEB.XML:
OBS:
No mnimo deve conter esta estrutura.
Usar o ActionServlet do Struts.
Ateno para o arquivo sun-web.xml. Para Struts 1.3 ou superior
o atributo class-loader delegate deve estar como false.
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
<servlet-mapping>
<servlet-name>action</servlet-name>
<!-- SEM BARRA -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<sun-web-app>
<class-loader>
<delegate>false</delegate>
</class-loader>
<security-role-mapping>
<role-name> ADMIN </role-name>
<group-name> LDAP_ADMIN </group-name>
</security-role-mapping>
<security-role-mapping>
<role-name> SALES_MANAGER </role-name>
<group-name> LDAP_SALES </group-name>
</security-role-mapping>
<cache max-entries="4096" timeout-in-seconds="30" enabled="true">
<default-helper/>
</cache>
<jsp-config/>
</sun-web-app>
OBS:
No mnimo deve conter essa estrutura.
Utilizar o Request Processor do Tiles.
<?xml version="1.0" encoding="UTF-8"?>
<struts-config>
<global-forwards type="org.apache.struts.action.ActionForward">
<forward name="myForward"
path="/any.jsp"
redirect="true"/>
</global-forwards>
<action-mappings>
<action
input="/index.jsp"
path="/sales/manage.do"
type="br.gov.caixa.action.ManageAction"
scope="request"
validate="false">
</action>
<action
input="/index.jsp"
path="/sales/update.do"
type="br.gov.caixa.action.UpdateAction"
scope="request"
validate="false">
</action>
</action-mappings>
<controller
processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
</struts-config>
Imagem: /aplicacaostatic/imagens/imagem.gif
Scripts: /aplicacaostatic/scripts/script.js
Link Html: /aplicacaostatic/pagina.html
Action: /aplicacao/action.do
Action: /aplicacao/pagina.jsp
Action: /aplicao/AplicacaoControl
Referncia: http://docs.sun.com/source/819-0084/index.html
try {
// obter e utilizar conexo
} catch (SqlException se) {
// tratar exceo de banco
} catch (Exception e)
// tratar exceo genrica (caso aplicvel)
} finally {
// fechar statements, resultsets e conexo
}
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Resources5.html#63140
http://java.sun.com/j2ee/1.4/docs/tutorial-
update6/doc/Transaction.html#wp79663
//ExcecaoNegocio.java
public class ExcecaoNegocio extends java.lang.Exception {
...
}
// Servico.java
public interface Servico extends javax.ejb.EJBObject {
// ServicoLocal.java
public interface ServicoLocal extends javax.ejb.EJBLocalObject {
Interfaces Remotas:
a. create(....) throws CreateException, RemoteException;
b. findXXX(....) throws FinderException, RemoteException;
c. remove(.....) throws RemoveException, RemoteException;
Interfaces Locais:
// ServicoHome.java
public interface ServicoHome extends javax.ejb.EJBHome {
// ServicoLocalHome.java
public interface ServicoLocalHome extends javax.ejb.EJBLocalHome {
// ServicoEJB.java
public class ServicoEJB implements javax.ejb.SessionBean {
try {
// algum codigo que gera exececao
} catch (SQLException e) {
// anula a transacao e gera uma excecao de
negocio
throw new ExcecaoNegocio (e);
} catch (NullPointerException e) {
// anula a transacao e gera uma excecao de
negocio
throw new ExcecaoNegocio (e);
}
...
...
http://jcp.org/en/jsr/detail?id=172
http://www.brics.dk/~amoeller/WWW/webservices/
http://java.sun.com/webservices/jwsdp/index.jsp
Ateno: Caso exista uma classe com o mesmo nome em ambos EJB e
WAR, ser utilizada a que est no mdulo EJB, independente de serem
verses iguais ou distintas.
http://docs.sun.com/source/819-0217/dgdeploy.html
http://developers.sun.com/prodtech/javatools/jsenterprise/reference/techart/jse7/cla
ssloading-pkg.html
http://desenv.coresp.caixa/SIT/documentos/Padrao_LOG.zip
Para criar uma aplicao cliente necessrio criar um JAR com a seguinte
estrutura (exemplo):
\gov
\caixa
\aplicacao
\SuaClasse.class
\META-INF
\MANIFEST.MF
\application-client.xml
\sun-application-client.xml
Main-Class: gov.caixa.aplicacao.SuaClasse
--
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-application-client PUBLIC "-//Sun Microsystems, Inc.//DTD
Application Server 8.0 Application Client 1.4//EN"
"http://www.sun.com/software/appserver/dtds/sun-application-client_1_4-
0.dtd">
<sun-application-client>
<ejb-ref>
<ejb-ref-name>ejb/SimpleConverter</ejb-ref-name>
<jndi-name>ConverterBean</jndi-name>
<application-client>
<display-name>ConverterClient</display-name>
<ejb-ref>
<ejb-ref-name>ejb/SimpleConverter</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>converter.ConverterHome</home>
<remote>converter.Converter</remote>
</ejb-ref>
</application-client>
--
<?xml version="1.0" encoding="UTF-8"?>
<sun-application-client>
<ejb-ref>
<ejb-ref-name>ejb/SimpleConverter</ejb-ref-name>
<jndi-name>ConverterBean</jndi-name>
</ejb-ref>
</sun-application-client>
http://docs.sun.com/source/819-0079/dgacc.html
Referncia:
http://java.sun.com/developer/JDCTechTips/2001/tt0306.html#cloning
6. Uma aplicao Web J2EE pode facilmente gerar uma tabela e export-la no
padro do MS-Excel. Para isso devemos criar uma JSP que formata uma
tabela de dados. Nesta JSP, colocar uma declarativa content-type
especfica para o MS-Excel.
Referncia:
http://www.theserverside.com/discussions/thread.tss?thread_id=33400#166
890
JMS Java Message Service uma API Java utilizada para criar, enviar,
receber e ler mensagens, esta API foi incorporada na especificao J2EE a partir
da verso 1.3.
Pode ser utilizada a forma de envio P2P Point to Point (um envia, um
recebe) ou Publisher/Subscriber (um envia, vrios recebem), o seu consumo pode
ser realizado de forma sncrona com um programa esperando atravs do mtodo
receive at que a mensagem chegue ou termine por timeout ou de forma
assncrono com um programa se registrando como Listener, que ao receber uma
mensagem o evento onMessage executado.
Na Caixa Econmica Federal utilizado o IBM MQ Series para interfacear
com rotinas orientadas a mensagens no Mainframe.
Links recomendados:
http://www.javasoft.com/products/jms/docs.html
http://java.sun.com/products/jms/
http://desenv.coresp.caixa/ajudadoc/topicos/sistemas/sirot2/index.html
Nota:
SOAP with API attachments API for Java 1.2 Java API for XML Processing (JAXP) 1.2
J2EE Connector Architecture (JCA) 1.5 Java Web Services Developer Pack 1.5
Java API for XML-based RPCs (JAX-RPC) 1.1 WS-I Basic Profile 1.0
Referncia: http://issues.apache.org/bugzilla/show_bug.cgi?id=21972
Developer Guide:
http://docs.sun.com/app/docs/doc/819-0217
Performance Guide:
http://docs.sun.com/app/docs/doc/819-0084