Creato da pastuweb.com
Share My Page
My Social Accounts
Account FaceBook Account LinkedIn Account Twitter Account Google Plus Account Git Hub

 

In questo esempio vi mostrerò l'utilizzo di SOAP e WSDL per la creazione di un WebService Client e Server.

Workspace WebService Client e Server SOAP e WSDLSpringTestWebService: è il workspace del SERVER.

SpringTestWebServiceClient: è il workspace del CLIENT che si interfaccia con il SERVER attraverso l'uso del descrittore WSDL (precedentemente creato dal SERVER).

In questo esempio uso JDBC per l'accesso alle tabelle del database.

Il database si chiama: db_web_service. 

Le tabelle sono: PERSONA(id,nome,cognome,data_nascita) e

UTENTE(id,username,password,profilo,id_persona).

----------------------------------------------------------------------------------------------------------

Server: SpringTestWebService (Download dei JARs del progetto Server)

Come prima cosa inseriamo nel Web Server Tomcat il descrittore del progetto che simula un server SOAP: SpringTestWebService.

<Context

  docBase="/Users/wizardfp/Documents/workspace_J2EE/SpringTestWebService"

  path="/SpringTestWebService"

  reloadable="false">

</Context>

 

 

 

 

 

 

 

Poi definiamo il web.xml e aggiungiamo i path dei file di contesto di Spring e di XFire:

<?xml version="1.0"?>    

<web-app 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"

         version="2.4">

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/config/context.xml

classpath:org/codehaus/xfire/spring/xfire.xml

</param-value>

</context-param>

  

  <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

 

<!-- esposizione dei servizi tramite xfire (XML/SOAP) -->

<servlet>

<servlet-name>xfire</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/config/endpoints-xfire.xml</param-value>

</init-param>

</servlet>

 

<servlet-mapping>

<servlet-name>xfire</servlet-name>

<url-pattern>/xfire/*</url-pattern>

</servlet-mapping>

</web-app>

 

File di contesto di Spring, context.xml, per iniettare i beans nella logica di business:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="

           http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://localhost:3306/db_web_service"/>

<property name="username" value="root"/>

<property name="password" value="visualbasic6"/>

</bean>  

    

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"/>

</bean>

 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>

  </bean>

 

<bean id="utenteDAO" class="appuntivari.model.dao.UtenteDAO">

<property name="jdbcTemplate" ref="jdbcTemplate"/>

</bean>

    

    <bean id="utente_dao_tr_proxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <property name="transactionManager" ref="transactionManager"/>

    <property name="target" ref="utenteDAO"/>

    <property name="proxyTargetClass" value="true"/>

    <property name="transactionAttributes">

      <props>

        <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>

        <prop key="get*">PROPAGATION_SUPPORTS</prop>

      </props>

    </property>

  </bean>

 

 <bean id="simpleWebService" class="appuntivari.webservice.TestWebServiceImpl">

<property name="utenteDAO" ref="utenteDAO"/>

<property name="utenteDAOtr" ref="utente_dao_tr_proxy"/>

</bean>

    

</beans>

 

Definiamo il descrittore per l'interfacciamento client-server del Web Service, endpoints-xfire.xml:

<?xml version="1.0"?>

 

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

 

<bean name="/SimpleWebService" id="webserviceSOAP" class="org.codehaus.xfire.spring.remoting.XFireExporter">

<property name="serviceFactory" ref="xfire.serviceFactory"/>

    <property name="xfire" ref="xfire"/>

   <property name="service" ref="simpleWebService"/>

    <property name="serviceInterface" value="appuntivari.webservice.TestWebService"/>

</bean>

 

DTO, Persona e Utente (si riferiscono alle tabelle del database):

Persona.java

package appuntivari.model.dto;

import java.util.Date;

public class Persona {

 

private String nome;

private String cognome;

private Date dataNascita;

 

public Persona() {

}

 

public String getNome() {

return nome;

}

 

public void setNome(String nome) {

this.nome = nome;

}

 

public String getCognome() {

return cognome;

}

 

public void setCognome(String cognome) {

this.cognome = cognome;

}

 

public Date getDataNascita() {

return dataNascita;

}

 

public void setDataNascita(Date dataNascita) {

this.dataNascita = dataNascita;

}

 

}

 

Utente.java

 

package appuntivari.model.dto;

public class Utente {

 

private String username;

private String password;

private String profilo;

private Persona persona;

 

public Utente() {

}

 

public String getUsername() {

return username;

}

 

public void setUsername(String username) {

this.username = username;

}

 

public String getPassword() {

return password;

}

 

public void setPassword(String password) {

this.password = password;

}

 

public String getProfilo() {

return profilo;

}

 

public void setProfilo(String profilo) {

this.profilo = profilo;

}

 

public Persona getPersona() {

return persona;

}

 

public void setPersona(Persona persona) {

this.persona = persona;

}

 

}

 

Classe DAO per operazioni CRUD e Query sul database:

UtenteDAO.java

package appuntivari.model.dao;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
 
 
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
 
import appuntivari.model.dto.Persona;
import appuntivari.model.dto.Utente;
 
public class UtenteDAO {
 
/* JdbcTemplate: gestore delle connessione al mio DB,
  iniettato tramite bean di Spring quando dal contesto 
  viene recuperato il bean corrispondente alla classe UtenteDAO */
