Web Services (JAX-WS) in Java EE 5
Contributed and maintained
by Geertjan Wielenga, Manisha Umbarje, Martin Grebac, Milan Kuchtiak, and Radko Najman
Java API for XML Web Services (JAX-WS) 2.0, JSR 224, is an important part
    of the Java EE 5 platform. A follow-on release of Java API for
    XML-based RPC 1.1(JAX-RPC), JAX-WS simplifies the task of
    developing web services using Java technology. It addresses some
    of the issues in JAX-RPC 1.1 by providing support for multiple
    protocols such as SOAP 1.1, SOAP 1.2, XML, and by providing
    a facility for supporting additional protocols along with HTTP.
    JAX-WS uses JAXB 2.0 for data binding and supports
    customizations to control generated service endpoint interfaces.
    With its support for annotations, JAX-WS simplifies web service
development and reduces the size of runtime JAR files.
This document takes you through the basics of using the IDE to develop a JAX-WS web service
    and to consume it in three different clients—either a Java class in a Java SE application, or
    a servlet or JSP page
    in a web application. The three clients that you create in this document are separate applications, all
consuming the same web service.
Expected duration: 25 minutes
    Software Needed for the Tutorial
    Before you begin, you need to install the following software on your computer:
    
        - NetBeans IDE 5.5 (download).
        
 - Java Standard Development Kit (JDK) version 5.0 or version 6.0 (download).
 
        - Sun Java System Application Server 9.0
            (if not bundled with your NetBeans IDE installation,
        download and install it separately).
 
    
    Tutorial Exercises
    
 
Installing and Configuring the Tutorial
Environment
If you have not registered an instance of the Sun Java System Application Server
9.0, you must do so before you can begin developing Java EE 5 applications:
    - Choose Tools > Server Manager from the main window.
 
    - Click Add Server. Select Sun Java System Application Server and give a name
    to the instance. Then click Next.
 
    - Specify the server information, the location of the local instance of the
    application server, and the domain to which you want to deploy.
    
 - Click Finish.
 
Note: If you want to deploy to the Tomcat Web Server, you can do so, except that, since it only has a web container, you
should create a web application, not an EJB module, in the next section. JAX-WS web services, unlike JSR-109 web services,
can deploy successfully to the Tomcat web container.
    
Creating a Web Service
The goal of this exercise is to create a project appropriate to the deployment container that you decide to use. Once
you have a project, you will create a web service in it.
    Choosing a Container
    You can either deploy your web service in a web container or in an EJB container. This depends on implementation choices.
        For example, if you plan to deploy to the Tomcat Web Server, which only has a web container, you should choose to create a web application,
    and not an EJB module.
    
        -  Choose File > New Project (Ctrl-Shift-N). Select Web Application from
        the Web category or EJB Module from the Enterprise category. 
 
        - Name the project CalculatorWSApplication.
        
 - Depending on the deployment server that you want to use, do the following:
        
- For the Sun Java System Application Server, set the J2EE Version to Java EE 5.
        
 - For the Tomcat Web Server, unselect the Set Source Level to 1.4 checkbox.
 
         - Click Finish.
 
    
    Creating a Web Service from a Java Class
    
        - Right-click the CalculatorWSApplication node and
        choose New > Web Service.
 
        - Name the web service CalculatorWS, type org.me.calculator in
            Package,
            and click Finish. 
The Projects window displays the new web service. For
                example, for web
            applications the Projects window now looks as follows:
            
            
The IDE automatically creates the deployment descriptors required
                for the server, if any. For the Sun Java System Application Server, no deployment descriptor
                is needed. For web services deployed to the Tomcat Web Server, sun-jaxws.xml and a WSServlet
            item in web.xml are added. 
         
    
    Summary
    In this exercise, you created a NetBeans project and set up the web service. 
 
    
Coding the Web Service
The goal of this exercise is to do something meaningful with the files and code
    that the IDE has generated for you. You will add an operation that will add two numbers
