<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at Jun 28, 2015 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Apache Axis2 - 


Introducing Axis2</title>
    <style type="text/css" media="all">
      @import url("../css/maven-base.css");
      @import url("../css/maven-theme.css");
      @import url("../css/site.css");
    </style>
    <link rel="stylesheet" href="../css/print.css" type="text/css" media="print" />
    <meta name="Date-Revision-yyyymmdd" content="20150628" />
    <meta http-equiv="Content-Language" content="en" />
        <meta name="generator" content="HTML Tidy for Windows (vers 14 June 2007), see www.w3.org" /><meta http-equiv="content-type" content="" />
        </head>
  <body class="composite">
    <div id="banner">
                        <a href="http://www.apache.org/" id="bannerLeft">
                                        <img src="http://www.apache.org/images/asf_logo_wide.png" alt="Apache Axis2" />
                </a>
                                            <a href=".././" id="bannerRight">
                                                <img src="../images/axis.jpg" alt="Apache Axis2" />
                </a>
            <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
            
            
                <div class="xleft">
        <span id="publishDate">Last Published: 2015-06-28</span>
                  &nbsp;| <span id="projectVersion">Version: 1.6.3</span>
                      </div>
            <div class="xright">                    <a href="../index.html" title="Axis2/Java">Axis2/Java</a>
            |
                        <a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a>
              
            
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
             
            
                                <h5>Axis2/Java</h5>
                  <ul>
                  <li class="none">
                          <a href="../index.html" title="Home">Home</a>
            </li>
          </ul>
                       <h5>Downloads</h5>
                  <ul>
                  <li class="none">
                          <a href="../download.cgi" title="Releases">Releases</a>
            </li>
                  <li class="none">
                          <a href="../modules/index.html" title="Modules">Modules</a>
            </li>
                  <li class="none">
                          <a href="../tools/index.html" title="Tools">Tools</a>
            </li>
          </ul>
                       <h5>Documentation</h5>
                  <ul>
                  <li class="none">
                          <a href="../docs/toc.html" title="Table of Contents">Table of Contents</a>
            </li>
                  <li class="none">
                          <a href="../docs/installationguide.html" title="Installation Guide">Installation Guide</a>
            </li>
                  <li class="none">
                          <a href="../docs/quickstartguide.html" title="QuickStart Guide">QuickStart Guide</a>
            </li>
                  <li class="none">
                          <a href="../docs/userguide.html" title="User Guide">User Guide</a>
            </li>
                  <li class="none">
                          <a href="../docs/jaxws-guide.html" title="JAXWS Guide">JAXWS Guide</a>
            </li>
                  <li class="none">
                          <a href="../docs/pojoguide.html" title="POJO Guide">POJO Guide</a>
            </li>
                  <li class="none">
                          <a href="../docs/spring.html" title="Spring Guide">Spring Guide</a>
            </li>
                  <li class="none">
                          <a href="../docs/webadminguide.html" title="Web Administrator's Guide">Web Administrator's Guide</a>
            </li>
                  <li class="none">
                          <a href="../docs/migration.html" title="Migration Guide (from Axis1)">Migration Guide (from Axis1)</a>
            </li>
          </ul>
                       <h5>Resources</h5>
                  <ul>
                  <li class="none">
                          <a href="../faq.html" title="FAQ">FAQ</a>
            </li>
                  <li class="none">
                          <a href="../articles.html" title="Articles">Articles</a>
            </li>
                  <li class="none">
                          <a href="http://wiki.apache.org/ws/FrontPage/Axis2/" class="externalLink" title="Wiki">Wiki</a>
            </li>
                  <li class="none">
                          <a href="../refLib.html" title="Reference Library">Reference Library</a>
            </li>
                  <li class="none">
                          <a href="../api/index.html" title="Online Java Docs">Online Java Docs</a>
            </li>
          </ul>
                       <h5>Get Involved</h5>
                  <ul>
                  <li class="none">
                          <a href="../overview.html" title="Overview">Overview</a>
            </li>
                  <li class="none">
                          <a href="../svn.html" title="Checkout the Source">Checkout the Source</a>
            </li>
                  <li class="none">
                          <a href="../mail-lists.html" title="Mailing Lists">Mailing Lists</a>
            </li>
                  <li class="none">
                          <a href="../release-process.html" title="Release Process">Release Process</a>
            </li>
                  <li class="none">
                          <a href="../guidelines.html" title="Developer Guidelines">Developer Guidelines</a>
            </li>
                  <li class="none">
                          <a href="../siteHowTo.html" title="Build the Site">Build the Site</a>
            </li>
          </ul>
                       <h5>Project Information</h5>
                  <ul>
                  <li class="none">
                          <a href="../team-list.html" title="Project Team">Project Team</a>
            </li>
                  <li class="none">
                          <a href="../issue-tracking.html" title="Issue Tracking">Issue Tracking</a>
            </li>
                  <li class="none">
                          <a href="http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/" class="externalLink" title="Source Code">Source Code</a>
            </li>
                  <li class="none">
                          <a href="../thanks.html" title="Acknowledgements">Acknowledgements</a>
            </li>
                  <li class="none">
                          <a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="externalLink" title="License">License</a>
            </li>
                  <li class="none">
                          <a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship">Sponsorship</a>
            </li>
                  <li class="none">
                          <a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks">Thanks</a>
            </li>
                  <li class="none">
                          <a href="http://www.apache.org/security/" class="externalLink" title="Security">Security</a>
            </li>
          </ul>
                             <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
        <img class="poweredBy" alt="Built by Maven" src="../images/logos/maven-feather.png" />
      </a>
                   
            
            </div>
    </div>
    <div id="bodyColumn">
      <div id="contentBox">
        <!-- ~ Licensed to the Apache Software Foundation (ASF) under one
  ~ or more contributor license agreements. See the NOTICE file
  ~ distributed with this work for additional information
  ~ regarding copyright ownership. The ASF licenses this file
  ~ to you under the Apache License, Version 2.0 (the
  ~ "License"); you may not use this file except in compliance
  ~ with the License. You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing,
  ~ software distributed under the License is distributed on an
  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~ KIND, either express or implied. See the License for the
  ~ specific language governing permissions and limitations
  ~ under the License. --><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<a name="buildservices" id="buildservices"></a>