private JdbcTemplate jdbcTemplate;
 
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
 
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
 
 
 
public List<Persona> listaPersone(){
 
String sqlStatement = "select * from persona";
 
 
List<Persona> listaPersone = jdbcTemplate.query(sqlStatement,
new Object[]{},
new RowMapper(){
@Override
public Object mapRow(ResultSet rs,int arg1) throws SQLException {
 
Persona pe = new Persona();
pe.setCognome(rs.getString("COGNOME"));
pe.setNome(rs.getString("NOME"));
pe.setDataNascita(rs.getDate("DATA_NASCITA"));
 
return pe;
}});
 
return listaPersone;
 
}
 
 
public void createUtente(Utente ut){
 
/* Creazione dell'utente utilizzando i metodi della classe JdbcTemplate */
 
String personaSql = "insert into persona (nome,cognome,data_nascita) values(?,?,?)";
jdbcTemplate.update(personaSql,new Object[]{ut.getPersona().getNome(),
ut.getPersona().getCognome(),
new java.sql.Date(ut.getPersona().getDataNascita().getTime())});
 
String getMaxIdStatement = "select max(id) as maxid from persona";
Long maxid = (Long)jdbcTemplate.query(getMaxIdStatement, 
new Object[]{},
new RowMapper(){
@Override
public Object mapRow(ResultSet rs,
int arg1) throws SQLException {
return rs.getLong("maxid");
}
}).get(0);
 
String utenteSql = "insert into utente (username,password,profilo,id_persona) values(?,?,?,?)";
jdbcTemplate.update(utenteSql,new Object[]{ut.getUsername(),ut.getPassword(),ut.getProfilo(),maxid});
 
}
 
 
}
 

 

Ora la logica esposta al Client per l'interfacciamento con il Server e quindi con il database che ci sta dietro: l'interfaccia e quindi la parte implementativa vengono puntate "webserviceSOAP" all'interno dell'endpoints-xfire.xml:

TestWebService.java

package appuntivari.webservice;
 
import appuntivari.model.dto.Persona;
import appuntivari.model.dto.Utente;
 
 
public interface TestWebService {
 
public String getTime();
 
public Persona getPersona();
 
public Persona[] getListaPersone() throws Exception;
 
public void createUtente(Utente utente);
 
}
 

TestWebServiceImpl.java

package appuntivari.webservice;
 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
 
