WebServices: JDK 6.0, Tomcat 5.5.17, JAX-WS 2.1
0. Sciagamy JAXWS-RI ze strony https://jax-ws.dev.java.net/ri-download.html.
1. W katalogu JDK\jre\lib tworzymy nowy podkatalog "endorsed" i kopiujemy do niego biblioteki jaxws-api.jar, jaxb-api.jar i servlet-api.jar.
2. Tworzymy strukture katalogow:
webservice
|--classes
|--src
|--ws
|--WSHello.java
|--client
|--WSClient.java
|--WEB-INF
|--lib
Zakladam, ze biezacy katalog, z ktorego wywolywane sa polecenia to "webservice".
Do katalogu WEB-INF/lib przerzucamy biblioteki JAXWS-RI.
3. Tworzymy klase uslugi sieciowej (WSHello.java):
package ws;
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.servlet.ServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
@WebService
public class WSHello {
@Resource
private WebServiceContext wsContext;
@WebMethod
public String hello() {
MessageContext mc = wsContext.getMessageContext();
ServletRequest sr = (ServletRequest) mc.get(MessageContext.SERVLET_REQUEST);
return sr.getRemoteHost();
}
}
4. Kompilujemy klase uslugi i generujemy artefakty:
javac -d classes src/ws/WSHello.java
wsgen -cp classes -d classes -s src -r WEB-INF ws.WSHello -wsdl
5. Tworzymy pliki deskryptorow uslugi (sun-jaxws.xml):
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint
name="WSHello"
implementation="ws.WSHello"
url-pattern="/hello"
/>
</endpoints>
i aplikacji webowej (web.xml):
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
Oba pliki powinny byc umieszczone w katalogu WEB-INF.
6. Tworzymy archiwum aplikacji:
Po przekopiowaniu calego katalogu "classes" do WEB-INF robimy:
jar cvfM ws-test.war WEB-INF
7. Stworzone archiwum .war wrzucamy do katalogu "webapps" Tomcat'a. Od tej pory usluga dostepna jest pod adresem:
http://localhost:8080/ws-test/hello?wsdl
8. Tworzenie klienta (WSClient.java):
package ws.client;
import javax.xml.ws.WebServiceRef;
@WebServiceRef(wsdlLocation="http://localhost:8080/ws-hello/hello?wsdl")
public class WSClient {
public static final void main(String[] args) {
WSHelloService service = new WSHelloService();
WSHello port = service.getWSHelloPort();
System.out.println(port.hello());
}
}
wsimport -p ws.client -d classes -s src -wsdllocation http://localhost:8080/ws-test/hello?wsdl WEB-INF/WSHelloService.wsdl
javac -sourcepath src -d classes src/ws/client/WSClient.java
Tworzymy plik manifestu (MANIFEST.MF):
Manifest-Version: 1.0
Created-By: 1.6.0_02 (Sun Microsystems Inc.)
Main-Class: ws.client.WSClient
i pakujemy do .jar'a:
jar cvfm ws-client.jar MANIFEST.MF -C classes ws/client/
Java RMI
0. Tworzymy strukture katalogow:
rmi
|--remote
|--client
|--Client.java
|--MyService.java
|--MyServiceImpl.java
|--client.policy
|--server.policy
Dla testow zawartosc plikow "client.policy" i "server.policy":
grant codeBase "file:." {
permission java.security.AllPermission;
};
1. Tworzymy zdalny interfejs uslugi (MyService.java)
package remote;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MyService extends Remote {
public abstract String hello() throws RemoteException;
}
2. Tworzymy implementacje zdalnego interfejsu (MyServiceImpl.java)
package remote;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.ServerNotActiveException;
import java.rmi.server.UnicastRemoteObject;
import remote.MyService;
public class MyServiceImpl implements MyService {
public MyServiceImpl() {
super();
}
public String hello() {
String host = null;
try {
String remoteHost = RemoteServer.getClientHost();
InetAddress inet = InetAddress.getByName(remoteHost);
host = inet.getHostAddress();
} catch(ServerNotActiveException snae) {
System.err.println("Exception in method. Reason: " + snae.getMessage());
snae.printStackTrace();
} catch(UnknownHostException uhe) {
System.err.println("Exception in method. Reason: " + uhe.getMessage());
uhe.printStackTrace();
}
return host;
}
public static final void main(String[] args) {
if(System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "MyService";
MyService service = new MyServiceImpl();
MyService stub = (MyService) UnicastRemoteObject.exportObject(service, 0);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(name, stub);
System.out.println("Service registered");
} catch(Exception e) {
System.err.println("Exception occured: " + e.getMessage());
e.printStackTrace();
}
}
}
3. Kompilujemy pliki
javac remote/*.java
4. Uruchamiamy usluge RMI
start rmiregistry
java -cp . -Djava.security.policy=server.policy remote.MyServiceImpl
5. Tworzymy klienta
package remote.client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import remote.MyService;
public class Client {
public static final void main(String[] args) {
if(System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
String name = "MyService";
Registry registry = LocateRegistry.getRegistry("localhost");
MyService service = (MyService) registry.lookup(name);
System.out.println("Received host: " + service.hello());
} catch(Exception e) {
System.out.println("Client's exception: " + e.getMessage());
e.printStackTrace();
}
}
}
... i kompilujemy:
javac remote/client/Client.java
6. Uruchamiamy klienta
java -cp . -Djava.security.policy=client.policy remote.client.Client