received from a client.
    Adding Business Logic to the Web Service
    
        - Expand the Web Services node
        and double-click the CalculatorWS node. The web service
        opens in the Source Editor. Note that an operation
        exists in the code already. It is commented out. Here,
        we create a new operation from scratch. Another way
        of creating the operation would be to remove the
        lines that comment out the code.
        
 - Right-click within the body of the class, either
        above or below the code that is commented out, and choose Web Service > Add Operation.
        
 - In the upper part of the Add Operation dialog box, type add in Name and choose int from
        the Return Type drop-down list.
        
 - In the lower part of the Add Operation dialog box, click Add and create a parameter of type int named i. Click OK.
        
 - Click Add again and create a parameter of type int called j.
        
 - Click OK at the bottom of the Add Operation dialog box.
            Notice that a skeleton for the add method has been added to the Source Editor:
            
    @WebMethod
    public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
        // TODO implement operation
        return 0;
            }
         
        - Change the add method to the following (changes are in bold):
        
    @WebMethod
    public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
        int k = i + j;
        return k;
        } 
    
    Summary
    In this exercise, you added code to the web service. 
 
Deploying and Testing the Web Service
    When you deploy a web service to a web container, the IDE lets you test the
    web service to see if it functions as you expect. The Tester application, provided
    by the Sun Java System Application Server, is integrated into the IDE for this purpose. For the
    Tomcat Web Server, there is a similar tool. However, while the Sun Java System Application Server's
    Tester page lets you enter values and test them, the Tomcat Web Server does not. In the
    latter case, you can only see that the web service is deployed, you cannot test the values. No
    facility for testing whether an EJB module is deployed successfully is currently available.
    To test successful deployment to a web container:
    
        - Right-click the project node, choose Properties, and click Run. Depending on the deployment
            server that you want to use, do the following:
            
- For the Sun Java System Application Server, type /CalculatorWSService?Tester in the Relative URL field.
 
                - For the Tomcat Web Server, type /CalculatorWS?Tester in the Relative URL field.
 
            
            Note: Since the result of a deployed EJB module is not displayed in a browser, you cannot
        take the step above if you are working with an EJB module.
 
        - Right-click the project node and choose Run Project.
            
The IDE starts the
                application server, builds the application, and opens the tester page in your browser, if you
                deployed a web application to the Sun Java System Application Server. For the Tomcat Web Server
            and deployment of EJB modules, the situation is different:
            - If you deployed to the Tomcat Web Server, you
                    will see the following instead, which indicates that you have successfully deployed your
                    web service:
                

 
                - If you deployed an EJB module, successful deployment is indicated by the following
                    messages in the Output window:
                    
    Deployment of application CalculatorWSApplication  completed successfully
    Enable of CalculatorWSApplication in target server   completed successfully
    Enable of application in all targets  completed successfully
    All operations completed successfully
    run-deploy:
    run:
    BUILD SUCCESSFUL 
                - If you deployed to the Sun Java System Application Server, type two numbers
                    in the tester page, as shown below:
                    
                    
The sum of the two numbers is displayed:
                 
            
         
    
    Summary
    In this exercise, you deployed a web service and tested it. 
 Consuming the Web Service
Now that we have deployed our web service,
    we need to create a client to make use of the web service's add method. Here,
    we create three clients— a Java class in a Java SE application,
    a servlet, and a JSP page
in a web application.
    Client 1: Java Class in Java SE Application
    
        - Choose File > New Project (Ctrl-Shift-N). Select Java Application from
            the General category. Name the project CalculatorWS_Client_Application.
            
Note: At the time of writing, issue Issue 10 was unresolved;
                therefore, you must create your web service client in a project folder that does not contain spaces in
            its path. For example, the path should not be "C:\Documents and Settings\...".
        Click Finish. 
        - Right-click the CalculatorWS_Client_Application node and
        choose New > Web Service Client.
 
        - In Project, click Browse. Browse to the web service that you want to consume.
        When you have selected the web service, click OK.
 
        - Type org.me.calculator.client in
            Package,
            and click Finish. 
The Projects window displays the new web service client:
            
        
 
        - Double-click Main.java so that it opens in the
            Source Editor. Delete the TODO comment and right-click in that line.
        Choose Web Service Client Resources > Call Web Service Operation.
 
        - Browse to the Add operation and click OK.
 
        - Change the line that is underlined in red to the following:
        
    System.out.println("Sum: " + port.add(3,4)); 
        - Right-click the project node and choose Run Project.
            
The Output window should now show the following:
                compile:
    run:
    Sum: 7
        BUILD SUCCESSFUL (total time: 1 second) 
    
    Client 2: Servlet in Web Application
    
        -  Choose File > New Project (Ctrl-Shift-N). Select Web Application from
            the Web category. Name the project CalculatorWSServletClient.
            