<h1>Apache Axis2 User's Guide -Building Services</h1>
<p>Now that you know how to use Axis2 to generate clients from
WSDL, this section digs a little deeper showing you how to create
services, and also how to create services and clients &quot;from
scratch&quot;, so to speak.</p>
<ul>
<li><a href="userguide.html#intro">Introducing Axis2</a><br />
<ul>
<li><a href="userguide.html#whatis">What is Axis2?</a></li>
<li><a href="userguide.html#underhood">What's Under the
Hood?</a></li>
<li><a href="userguide.html#handlessoap">How Axis2 Handles SOAP
Messages</a></li>
<li><a href="userguide.html#distributions">Axis2
Distributions</a></li>
<li><a href="userguide.html#sbd">The Axis2 Standard Binary
Distribution</a></li>
<li><a href="userguide.html#hierarchy">Axis2.war Directory
Hierarchy</a></li>
<li><a href="userguide.html#docs">Axis2 Documents
Distribution</a></li>
<li><a href="userguide.html#clients">Axis2 and Clients</a></li>
</ul>
</li>
<li><a href="userguide-installingtesting.html#installingtesting">Installing and
Testing Client Code</a></li>
<li><a href="userguide-introtoservices.html#introservices">Introduction to
Services</a><br />
<ul>
<li><a href="userguide-introtoservices.html#messageexchange">Message Exchange
Patterns</a></li>
</ul>
</li>
<li><a href="userguide-creatingclients.html#createclients">Creating
Clients</a><br />
<ul>
<li><a href="userguide-creatingclients.html#choosingclient">Choosing a Client
Generation Method</a></li>
<li><a href="userguide-creatingclients.html#generating">Generating
Clients</a></li>
<li><a href="userguide-creatingclients.html#adb">Axis Data Binding
(ADB)</a></li>
</ul>
</li>
<li><a href="userguide-buildingservices.html#buildservices"><b>Building
Services</b></a><br />
<ul>
<li><a href="userguide-buildingservices.html#getcomfortable"><b>Getting
Comfortable with Available Options</b></a></li>
<li><a href="userguide-buildingservices.html#createscratch"><b>Creating a
Service from Scratch</b></a></li>
<li><a href="userguide-buildingservices.html#deploypojo"><b>Deploying
Plain Old Java Objects</b></a></li>
<li><a href="userguide-buildingservices.html#deployrun"><b>Deploying and
Running an Axis2 Service Created from WSDL</b></a></li>
</ul>
</li>
<li><a href="userguide-samples.html">Samples</a></li>
<li><a href="userguide-forfurtherstudy.html">For Further
Study</a></li>
</ul>
<p><a name="getcomfortable" id="getcomfortable"></a></p>
<div class="section"><h2>Getting Comfortable with the Available Options<a name="Getting_Comfortable_with_the_Available_Options"></a></h2>
<p>Axis2 provides a number of ways to create a service, such
as:</p>
<ul>
<li>Create a service and build it from scratch. In this case, you
build your service class to specifically access AXIOM OMElement
objects, then create the services.xml file and package it for
deployment.</li>
<li>Deploy Plain Old Java Objects (POJOs) as a service.</li>
<li>Generate the service from WSDL. Just as you can generate
clients with WSDL, you can also generate the skeleton of a
service.</li>
</ul>
<p>Let's look at these three options.</p>
<a name="createscratch" id="createscratch"></a>
<div class="section"><h2>Creating a Service from Scratch<a name="Creating_a_Service_from_Scratch"></a></h2>
<p>Creating a service from scratch is not the most convenient way
to do it, but it does give you the most control. The process
involves several steps.</p>
<p><b>The short story:</b></p>
<ol style="list-style-type: decimal">
<li>Create the service class with each operation that is
represented by a method that takes an org.apache.axiom.om.OMElement
object as its argument. (An OMElement is how the AXIs2 Object Model
(AXIOM) represents an XML element.)</li>
<li>Create the service descriptor, services.xml, which defines the
class to be used by the service and the appropriate message
receivers.</li>
<li>Create the .aar file, with the classes in their proper
locations based on the package and the services.xml file in the
META-INF directory.</li>
<li>Deploy the .aar file by using the <a href="webadminguide.html">Web Administration application</a> or by
copying it to the Axis2 services directory.</li>
</ol>
<p><b>The long story:</b></p>
<p>Start by creating the service class, a plain Java class that
uses classes from the Axis2 libraries (see Code Listing 8).</p>
<div class="section"><h3>Code Listing 8-Creating the Service Class<a name="Code_Listing_8-Creating_the_Service_Class"></a></h3>
<div><pre>
package org.apache.axis2.axis2userguide;

