WebService: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
(Die Seite wurde neu angelegt: „Die hier gezeigte Lösung lief auf mehreren Servern gleichermaßen und ohne weitere Pakete einbinden zu müssen. <code=java> package webTest; import javax.jws.…“)
 
 
(16 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Die hier gezeigte Lösung lief auf mehreren Servern gleichermaßen und ohne weitere Pakete einbinden zu müssen.
+
=JAX-WS Implementierung ab JDK 6=
  
 +
Die hier gezeigte Lösung lief auf mehreren Servern gleichermaßen und ohne weitere Pakete einbinden zu müssen. Die Erreichbarkeit des Services läßt sich frei konfigurieren.
 +
Dazu muss lediglich ein Context-Parameter in der web.xml angelegt werden, wo man als Wert die gewünschte URL eintragen kann. Dieser Parameter muss dann im ServletContextListener ausgelesen und für die publizierenden Endpunkt eingetragen werden. Dies wird in den folgenden Quelltexten gezeigt.
 +
 +
Als erstes benötigen wir ein Interface des WebServices, worüber dem Client die möglichen Methoden angeziegt werden.
 
<code=java>
 
<code=java>
 
package webTest;
 
package webTest;
Zeile 11: Zeile 15:
 
/**
 
/**
 
  *
 
  *
  * @author seann
+
  * @author JSeann
 
  */
 
  */
 
@WebService
 
@WebService
Zeile 21: Zeile 25:
 
}
 
}
 
</code=java>
 
</code=java>
 +
 +
Die Klasse DefaultWebTest implementiert das Interface WebTest. Wie man hier sieht, übergebe ich als Parameter ein komplexes Object Typ ArrayList und stelle ein solches Object auch wieder für den Clienten (Aufrufer) bereit. Dies betone ich deshalb, da ich die auch mit Axis Version 2.2.8 versucht hatte, dies aber nur mit einfachen Datentypen gelang. Desweiteren nutze ich in dieser hier vorgestellten Lösung keine weiteren Pakete sondern lediglich die im jdk vorhande Implementation des jax-ws-Standards.
  
 
<code=java>
 
<code=java>
Zeile 35: Zeile 41:
 
/**
 
/**
 
  *
 
  *
  * @author seann
+
  * @author JSeann
 
  */
 
  */
  
Zeile 55: Zeile 61:
 
      
 
      
 
</code=java>
 
</code=java>
 +
 +
Die folgende ServletContextListener-Erweiterung startet den WebService mit der in der web-xml angegeben URL.
  
 
<code=java>
 
<code=java>
Zeile 64: Zeile 72:
 
/**
 
/**
 
  *
 
  *
  * @author seann
+
  * @author JSeann
 
  */
 
  */
  
Zeile 94: Zeile 102:
  
 
</code=java>
 
</code=java>
 +
 +
In der web.xml wird der obige ServletContextListener eingetragen, dies ist unterem bei dem Apache Tomcat wichtig. Der JBoss genügt sich mit der Annotation @javax.servlet.annotation.WebListener.
  
 
<code=xml>
 
<code=xml>
Zeile 106: Zeile 116:
 
     </context-param>
 
     </context-param>
 
      
 
      
     <servlet>
+
     <!--servlet>
 
         <servlet-name>WebTestService</servlet-name>
 
         <servlet-name>WebTestService</servlet-name>
 
         <servlet-class>webTest.DefaultWebTest</servlet-class>
 
         <servlet-class>webTest.DefaultWebTest</servlet-class>
Zeile 113: Zeile 123:
 
         <servlet-name>WebTestService</servlet-name>
 
         <servlet-name>WebTestService</servlet-name>
 
         <url-pattern>/WebTestService</url-pattern>
 
         <url-pattern>/WebTestService</url-pattern>
     </servlet-mapping>
+
     </servlet-mapping-->
 
     <listener>
 
     <listener>
 
             <listener-class>webTest.AppServletContextListener</listener-class>     
 
             <listener-class>webTest.AppServletContextListener</listener-class>     
