Tag: ‘Java’
Web Services com Apache Axis – Part II
Dando sequência a WebServices agora vou demonstrar um exemplo prático de como criar um serviço utilizando os recursos do framework Apache Axis.
A instalação do Axis funciona como qualquer outra API na plataforma JEE, portanto não será detalhado este procedimento.
A criação de webservices com Apache Axis é muito simples, veja a classe abaixo:
public class Calculo {
/**
*
* @param n1
* @param n2
* @return Resultado da Soma
*/
public double soma(double n1, double n2){
return (n1 + n2);
}
}
Após criar essa simples classe composta pelo método soma, cujo retorna um tipo primitivo, para que esta classe seja publicada como um serviço basta copiá-la para a aplicação do Axis ($TOMCAT_HOME\webapps\axis) em seguida renomeá-la para Calculo.jws. Acesse o serviço como http://localhost:8080/axis/Calculo.jws?wsdl, isto é tudo.
Simples assim, criar o Client que irá utilizar o serviço é tão simples quanto.
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class CalculoClient {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
String url = "<a href="http://localhost/axis/Calculo.jws?wsdl">http://localhost/axis/Calculo.jws?wsdl</a>";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( url );
call.setOperationName("soma"); // método do webservices
Double[] param = {15.0, 15.0}; // parâmetros
Double result = (Double) call.invoke( param ); // chamada
System.out.println("Resultado : " + result );
}
}
Exemplos iguais a este devem existir centenas de milhares na internet, simples utilizando tipos primitivos, básico mesmo. Mas cansado de saber disto vou demonstrar um exemplo mais completo utilizando tipo de dados complexos!
Veja mais esses artigos excelentes:
http://www.javafree.org/content/view.jf?idContent=4
http://www.guj.com.br/java.tutorial.artigo.180.1.guj
http://www.guj.com.br/java.tutorial.artigo.132.1.guj
Web Services – Part I
Provavelmente você já ouviu falar sobre serviços na web, mas cê sabe mesmo o que é isto?
Web Services nada mais é do que um serviço remoto descrito utilizando a WSDL – Web Service Description Language – e acessado utilizando um protocolo (SOAP) totalmente abstrato.
As grandes do mercado Microsoft, Oracle, IBM, Sun, HP entre outos, estão a frente do WS-I, orgão responsável por manter e garantir o funcionamento dos webservices em qualquer plataforma.
Simples assim…
O popular SOAP nada mais é do que um schema descrito em XML, definindo o serviço e sua localização, para que o cliente faça a conexão.
Função InitCap para MySql
Conhecida em várias linguagens e ambientes o InitCap tem a função de transformar o primeiro caracter de cada palavra em maíusculo e o restante em minúsculo. Infelizmente o MySql não disponibiliza essa funcionalidade nativa, portanto, você terá que criá-la.
Essa é a minha versão do InitCap em Java.
private static final String SEPARADOR[] = {"do","da","de","e","dos","das"};
/**
* @author lsilva
* @param in
* @return
*/
public static String initCap( String in ){
String out = null;
String[] part = in.split(" ");
StringBuffer temp = new StringBuffer();
for (int i = 0; i<part.length; i++){
if( i>0 ) temp.append(" ");
if( ehSeparador( part[i] ) ){
temp.append( part[i].toLowerCase() );
}else{
temp.append( part[i].substring(0, 1).toUpperCase() );
temp.append( part[i].toLowerCase().substring(1, part[i].length()) );
}
}// for end
out = temp.toString();
return out;
}
/**
* @author lsilva
* @param sep
* @return
*/
private static boolean ehSeparador(String sep){
boolean r = false;
for (int i = 0; i < SEPARADOR.length; i++){
if( sep.equalsIgnoreCase( SEPARADOR[i] ) ){
r = true;
break;
}else{
r = false;
}
}
return r;
}
Depois de algumas discussões e muita zuação, meu amigo Orlando disse: “Muita firula pra pouca coisa, faz assim cara:
/**
* @author oneto
* @param n
* @return
*/
public static String initCap( String n ){
String[] x = n.split(" ");
StringBuffer r = new StringBuffer();
String e = " de , da , des , da ";
for (int i = 0;i<x.length;i++){
if(e.indexOf(x[i].trim().toLowerCase())< 0){
r.append(x[i].substring(0,1).toUpperCase() + x[i].substring(1,x[i].length()).toLowerCase() + " " );
}else{
r.append(x[i].toLowerCase() + " ");
}
}
return r.toString().trim();
}
Essa função pode ser feita de diversas outras maneiras, aqui foram apenas sugeridas algumas. Muitas vezes você não precisará criar basta pesquisar sobre a linguagem utilizada, por exemplo, em PHP a função nativa para isto é o ucwords.
That’s all.
AJAX II: Java Server Faces com Jboss RichFaces
Continuando com a série de posts sobre AJAX, agora vou mostrar como é mais simples desenvolver aplicativos utilizando um framework e o escolhido foi JavaServer Faces.
A utilização de frameworks é uma mão-na-roda, tanto no sentido de diminuir muito a reconstrução de funcionalidades básicas, tão quanto para padronizar componentes. O JavaServer Faces há tempos é uma base de desenvolvimento segura, padronizada e rica em componentes web 2.0, seguindo este padrão o pessoal do JBoss criou o RichFaces, que futuramente foi chamado de Ajax4Jsf, nada mais é que um pacote de componentes pré-definidos para construção de aplicativos utilizando AJAX. No wikipedia você encontra uma descrição mais detalhada sobre JSF e RichFaces.
Em seguida vou demonstrar um desafio feito por mim mesmo, veja aqui, construindo um auto-completar utilizando JSF com Richfaces.
Os conceitos de JSF e RichFaces não serão discutidos, ou seja, apenas vou demonstrar como criar a aplicação sem detalhar a configuração feita no web.xml e no faces-config.xml, futuramente dedicarei um post sobre essas configurações.
Em seguida será demonstrado como construit um auto-completar cujo conteúdo será o nome de países, portanto, a estrutura básica das classes é esta:
O arquivo web.xml está configurado básicamente para trabalhar com os framewroks JSF e RichFaces.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>ClubesRich</display-name> <!-- RichFaces Config --> <context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>blueSky</param-value> </context-param> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>server</param-value> </context-param> <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <!-- Faces Config --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Faces Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <!-- Database Config --> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/Clubes</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <!-- --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsf</welcome-file> </welcome-file-list> </web-app>
Já o ManagerBean está assim configurado no faces-config.xml:
<?xml version="1.0" encoding="UTF-8"?> <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xi="http://www.w3.org/2001/XInclude" 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-facesconfig_1_2.xsd"> <managed-bean> <managed-bean-name>regiaoControl</managed-bean-name> <managed-bean-class>com.clubs.control.RegiaoControl</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> <navigation-rule> <display-name>autocomplete</display-name> <from-view-id>/autocomplete.jsp</from-view-id> </navigation-rule></faces-config>
Veja abaixo o manager bean terá um método chamado autoCompletePais que receberá um parametro do tipo Object e retorna um ArrayList do tipo Pais.
public ArrayList<pais> autoCompletePais(Object o){
return rdao.getAllPais( o.toString() );
}
E por fim, o arquivo autocomplete.jsp, que foi mapeado no faces-config, mostrará como é simples utilizar o recurso SuggestionBox do pacote RichFaces e fazer um auto-completar com diversos recursos, acima de tudo bonito e eficaz no dia-a-dia, veja:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<f:view>
<h:form>
<rich:panel>
<f:facet name="header"><h:outputText value="Digite o Pais:"/></f:facet>
<h:inputText value="#{regiaoControl.pais.nome}" id="campo" />
<rich:suggestionbox height="150"
width="150"
for="campo"
fetchValue="#{campo.nome}"
suggestionAction="#{regiaoControl.autoCompletePais}"
var="campo">
<h:column>
<h:outputText value="#{campo.id_pais}"/>
</h:column>
<h:column>
<h:outputText value="#{campo.nome}"/>
</h:column>
</rich:suggestionbox>
</rich:panel>
</h:form>
</f:view>
Veja o resultado final, tornando a utilização do software mais agradável.
Java, Os iniciantes e a Sopa de Letrinhas
Uma breve histórinha: “recentemente um amigo iniciou seu estágio em uma grande companhia em Soluções de TI, ele fez treinamentos específicos durante algum tempo, porém, para sua surpresa o tal treinamento foi ignorado e disseram agora você irá estagiar em Java (JEE) e PlSql (Oracle), hã? O que é isso? Meu amigo não gostou da idéia inicialmente mas depois de algumas conversas ele mudou de idéia, hoje está feliz tentando entender e programar em Java”.
Eu aprendi um pouco com esta história, aprendi que as empresas muitas vezes não estão preocupadas quão bom será o seu código, ou ainda qual o seu nível de conhecimento sobre a plataforma de desenvolvimento utilizada. Conhecer o ambiente, quais as possibilidades de evolução dele, a aceitação de mercado, e vou mais afundo a portabildiade, segurança e velocidade consideradas por especialistas são de extrema importância para um desenvolvedor, e não apenas “Leia e Faça”.
Calma lá, ou muita calma nessa hora! :)
Não quero ser polêmico e chato neste primeiro post, portanto deixaremos minhas opiniões a parte e vamos ao que interessa.
Muitas pessoas quando iniciam seus estudos no mundo Java ficam espantados com a quantidade de siglas, e realmente é uma sopa de letrinhas quase que inesgotável, mas como estamos aqui para esclarecer e não complicar ainda mais, vamos lá. Abaixo listei algumas siglas junto a um breve resumo.
JVM – Java Virtual Machine
Máquina Virtual Java, responsável por carregar os programas e fazer a conversão do bytecodes em Linguagem de Máquina, definida para cada estrutura de Sistema Operacional. Aqui está um dos grandes diferenciais do Java comparado a outros linguagens, o programa não se limita ao SO já que a JVM faz a conversão.
JRE – Java Runtime Environment
Composto pela JVM e Bibliotecas Java para execução de programas em tempo real.
JSE – Java Standard Edition
Ambiente com a estrutura básica necessária para criação de programas Java, contém a JVM, o compilador e as bibliotecas Java necessárias.
JEE – Java Enterprise Edition
Assim como JSE, o JEE é uma edição do ambiente Java para desenvolvimento de programas, porém, com número de recursos superior, permitindo o desenvolvimento em multicamadas, componentes distribuídos, ambientes de internet, etc.
JME – Java Micro Edition
Edição do Java voltado para dispositivos capacidade de memória compacta, tais como: Celulares, PDAs, e muitos outros dispositivos.
JSDK – Java Standard Development Kit
Contém o JRE, JSE, os fontes das classes Java e o JavaDoc, com isto, fornecendo o ambiente para desenvolvimento e execução de programas Java.
JAVA_HOME
É o nome da variável de sistema operacional que contém o caminho de instalação do JSDK. Uma boa prática que deve ser seguidas por todos bons programadores.
CLASSPATH
É o nome da variável de sistema operacional que contém o caminho das bibliotecas nativas do Java ou de terceiros para a compilação e execução de programas Java.
EJB
Enterprise JavaBeans, componente JEE que fica no container do Servidor de Aplicação, auxilia no desenvolvimento de aplicações distribuídas, transacionais de forma segura e ágil.
Obviamente que foram listados pouquissimos termos aqui talvez você tenha ouvido falar em Design Pattern, JSF, JFX, Tomcat, JBoss, e nem saiba que raios isto significa!Fique tranquilo ao longo do tempo iremos discutir mais sobre eles.