import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

public class SampleService {

    public OMElement sayHello(OMElement element) 
                             throws XMLStreamException {
            element.build();
            element.detach();

            String rootName = element.getLocalName();
            System.out.println(&quot;Reading &quot;+rootName+&quot; element&quot;);
            
            OMElement childElement = element.getFirstElement();
            String personToGreet = childElement.getText();

            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace(
                    &quot;http://example1.org/example1&quot;, &quot;example1&quot;);
            OMElement method = fac.createOMElement(&quot;sayHelloResponse&quot;, 
omNs);
            OMElement value = fac.createOMElement(&quot;greeting&quot;, omNs);
            value.addChild(fac.createOMText(value, &quot;Hello, 
&quot;+personToGreet));
            method.addChild(value);

            return method;
        }

     private void ping(){
     }
    
}
</pre></div>
<p>Make sure to include Axis2 libraries in your class path when
compiling the source.</p>
<p>Axis2 uses AXIOM, or the AXIs Object Model, a DOM (Document
Object Model) -like structure that is based on the StAX API (
Streaming API for XML). Methods that act as services must take an
OMElement as their argument, which represents the payload of the
incoming SOAP message. (An OMElement is just AXIOM's way of
representing an XML element, like a DOM Element object.) In this
case, you're extracting the contents of the first child of the
payload element, adding text to it, and using it as content for the
return OMElement. Unless this is an &quot;in only&quot; service, these
methods must return an OMElement, because that becomes the payload
of the return SOAP message.</p>
<p>To turn this class into a service, create the service
description file, services.xml, as in Code Listing 9.</p>
</div><div class="section"><h3>Code Listing 9 - Create the Service Description<a name="Code_Listing_9_-_Create_the_Service_Description"></a></h3>
<div><pre>
&lt;service name=&quot;UserGuideSampleService&quot;&gt;
    &lt;description&gt;
        This is a sample service created in the Axis2 User's Guide
    &lt;/description&gt;

