Creating a Simple Web Service and Clients with JAX-WS (original) (raw)
This section shows how to build and deploy a simple web service and two clients: an application client and a web client. The source code for the service is in the _tut-install_/examples/jaxws/helloservice-war/
directory, and the clients are in the_tut-install_/examples/jaxws/hello-appclient/
and_tut-install_/examples/jaxws/hello-webclient/
directories.
Figure 31-1 illustrates how JAX-WS technology manages communication between a web service and a client.
Figure 31-1 Communication between a JAX-WS Web Service and a Client
The starting point for developing a JAX-WS web service is a Java class annotated with the javax.jws.WebService
annotation. The @WebService
annotation defines the class as a web service endpoint.
A service endpoint interface or service endpoint implementation (SEI) is a Java interface or class, respectively, that declares the methods that a client can invoke on the service. An interface is not required when building a JAX-WS endpoint. The web service implementation class implicitly defines an SEI.
You may specify an explicit interface by adding the endpointInterface
element to the @WebService
annotation in the implementation class. You must then provide an interface that defines the public methods made available in the endpoint implementation class.
Basic Steps for Creating a Web Service and Client
The basic steps for creating a web service and client are as follows.
- Code the implementation class.
- Compile the implementation class.
- Package the files into a WAR file.
- Deploy the WAR file. The web service artifacts, which are used to communicate with clients, are generated by GlassFish Server during deployment.
- Code the client class.
- Use the
wsimport
Maven goal to generate and compile the web service artifacts needed to connect to the service. - Compile the client class.
- Run the client.
If you use NetBeans IDE to create a service and client, the IDE performs the wsimport
task for you.
The sections that follow cover these steps in greater detail.
Requirements of a JAX-WS Endpoint
JAX-WS endpoints must follow these requirements.
- The implementing class must be annotated with either the
javax.jws.WebService
or thejavax.jws.WebServiceProvider
annotation. - The implementing class may explicitly reference an SEI through the
endpointInterface
element of the@WebService
annotation but is not required to do so. If noendpointInterface
is specified in@WebService
, an SEI is implicitly defined for the implementing class. - The business methods of the implementing class must be public and must not be declared
static
orfinal
. - Business methods that are exposed to web service clients must be annotated with
javax.jws.WebMethod
. - Business methods that are exposed to web service clients must have JAXB-compatible parameters and return types. See the list of JAXB default data type bindings in Types Supported by JAX-WS.
- The implementing class must not be declared
final
and must not beabstract
. - The implementing class must have a default public constructor.
- The implementing class must not define the
finalize
method. - The implementing class may use the
javax.annotation.PostConstruct
or thejavax.annotation.PreDestroy
annotations on its methods for lifecycle event callbacks.
The@PostConstruct
method is called by the container before the implementing class begins responding to web service clients.
The@PreDestroy
method is called by the container before the endpoint is removed from operation.
Coding the Service Endpoint Implementation Class
In this example, the implementation class, Hello
, is annotated as a web service endpoint using the @WebService
annotation. Hello
declares a single method named sayHello
, annotated with the@WebMethod
annotation, which exposes the annotated method to web service clients. The sayHello
method returns a greeting to the client, using the name passed to it to compose the greeting. The implementation class also must define a default, public, no-argument constructor.
package javaeetutorial.helloservice;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService
public class Hello {
private final String message = "Hello, ";
public Hello() {
}
@WebMethod
public String sayHello(String name) {
return message + name + ".";
}
}
Building, Packaging, and Deploying the Service
You can use either NetBeans IDE or Maven to build, package, and deploy the helloservice-war
application.
The following topics are addressed here:
- To Build, Package, and Deploy the Service Using NetBeans IDE
- To Build, Package, and Deploy the Service Using Maven
To Build, Package, and Deploy the Service Using NetBeans IDE
- Make sure that GlassFish Server has been started (seeStarting and Stopping GlassFish Server).
- From the File menu, choose Open Project.
- In the Open Project dialog box, navigate to:
tut-install/examples/jaxws
- Select the
helloservice-war
folder. - Click Open Project.
- In the Projects tab, right-click the
helloservice-war
project and select Run.
This command builds and packages the application into a WAR file,helloservice-war.war
, located in_tut-install_/examples/jaxws/helloservice-war/target/
, and deploys this WAR file to your GlassFish Server instance. It also opens the web service test interface at the URL shown in To Test the Service without a Client.
Next Steps
To Build, Package, and Deploy the Service Using Maven
- Make sure that GlassFish Server has been started (seeStarting and Stopping GlassFish Server).
- In a terminal window, go to:
tut-install/examples/jaxws/helloservice-war/
- Enter the following command:
This command builds and packages the application into a WAR file,helloservice-war.war
, located in thetarget
directory, and then deploys the WAR to GlassFish Server.
Next Steps
Testing the Methods of a Web Service Endpoint
GlassFish Server allows you to test the methods of a web service endpoint.
The following topics are addressed here:
To Test the Service without a Client
To test the sayHello
method of HelloService
, follow these steps.
- Open the web service test interface by entering the following URL in a web browser:
http://localhost:8080/helloservice-war/HelloService?Tester
- Under Methods, enter a name as the parameter to the
sayHello
method. - Click sayHello.
This takes you to thesayHello
Method invocation page.
Under Method returned, you’ll see the response from the endpoint.
A Simple JAX-WS Application Client
The HelloAppClient
class is a stand-alone application client that accesses the sayHello
method of HelloService
. This call is made through a port, a local object that acts as a proxy for the remote service. The port is created at development time by the wsimport
Maven goal, which generates JAX-WS portable artifacts based on a WSDL file.
The following topics are addressed here:
Coding the Application Client
When invoking the remote methods on the port, the client performs these steps.
- It uses the generated
helloservice.endpoint.HelloService
class, which represents the service at the URI of the deployed service’s WSDL file:
import javaeetutorial.helloservice.endpoint.HelloService;
import javax.xml.ws.WebServiceRef;
public class HelloAppClient {
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
private static HelloService service;
- It retrieves a proxy to the service, also known as a port, by invoking
getHelloPort
on the service:
javaeetutorial.helloservice.endpoint.Hello port = service.getHelloPort();
The port implements the SEI defined by the service.
3. It invokes the port’s sayHello
method, passing a string to the service:
return port.sayHello(arg0);
Here is the full source of HelloAppClient.java
, which is located in the_tut-install_/examples/jaxws/hello-appclient/src/main/java/javaeetutorial/hello/appclient/
directory:
package javaeetutorial.hello.appclient;
import javaeetutorial.helloservice.endpoint.HelloService;
import javax.xml.ws.WebServiceRef;
public class HelloAppClient {
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
private static HelloService service;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println(sayHello("world"));
}
private static String sayHello(java.lang.String arg0) {
javaeetutorial.helloservice.endpoint.Hello port =
service.getHelloPort();
return port.sayHello(arg0);
}
}
Running the Application Client
You can use either NetBeans IDE or Maven to build, package, deploy, and run the hello-appclient
application. To build the client, you must first have deployed helloservice-war
, as described inBuilding, Packaging, and Deploying the Service.
The following topics are addressed here:
To Run the Application Client Using NetBeans IDE
- From the File menu, choose Open Project.
- In the Open Project dialog box, navigate to:
tut-install/examples/jaxws
- Select the
hello-appclient
folder. - Click Open Project.
- In the Projects tab, right-click the
hello-appclient
project and select Build.
This command runs thewsimport
goal, then builds, packages, and runs the client. You will see the output of the application client in the hello-appclient output tab:
--- exec-maven-plugin:1.2.1:exec (run-appclient) @ hello-appclient ---
Hello, world.
To Run the Application Client Using Maven
- In a terminal window, go to:
tut-install/examples/jaxws/hello-appclient/
- Enter the following command:
This command runs thewsimport
goal, then builds, packages, and runs the client. The application client output looks like this:
--- exec-maven-plugin:1.2.1:exec (run-appclient) @ hello-appclient ---
Hello, world.
A Simple JAX-WS Web Client
HelloServlet
is a servlet that, like the Java client, calls thesayHello
method of the web service. Like the application client, it makes this call through a port.
The following topics are addressed here:
Coding the Servlet
To invoke the method on the port, the client performs these steps.
- It imports the
HelloService
endpoint and theWebServiceRef
annotation:
import javaeetutorial.helloservice.endpoint.HelloService;
...
import javax.xml.ws.WebServiceRef;
- It defines a reference to the web service by specifying the WSDL location:
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
- It declares the web service, then defines a private method that calls the
sayHello
method on the port:
private HelloService service;
...
private String sayHello(java.lang.String arg0) {
javaeetutorial.helloservice.endpoint.Hello port =
service.getHelloPort();
return port.sayHello(arg0);
}
- In the servlet, it calls this private method:
out.println("<p>" + sayHello("world") + "</p>");
The significant parts of the HelloServlet
code follow. The code is located in the_tut-install_/examples/jaxws/hello-webclient/src/java/javaeetutorial/hello/ webclient/
directory.
package javaeetutorial.hello.webclient;
import javaeetutorial.helloservice.endpoint.HelloService;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.WebServiceRef;
@WebServlet(name="HelloServlet", urlPatterns={"/HelloServlet"})
public class HelloServlet extends HttpServlet {
@WebServiceRef(wsdlLocation =
"http://localhost:8080/helloservice-war/HelloService?WSDL")
private HelloService service;
/**
* Processes requests for both HTTP <code>GET</code>
* and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<html lang=\"en\">");
out.println("<head>");
out.println("<title>Servlet HelloServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet HelloServlet at " +
request.getContextPath () + "</h1>");
out.println("<p>" + sayHello("world") + "</p>");
out.println("</body>");
out.println("</html>");
}
}
// doGet and doPost methods, which call processRequest, and
// getServletInfo method
private String sayHello(java.lang.String arg0) {
javaeetutorial.helloservice.endpoint.Hello port =
service.getHelloPort();
return port.sayHello(arg0);
}
}
Running the Web Client
You can use either NetBeans IDE or Maven to build, package, deploy, and run the hello-webclient
application. To build the client, you must first have deployed helloservice-war
, as described inBuilding, Packaging, and Deploying the Service.
The following topics are addressed here:
To Run the Web Client Using NetBeans IDE
- From the File menu, choose Open Project.
- In the Open Project dialog box, navigate to:
tut-install/examples/jaxws
- Select the
hello-webclient
folder. - Click Open Project.
- In the Projects tab, right-click the
hello-webclient
project and select Build.
This task runs thewsimport
goal, builds and packages the application into a WAR file,hello-webclient.war
, located in thetarget
directory, and deploys it to GlassFish Server. - In a web browser, enter the following URL:
http://localhost:8080/hello-webclient/HelloServlet
The output of the sayHello
method appears in the window.
To Run the Web Client Using Maven
- In a terminal window, go to:
tut-install/examples/jaxws/hello-webclient/
- Enter the following command:
This command runs thewsimport
goal, then build and packages the application into a WAR file,hello-webclient.war
, located in thetarget
directory. The WAR file is then deployed to GlassFish Server. - In a web browser, enter the following URL:
http://localhost:8080/hello-webclient/HelloServlet
The output of the sayHello
method appears in the window.