Zeile 126: Zeile 136:
 
</code=xml>
 
</code=xml>
  
 +
Der Client kann nun unter der in der web.xml angegebenen URL den Service erreichen. Der ServiceName, ServicePort, Namespace, die URL und das Service-Interface sind Bedingung für die Nutzung des Services.
  
 
<code=java>
 
<code=java>
Zeile 138: Zeile 149:
 
/**
 
/**
 
  *
 
  *
  * @author seann
+
  * @author JSeann
 
  */
 
  */
public class WebTestClient {
+
public class WebTestClient  
 
+
{  
   
 
 
     public WebTestClient()  
 
     public WebTestClient()  
 
     {
 
     {
Zeile 164: Zeile 174:
 
             String serviceName = "WebTestService";         
 
             String serviceName = "WebTestService";         
 
             String servicePort = "WebTestPort";
 
             String servicePort = "WebTestPort";
             String url = "http://:6040/WebTest/WebTestService";
+
             //String url = "http://:6040/WebTest/WebTestService";
             url = "http://:8080/blupp";
+
             String url = "http://:8080/blupp";
 
             //url = "http://localhost:8041/axis2/services/WebTestService?wsdl";
 
             //url = "http://localhost:8041/axis2/services/WebTestService?wsdl";
 
             String namespace = "http://webTest";
 
             String namespace = "http://webTest";
Zeile 192: Zeile 202:
 
}
 
}
 
</code=java>
 
</code=java>
 +
 +
Die Ausgabe des Clienten ist folgende:
 +
 +
<code=ini>
 +
start
 +
return
 +
</code=ini>
 +
 +
 +
=Weiterführende Links=
 +
 +
http://www.journaldev.com/1945/servlet-listener-example-servletcontextlistener-httpsessionlistener-and-servletrequestlistener
 +
 +
--[[Benutzer:JSeann|JSeann]] (25.10.2013)
 +
[[Kategorie:Tutorials (Java)]]
 +
[[Kategorie:Java-Codeschnipsel]]

Aktuelle Version vom 27. Oktober 2013, 10:31 Uhr

JAX-WS Implementierung ab JDK 6

Die hier gezeigte Lösung lief auf mehreren Servern gleichermaßen und ohne weitere Pakete einbinden zu müssen. Die Erreichbarkeit des Services läßt sich frei konfigurieren. Dazu muss lediglich ein Context-Parameter in der web.xml angelegt werden, wo man als Wert die gewünschte URL eintragen kann. Dieser Parameter muss dann im ServletContextListener ausgelesen und für die publizierenden Endpunkt eingetragen werden. Dies wird in den folgenden Quelltexten gezeigt.

Als erstes benötigen wir ein Interface des WebServices, worüber dem Client die möglichen Methoden angeziegt werden. <code=java> package webTest;


import javax.jws.*; import javax.jws.soap.*;

import java.util.*; /**

*
* @author JSeann
*/

@WebService @SOAPBinding(style = SOAPBinding.Style.DOCUMENT) public interface WebTest {

   @WebMethod
   public ArrayList<String> check(ArrayList<String> list);

} </code=java>

Die Klasse DefaultWebTest implementiert das Interface WebTest. Wie man hier sieht, übergebe ich als Parameter ein komplexes Object Typ ArrayList und stelle ein solches Object auch wieder für den Clienten (Aufrufer) bereit. Dies betone ich deshalb, da ich die auch mit Axis Version 2.2.8 versucht hatte, dies aber nur mit einfachen Datentypen gelang. Desweiteren nutze ich in dieser hier vorgestellten Lösung keine weiteren Pakete sondern lediglich die im jdk vorhande Implementation des jax-ws-Standards.

<code=java>

package webTest;

import javax.jws.soap.*; import javax.xml.ws.soap.*; import javax.jws.*; //import javax.ejb.*;

import java.util.*;

/**

*
* @author JSeann
*/

@WebService(serviceName="WebTestService"

          ,portName="WebTestPort"
          ,endpointInterface="webTest.WebTest"
          ,targetNamespace="http://webTest"
       )

//@Stateless public class DefaultWebTest implements WebTest {

   public ArrayList<String> check( ArrayList<String> list) 
   {
       list.add("return");
       return list;
   }

}

</code=java>

Die folgende ServletContextListener-Erweiterung startet den WebService mit der in der web-xml angegeben URL.

<code=java> package webTest;

import javax.xml.ws.Endpoint; import javax.servlet.*;

/**

*
* @author JSeann
*/

@javax.servlet.annotation.WebListener public class AppServletContextListener implements javax.servlet.ServletContextListener {

   Endpoint endpoint = null;
   
   public void contextInitialized(ServletContextEvent sce) 
   { 
       String url = sce.getServletContext().getInitParameter("url");
       //Endpoint.publish("{protocol}://{host}:{port}/{context}/{wsName}", new DefaultWebTest());
       if(url != null)
       {
           endpoint = Endpoint.publish(url, new DefaultWebTest());
       }
       else
       {
           endpoint = Endpoint.publish("http://:6038/WebTest/WebTestService", new DefaultWebTest());
       }        
   } 
   public void contextDestroyed(ServletContextEvent sce) 
   { 
       endpoint.stop();
   }

}

</code=java>

In der web.xml wird der obige ServletContextListener eingetragen, dies ist unterem bei dem Apache Tomcat wichtig. Der JBoss genügt sich mit der Annotation @javax.servlet.annotation.WebListener.

<code=xml> <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5"

           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_2_5.xsd">    
   <context-param>
       <param-name>url</param-name>
       <param-value>http://:8080/blupp</param-value>
   </context-param>
   