    &lt;parameter name=&quot;ServiceClass&quot; 
&gt;org.apache.axis2.axis2userguide.SampleService
&lt;/parameter&gt;

    &lt;operation name=&quot;sayHello&quot;&gt;
        &lt;messageReceiver 
class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot;/&gt;
    &lt;/operation&gt;
    &lt;operation name=&quot;ping&quot;&gt;
        &lt;messageReceiver 
class=&quot;org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver&quot;/&gt;
    &lt;/operation&gt;
&lt;/service&gt;
</pre></div>
<p>This document defines the service, called by the <a href="webadminguide.html">Web Administration Application</a>, and the
class used to serve requests. For each operation, it defines the
appropriate message receiver class.</p>
<p>Create a new directory, META-INF, in the main directory for the
class. (In this case, that's the same directory that contains the
org directory) and place the services.xml file in it.</p>
<p>Create the .aar file by typing: jar cvf SampleService.aar
./*</p>
<p>Deploy the SampleService.aar file by using the <a href="webadminguide.html">Web Administration application</a> or by
copying it to the Axis2 services directory.</p>
<p>Now you can create a client class that accesses the service
directly (see Code Listing 10).</p>
</div><div class="section"><h3>Code Listing 10 - Create a Client Class that Accesses the
Service Directly<a name="Code_Listing_10_-_Create_a_Client_Class_that_Accesses_theService_Directly"></a></h3>
<div><pre>
package org.apache.axis2.axis2userguide;

import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.Constants;
import org.apache.axis2.client.ServiceClient;

public class SampleClient {

       private static EndpointReference targetEPR = 
             new EndpointReference(
               &quot;http://localhost:8080/axis2/services/UserGuideSampleService&quot;);

        public static OMElement greetUserPayload(String personToGreet) {
            OMFactory fac = OMAbstractFactory.getOMFactory();
            OMNamespace omNs = fac.createOMNamespace(
                    &quot;http://example1.org/example1&quot;, &quot;example1&quot;);
            OMElement method = fac.createOMElement(&quot;sayHello&quot;, omNs);
            OMElement value = fac.createOMElement(&quot;personToGreet&quot;, 
omNs);
            value.addChild(fac.createOMText(value, personToGreet));
            method.addChild(value);
            return method;
        }

        public static void main(String[] args) {
            try {
                OMElement payload = 
SampleClient.greetUserPayload(&quot;John&quot;);
                Options options = new Options();
                options.setTo(targetEPR);
                
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

                ServiceClient sender = new ServiceClient();
                sender.setOptions(options);
                OMElement result = sender.sendReceive(payload);

                String response = result.getFirstElement().getText();
                System.out.println(response);

            } catch (Exception e) { //(XMLStreamException e) {
                System.out.println(e.toString());
            }
        }
    
}
</pre></div>
<p>This class uses the same technique of sending and receiving
OMElements, but it's also important to note the use of the Options
class. This class enables you to determine properties such as the
transport used for the return message (the transport used for the
outgoing message can be inferred from the URL of the destination)
and the SOAP version to use. In addition to providing setter and
getter methods of specific properties that affect how the client
interacts with the service, the Options class enables you to create
inheritance relationships between Options objects. So if a property
is not found in the current Options object used, the client can
check the parent Options object of the current Options object.</p>
<p>Compile and run the above SampleClient.java. Make sure to have
all axis2 libraries in your class path. If all has gone well,
'Hello, John' will be shown as the output in the console.</p>
<a name="deploypojo" id="deploypojo"></a>
</div><div class="section"><h2>Deploying Plain Old Java Objects (POJOs)<a name="Deploying_Plain_Old_Java_Objects_POJOs"></a></h2>
<p>One very easy way to create a Web service is simply to deploy
the Java objects that represent the service. Start with the class,
shown in Code Listing 11.</p>
<div class="section"><h3><b>Code Listing 11 - Creating the Class SampleService</b><a name="Code_Listing_11_-_Creating_the_Class_SampleService"></a></h3>
<div><pre>
package org.apache.axis2.axis2userguide;

public class SampleService {

    public void doInOnly(){
     return; 
    } 
     
    public String noParameters(){
      return &quot;Hello&quot;;
    } 
    
    public String twoWayOneParameterEcho(String toEcho){
      return toEcho;
    } 
    
    public boolean multipleParametersAdd(float price, int itemId, 
                             String description, String itemName){
      //Code to handle the logic
                return true;
    } 
 
}
</pre></div>
<p>Next, you'll need to tell Axis2 what class corresponds with what
Web service calls. Do this by creating a file called services.xml
and adding the following shown in Code Listing 12.</p>
</div><div class="section"><h3><b>Code Listing 12 - Creating services.xml</b><a name="Code_Listing_12_-_Creating_services.xml"></a></h3>
<div><pre>
&lt;service name=&quot;SampleService&quot; scope=&quot;application&quot;&gt;
    &lt;description&gt;
        Sample Service
    &lt;/description&gt;
    &lt;messageReceivers&gt;
        &lt;messageReceiver 
            mep=&quot;http://www.w3.org/2004/08/wsdl/in-only&quot;
    class=&quot;org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver&quot;/&gt;
        &lt;messageReceiver
            mep=&quot;http://www.w3.org/2004/08/wsdl/in-out&quot;
    class=&quot;org.apache.axis2.rpc.receivers.RPCMessageReceiver&quot;/&gt;
    &lt;/messageReceivers&gt;
    &lt;parameter name=&quot;ServiceClass&quot;&gt;
        org.apache.axis2.axis2userguide.SampleService
    &lt;/parameter&gt;
&lt;/service&gt;
</pre></div>
<p>This file makes the InOnly and InOut MEPs available to the
service and tells Axis2 which class to call; operations must match
method names. In other words, Axis2 automatically sends a call to
the multipleParametersAdd operation to the
org.apache.axis2.axis2userguide.SampleService.multipleParametersAdd()
method.</p>
<p>Now it's time to create the distribution. Arrange your files in
the following directory structure (see Code Listing 13).</p>
</div><div class="section"><h3><b>Code Listing 13- Create the Directory Structure for the
Distribution</b><a name="Code_Listing_13-_Create_the_Directory_Structure_for_theDistribution"></a></h3>
<div><pre>
 - SampleService
   - META-INF
     - services.xml
   - org
     - apache
       - axis2
         - axis2userguide
           - SampleService.class
</pre></div>
<p>Finally, deploy the service by copying the SampleService
directory to the webapps/axis2/WEB-INF/services directory on the
servlet engine. You can check to make sure that it's been properly
deployed by checking http://&lt;host&gt;:&lt;port&gt;/axis2/services/listServices.</p>
<a name="deployrun" id="deployrun"></a>
</div><div class="section"><h2>Deploying and Running an Axis2 Service Created from WSDL<a name="Deploying_and_Running_an_Axis2_Service_Created_from_WSDL"></a></h2>
<p>If you have a WSDL file, you can easily create and deploy a
service based on that description. For example, to create a service
based on the same WSDL file used in the <a href="userguide-creatingclients.html">clients section</a> of this
document, you will follow the steps below.</p>
<p><b>The short story:</b></p>
<ol style="list-style-type: decimal">
<li><a href="../download.cgi">
Download</a> the Axis2 standard distribution, if you have not done
so already.</li>
<li>Generate the skeleton using the WSDL2Java utility, as in:<br />
<div><pre>
java org.apache.axis2.wsdl.WSDL2Java -uri file:///C:/apps/axis2/samples/zSample/Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d adb -s -wv 1.1 -ss -sd -ssi
</pre></div></li>
<li>Open the *Skeleton.java file and add the functionality of your
service to the generated methods.</li>
<li>Build a service using Ant by typing ant jar.server</li>
<li>Deploy the service by copying the build/lib/*.aar file to
&lt;J2EE_HOME&gt;/webapps/axis2/WEB-INF/services</li>
<li>Check
http://&lt;server&gt;:&lt;port&gt;/axis2/services/listServices to
make sure the service has been properly deployed.</li>
</ol>
<p><b>The long story:</b></p>
<p>As with generating clients, you will need the <a href="../download.cgi">
Axis2 Standard Distribution</a>, because the <a href="../download.cgi">
Axis2 WAR Distribution</a> does not include the WSDL2Java utility.
Once you've got it downloaded and unpacked, make sure that you set
the AXIS2_HOME variable to point to the location in which you've
unpacked it.</p>
<p>Now you are ready to generate the actual service. To keep things
neat, create a new directory and change to it. The WSDL file is the
same one referenced in <a href="userguide-creatingclients.html#generating.xhtml">Generating Clients</a>
and includes four operations: NoParameters, TwoWayOneParameterEcho,
MultipleParametersAddItem, and DoInOnly. To generate the service,
use the WSDL2Java utility, as in Code Listing 14.</p>
<div class="section"><h3>Code Listing 14 - Using the WSDL2Java Utility to Generate the
Service<a name="Code_Listing_14_-_Using_the_WSDL2Java_Utility_to_Generate_theService"></a></h3>
<p><b>Code Listing 14.1:</b></p>
<div><pre>
java org.apache.axis2.wsdl.WSDL2Java -uri 
file:///C:/apps/axis2/samples/zSample/Axis2UserGuide.wsdl -p 
org.apache.axis2.axis2userguide -d adb -s -wv 1.6.3 -ss -sd
</pre></div>
<p>Note: Make sure all the .jar files in the Axis2 lib directory is
set to the CLASSPATH before you run the above code.</p>
<p>This statement tells the utility you want to create a service
out of the operations in the file <a href="userguide-codelisting5.html">Axis2UserGuide.wsdl</a>, and that the
Java classes generated should be in the
org.apache.axis2.axis2userguide package (-p). (You can view the
appropriate directories created.) It also indicates that you want
to use the Axis2 DataBinding Framework, or ADB (-d), to generate
only synchronous or blocking code (-s), and to generate server-side
code (-ss) as opposed to a client, including the services.xml
service descriptor file (-sd). It also specifies version
1.6.3 for the WSDL file (-wv)<b>.</b></p>
<p><b>Code Listing 14.2:</b></p>
<p>You can also use the following script files to achieve the same.
In this case you do not have the set the CLASSPATH manually.</p>
<p>For Linux:</p>
<div><pre>
$AXIS2_HOME/bin/wsdl2java.sh -uri file:///C:/apps/axis2/samples/zSample/Axis2UserGuide.wsdl
-p org.apache.axis2.axis2userguide -o target_directory_name -d adb -s -wv 1.6.3 -ss -sd
</pre></div>
<p>For MS Windows:</p>
<div><pre>
%AXIS2_HOME%\bin\wsdl2java.bat -uri file:\\\C:\apps\axis2\samples\zSample\Axis2UserGuide.wsdl
-p org.apache.axis2.axis2userguide -o target_directory_name -d adb -s -wv 1.6.3 -ss -sd
</pre></div>
<p>In both instances, at this point, you should see four new items
in your chosen directory: the build.xml file, which includes
instructions for Ant, the src directory, which includes all the
generated classes and stubs, the resources directory, which
includes a regenerated version of the WSDL, and the services.xml
file, which ultimately controls the service's behavior.</p>
<p>You can compile the service at this point, but it doesn't
actually do anything yet. You can solve that problem by opening the
src\org\apache\axis2\axis2userguide\Axis2UserGuideServiceSkeleton.java
file and either editing the code in bold -- make sure you manage
parameter numbers -- or replacing all the code with the following
in Code Listing 15.</p>
</div><div class="section"><h3>Code Listing 15 - Compiling the Service<a name="Code_Listing_15_-_Compiling_the_Service"></a></h3>
<div><pre>
/**
 * Axis2UserGuideServiceSkeleton.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: SNAPSHOT Oct 15, 2006 (11:23:18 
GMT+00:00)
 */
package org.apache.axis2.axis2userguide;
/**
 *  Axis2UserGuideServiceSkeleton java skeleton for the axisService
 */
public class Axis2UserGuideServiceSkeleton {
     
         
    /**
     * Auto generated method signature
         
     * @param param7
         
    */
    public  org.apache.axis2.axis2userguide.NoParametersResponse 
NoParameters
        (org.apache.axis2.axis2userguide.NoParametersRequest param7)
         