Note: At the time of writing, issue Issue 10 was unresolved;
                therefore, you must create your web service client in a project folder that does not contain spaces in
            its path. For example, the path should not be "C:\Documents and Settings\...".
        Click Finish.
 
        - Right-click the CalculatorWSServletClient node and
        choose New > Web Service Client.
 
        - In Project, click Browse. Browse to the web service that you want to consume.
        When you have selected the web service, click OK.
        
 - Type org.me.calculator.client in
            Package,
            and click Finish. 
The Projects window displays the new web service client:
            
        
 
        - Right-click the project node and choose New > Servlet. Name
        the servlet ClientServlet and house it in a package called org.me.calculator.client.
        Click Finish. To make the servlet the entry point to your application,
        right-click the project node, choose Properties, click Run, and
        type /ClientServlet in Relative URL. Click OK.
        
 - In the Source Editor, remove the line that comments out the
            body of the processRequest method. This is the line that starts
            the section that comments out the code:
            
    /* TODO output your page here
            Next, delete the line that ends the section of commented out code:
            
    */
            Add some empty lines after this line:
            
    out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
            Now, right-click in one of the empty lines that you added.
                Choose Web Service Client Resources > Call Web Service Operation. The Select Operation to Invoke
        dialog box appears.
 
        - Browse to the add operation and click OK.
            
The processRequest method now looks as follows (the added code is in bold below):
                protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet ClientServlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet ClientServlet at " + request.getContextPath () + "</h1>");
        try { // Call Web Service Operation
            org.me.calculator.client.CalculatorWSService service = new org.me.calculator.client.CalculatorWSService();
            org.me.calculator.client.CalculatorWS port = service.getCalculatorWSPort();
            // TODO initialize WS operation arguments here
            int arg0 = 0;
            int arg1 = 0;
            // TODO process result here
            int result = port.add(arg0, arg1);
            System.out.println("Result = "+result);
        } catch (Exception ex) {
            // TODO handle custom exceptions here
        }
        out.println("</body>");
        out.println("</html>");
        out.close();
            }
            Change the value for arg0
                and arg1 to other numbers,
            such as 3 and 4. 
            Change the System.out.println
            statement to out.println.
            
Add a line that prints out an exception, if an exception is thrown.
            
The try/catch block should now look as follows (new and changed
            lines are highlighted):
                try { // Call Web Service Operation
        org.me.calculator.client.CalculatorWSService service = new org.me.calculator.client.CalculatorWSService();
        org.me.calculator.client.CalculatorWSApplication port = service.getCalculatorWSApplicationPort();
        // TODO initialize WS operation arguments here
        int arg0 = 3;
        int arg1 = 4;
        // TODO process result here
        int result = port.add(arg0, arg1);
        out.println("<p>Result: " + result);
    } catch (Exception ex) {
        out.println("<p>Exception: " + ex);
            }
         
        - Right-click the project node and choose Run Project. 
The server starts, if
            it wasn't running already; the application is built and deployed, and the browser
        opens, displaying the calculation result.
 
    
    Client 3: JSP Page in Web Application
    
        -  Choose File > New Project (Ctrl-Shift-N). Select Web Application from
            the Web category. Name the project CalculatorWSJSPClient.
            
Note: At the time of writing, issue Issue 10 was unresolved;
            therefore, you must create your web service client in a project folder that does not contain spaces in
            its path. For example, the path should not be "C:\Documents and Settings\...".
        
Click Finish.
 
        - Right-click the CalculatorWSJSPClient node and
        choose New > Web Service Client.
 
        - In Project, click Browse. Browse to the web service that you want to consume.
        When you have selected the web service, click OK.
        
 - Type org.me.calculator.client in
        Package,
        and click Finish.
        
The Projects window displays the new web service client.
         - In the Web Pages folder, double-click index.jsp so that it opens in the
        Source Editor.
        
 - In the Web Service References node, expand
        the node that represents the web service. The add operation, which you want to
        invoke from the client, is now exposed.
        
 - Drag the add operation to the client's index.jsp page,
        and drop it below the H1 tags. The code for invoking the service's operation
        is now generated in the index.jsp page.
        
Change the value for arg0
        and arg1 to other numbers,
        such as 3 and 4.
        
 - Right-click the project node and choose Run Project. 
The server starts, if
        it wasn't running already; the application is built and deployed, and the browser
        opens, displaying the calculation result:
        
    
 
 
Next Steps
For more information about using NetBeans IDE 5.5 to develop Java EE applications, see the following resources:
To send comments and suggestions, get support, and keep informed on the latest
    developments on the NetBeans IDE Java EE development features, join
the mailing list.