   <listener>
           <listener-class>webTest.AppServletContextListener</listener-class>    
   </listener>
 	
   <session-config>
       <session-timeout>
           30
       </session-timeout>
   </session-config>

</web-app> </code=xml>

Der Client kann nun unter der in der web.xml angegebenen URL den Service erreichen. Der ServiceName, ServicePort, Namespace, die URL und das Service-Interface sind Bedingung für die Nutzung des Services.

<code=java> package webtestclient;


import java.net.URL; import java.util.ArrayList; import javax.xml.namespace.QName; import javax.xml.ws.Service;

/**

*
* @author JSeann
*/

public class WebTestClient {

   public WebTestClient() 
   {
       
   }
   /**
    * @param args the command line arguments
    */
   public static void main(String[] args)
   {
       // TODO code application logic here
       
       WebTestClient client = new WebTestClient();
       client.connect();
   }
   
   public void connect()
   {
       try {
           String serviceName = "WebTestService";        
           String servicePort = "WebTestPort";
           //String url = "http://:6040/WebTest/WebTestService";
           String url = "http://:8080/blupp";
           //url = "http://localhost:8041/axis2/services/WebTestService?wsdl";
           String namespace = "http://webTest";
           Service service = Service.create(new URL(url + "?wsdl") , new QName(namespace , serviceName));
           webTest.WebTest proxy = service.getPort(new QName(namespace, servicePort), webTest.WebTest.class);
           
           ArrayList<String> list = new ArrayList<String>();
           
           list.add("start");
           
           ArrayList<String> result = proxy.check(list);
           //ArrayList<String> result = ((webTest.WebTest)proxy).check(list);
           if(result.size() > 0)
           {
               for(int index = 0; index < result.size(); index++)
               {
                   System.out.println(result.get(index));
               }
           }
       }
       catch(Exception e) 
       {
           e.printStackTrace();
       }
   }

} </code=java>

Die Ausgabe des Clienten ist folgende:

<code=ini> start return </code=ini>


Weiterführende Links

http://www.journaldev.com/1945/servlet-listener-example-servletcontextlistener-httpsessionlistener-and-servletrequestlistener

--JSeann (25.10.2013)