    {
        <b>System.out.println(param7);

        NoParametersResponse res =
            new NoParametersResponse();

        return res;</b>
    }
     
         
    /**
     * Auto generated method signature
         
     * @param param9
         
    */
    public  
org.apache.axis2.axis2userguide.TwoWayOneParameterEchoResponse 
TwoWayOneParameterEcho
        (
         org.apache.axis2.axis2userguide.TwoWayOneParameterEchoRequest 
param9
         )
         
    {
        <b>System.out.println(param9.getEchoString());

        TwoWayOneParameterEchoResponse res =
            new TwoWayOneParameterEchoResponse();
        
        res.setEchoString(param9.getEchoString());

        return res;</b>
    }
     
         
    /**
     * Auto generated method signature
         
     * @param param11
         
    */
    public  void DoInOnly
        (
         org.apache.axis2.axis2userguide.DoInOnlyRequest param11
         )
         
    {
        <b>System.out.println(param11.getMessageString());</b>
    }
     
         
    /**
     * Auto generated method signature
         
     * @param param12
         
    */
    public  
org.apache.axis2.axis2userguide.MultipleParametersAddItemResponse 
MultipleParametersAddItem
        (
         
org.apache.axis2.axis2userguide.MultipleParametersAddItemRequest 
param12
         )
         