import appuntivari.model.dao.UtenteDAO;
import appuntivari.model.dto.Persona;
import appuntivari.model.dto.Utente;
 
 
 
public class TestWebServiceImpl implements TestWebService{
 
/*UtenteDAO privo di gestione transazioni*/
private UtenteDAO utenteDAO;
 
/*UtenteDAO con gestione transazioni*/
private UtenteDAO utenteDAOtr;
 
public UtenteDAO getUtenteDAO() {
return utenteDAO;
}
 
public void setUtenteDAO(UtenteDAO utenteDAO) {
this.utenteDAO = utenteDAO;
}
 
public UtenteDAO getUtenteDAOtr() {
return utenteDAOtr;
}
 
public void setUtenteDAOtr(UtenteDAO utenteDAOtr) {
this.utenteDAOtr = utenteDAOtr;
}
 
@Override
public String getTime() {
return new java.util.Date().toString();
}
 
@Override
public Persona getPersona() {
Persona persona = new Persona();
persona.setNome("NomeWS");
persona.setCognome("CognomeWS");
persona.setDataNascita(new Date());
return persona;
}
 
@Override
public Persona[] getListaPersone() throws Exception{
 
Persona[] persone = new Persona[]{};
return utenteDAO.listaPersone().toArray(persone);
 
}
 
public void createUtente(Utente utente) {
utenteDAOtr.createUtente(utente);
};
 
}
 
 
Prima di passare al Client vi mostro come ottenere il WSDL dal Server appena creato. 
Il WSDL è il descrittore che dvorà essere importato nel Client per l'utilizzo dei metodi esposti dal WebService all'interno del Server.
 
1) avviare Tomcat
2) dal Web Browser digitare: localhost:8080/testSpringWebServices/xfire/SimpleWebService?wsdl
3) fare copia incolla del WSDL in un file .wsdl
 
 
ClientSpringTestWebServiceClient (Download dei JARs del progetto Client)
 
Importare attraverso Eclipse: New -> Other -> search "Web Service Client" -> selezionare il file WSDL importato nel progetto 
-> Selezionare output source folder del progetto client -> click su Finish
 
 
Main.java (classe con un main; creata per testare i metodi esposti dal WebService)
 
package appuntivari.test;
 
import java.rmi.RemoteException;
import java.util.GregorianCalendar;
 
import javax.xml.rpc.ServiceException;
 
import appuntivari.model.dto.Persona;
import appuntivari.model.dto.Utente;
import appuntivari.webservice.WebserviceSOAP;
import appuntivari.webservice.WebserviceSOAPLocator;
 
 
public class Main {
 
public static void main(String[] args) throws RemoteException, ServiceException {
 
WebserviceSOAP locator = new WebserviceSOAPLocator();
 
Persona[] persone = locator.getwebserviceSOAPHttpPort().getListaPersone();
for(int g=0; g < persone.length;g++){
System.out.println(persone[g].getNome());
}
 
Persona persona = new Persona();
persona.setNome("Nome1PersonaWS");
persona.setCognome("Cognome1PersonaWS");
persona.setDataNascita(new GregorianCalendar());
 
Utente ut = new Utente();
ut.setPassword("Pwd2UtenteWS");
ut.setUsername("Una555U33t2enteWS");
ut.setProfilo("Prof12iloUtWS");
ut.setPersona(persona);
 
 
locator.getwebserviceSOAPHttpPort().createUtente(ut);
 
persone = locator.getwebserviceSOAPHttpPort().getListaPersone();
for(int g=0; g < persone.length;g++){
System.out.println(persone[g].getNome());
}
}
 
}
 
Da notare il codice evidenzianto di rosso, il nome della classe, WebserviceSOAP corrisponde al id del bean del descrittore endpoints-xfire.xml.
You can find this project on my GitHub Repository at this repository URL: https://github.com/pastuweb/webservice-soap-wsdl
Average (1 Vote)
The average rating is 5.0 stars out of 5.