    {
        <b>System.out.println(param12.getPrice());
        System.out.println(param12.getItemId());
        System.out.println(param12.getDescription());
        System.out.println(param12.getItemName());

        MultipleParametersAddItemResponse res =
            new MultipleParametersAddItemResponse();
        
        res.setSuccessfulAdd(true);
        res.setItemId(param12.getItemId());

        return res;</b>
    }
     
}
</pre></div>
<p>As with generating clients, all these classes, such as
MultipleParametersAddItemRequest and
TwoWayOneParameterEchoResponse, are generated by the utility, and
can be found in the same directory as the skeleton file. They
include methods such as setSuccessfulAdd(), which sets the value of
the content of an element in the response, and getItemName(), which
retrieves the content of elements in the request.</p>
<p>Save the file and compile it by typing: ant jar.server</p>
<p>If all goes well, you should see the BUILD SUCCESSFUL message in
your window, and the Axis2UserGuideService.aar file in the newly
created build/lib directory.</p>
<p><img src="images/fig05.jpg" alt="The BUILD SUCCESSFUL message in your window" /></p>
<p>Now you need to deploy the service to the server. To do that,
copy the Axis2UserGuideService.aar file to the WEB-INF/services
directory of the application server. (You also have the option to
use the administration tools. See the <a href="webadminguide.html">Web Administrator's Guide</a> for more
information.)</p>
<p>To verify that the service has been properly deployed, check the
list of services at http://&lt;host&gt;:&lt;port&gt;/axis2/services/listServices.</p>
<p><img src="images/fig06.jpg" alt="Checking the list of services" /></p>
<p>Now you should be able to access the service using any of the
clients built in the <a href="userguide-creatingclients.html#generating">Generating Clients</a>
document.</p>
<p><b>See Next Section</b>- <a href="userguide-samples.html">Samples</a></p>
</div>
</html>
      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">
              Copyright &#169;                    2004-2015
                        <a href="http://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
            
                  </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
