<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.7.4 at 2017-07-30 
 | Rendered using Apache Maven Fluido Skin 1.6
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta name="Date-Revision-yyyymmdd" content="20170730" />
    <meta http-equiv="Content-Language" content="en" />
    <title>Apache Axis2 &#x2013; </title>
    <link rel="stylesheet" href="../../css/apache-maven-fluido-1.6.min.css" />
    <link rel="stylesheet" href="../../css/site.css" />
    <link rel="stylesheet" href="../../css/print.css" media="print" />
      <script type="text/javascript" src="../../js/apache-maven-fluido-1.6.min.js"></script>
<meta http-equiv="content-type" content="" />      </head>
    <body class="topBarDisabled">
      <div class="container-fluid">
      <div id="banner">
        <div class="pull-left"><a href="http://www.apache.org/" id="bannerLeft"><img src="http://www.apache.org/images/asf_logo_wide.png"  alt="Apache Axis2"/></a></div>
        <div class="pull-right"><a href="../.././" id="bannerRight"><img src="../../images/axis.jpg" /></a></div>
        <div class="clear"><hr/></div>
      </div>

      <div id="breadcrumbs">
        <ul class="breadcrumb">
        <li id="publishDate">Last Published: 2017-07-30<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 1.7.6<span class="divider">|</span></li>
        <li class=""><a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a><span class="divider">/</span></li>
      <li class=""><a href="../../index.html" title="Axis2/Java">Axis2/Java</a><span class="divider">/</span></li>
    <li class="active "></li>
        </ul>
      </div>
      <div class="row-fluid">
        <div id="leftColumn" class="span2">
          <div class="well sidebar-nav">
<ul class="nav nav-list">
          <li class="nav-header">Axis2/Java</li>
    <li><a href="../../index.html" title="Home"><span class="none"></span>Home</a>  </li>
    <li><a href="../../download.html" title="Downloads"><span class="none"></span>Downloads</a>  </li>
    <li><a href="javascript:void(0)" title="Release Notes"><span class="icon-chevron-down"></span>Release Notes</a>
      <ul class="nav nav-list">
    <li><a href="../../release-notes/1.6.1.html" title="1.6.1"><span class="none"></span>1.6.1</a>  </li>
    <li><a href="../../release-notes/1.6.2.html" title="1.6.2"><span class="none"></span>1.6.2</a>  </li>
    <li><a href="../../release-notes/1.6.3.html" title="1.6.3"><span class="none"></span>1.6.3</a>  </li>
    <li><a href="../../release-notes/1.6.4.html" title="1.6.4"><span class="none"></span>1.6.4</a>  </li>
    <li><a href="../../release-notes/1.7.0.html" title="1.7.0"><span class="none"></span>1.7.0</a>  </li>
    <li><a href="../../release-notes/1.7.1.html" title="1.7.1"><span class="none"></span>1.7.1</a>  </li>
    <li><a href="../../release-notes/1.7.2.html" title="1.7.2"><span class="none"></span>1.7.2</a>  </li>
    <li><a href="../../release-notes/1.7.3.html" title="1.7.3"><span class="none"></span>1.7.3</a>  </li>
    <li><a href="../../release-notes/1.7.4.html" title="1.7.4"><span class="none"></span>1.7.4</a>  </li>
    <li><a href="../../release-notes/1.7.5.html" title="1.7.5"><span class="none"></span>1.7.5</a>  </li>
    <li><a href="../../release-notes/1.7.6.html" title="1.7.6"><span class="none"></span>1.7.6</a>  </li>
      </ul>
  </li>
    <li><a href="../../modules/index.html" title="Modules"><span class="none"></span>Modules</a>  </li>
    <li><a href="../../tools/index.html" title="Tools"><span class="none"></span>Tools</a>  </li>
          <li class="nav-header">Documentation</li>
    <li><a href="../../docs/toc.html" title="Table of Contents"><span class="none"></span>Table of Contents</a>  </li>
    <li><a href="../../docs/installationguide.html" title="Installation Guide"><span class="none"></span>Installation Guide</a>  </li>
    <li><a href="../../docs/quickstartguide.html" title="QuickStart Guide"><span class="none"></span>QuickStart Guide</a>  </li>
    <li><a href="../../docs/userguide.html" title="User Guide"><span class="none"></span>User Guide</a>  </li>
    <li><a href="../../docs/jaxws-guide.html" title="JAXWS Guide"><span class="none"></span>JAXWS Guide</a>  </li>
    <li><a href="../../docs/pojoguide.html" title="POJO Guide"><span class="none"></span>POJO Guide</a>  </li>
    <li><a href="../../docs/spring.html" title="Spring Guide"><span class="none"></span>Spring Guide</a>  </li>
    <li><a href="../../docs/webadminguide.html" title="Web Administrator's Guide"><span class="none"></span>Web Administrator's Guide</a>  </li>
    <li><a href="../../docs/migration.html" title="Migration Guide (from Axis1)"><span class="none"></span>Migration Guide (from Axis1)</a>  </li>
          <li class="nav-header">Resources</li>
    <li><a href="../../faq.html" title="FAQ"><span class="none"></span>FAQ</a>  </li>
    <li><a href="../../articles.html" title="Articles"><span class="none"></span>Articles</a>  </li>
    <li><a href="http://wiki.apache.org/ws/FrontPage/Axis2/" class="externalLink" title="Wiki"><span class="none"></span>Wiki</a>  </li>
    <li><a href="../../refLib.html" title="Reference Library"><span class="none"></span>Reference Library</a>  </li>
    <li><a href="../../apidocs/index.html" title="Online Java Docs"><span class="none"></span>Online Java Docs</a>  </li>
          <li class="nav-header">Get Involved</li>
    <li><a href="../../overview.html" title="Overview"><span class="none"></span>Overview</a>  </li>
    <li><a href="../../svn.html" title="Checkout the Source"><span class="none"></span>Checkout the Source</a>  </li>
    <li><a href="../../mail-lists.html" title="Mailing Lists"><span class="none"></span>Mailing Lists</a>  </li>
    <li><a href="../../release-process.html" title="Release Process"><span class="none"></span>Release Process</a>  </li>
    <li><a href="../../guidelines.html" title="Developer Guidelines"><span class="none"></span>Developer Guidelines</a>  </li>
    <li><a href="../../siteHowTo.html" title="Build the Site"><span class="none"></span>Build the Site</a>  </li>
          <li class="nav-header">Project Information</li>
    <li><a href="../../team-list.html" title="Project Team"><span class="none"></span>Project Team</a>  </li>
    <li><a href="../../issue-tracking.html" title="Issue Tracking"><span class="none"></span>Issue Tracking</a>  </li>
    <li><a href="http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/" class="externalLink" title="Source Code"><span class="none"></span>Source Code</a>  </li>
    <li><a href="../../thanks.html" title="Acknowledgements"><span class="none"></span>Acknowledgements</a>  </li>
          <li class="nav-header">Apache</li>
    <li><a href="http://www.apache.org/licenses/LICENSE-2.0.html" class="externalLink" title="License"><span class="none"></span>License</a>  </li>
    <li><a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship"><span class="none"></span>Sponsorship</a>  </li>
    <li><a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks"><span class="none"></span>Thanks</a>  </li>
    <li><a href="http://www.apache.org/security/" class="externalLink" title="Security"><span class="none"></span>Security</a>  </li>
  </ul>
          <hr />
          <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
  <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="../../images/logos/maven-feather.png" /></a>
              </div>
          </div>
        </div>
        <div id="bodyColumn"  class="span10" >
<html>


<h1>Code Listing For Axis2SampleDocLitService Service</h1>


<div class="section">
<h2><a name="Server:"></a>Server:</h2>


<div class="section">
<h3><a name="echoString"></a>echoString</h3>


<p>Locate the following code segment in &quot;Axis2SampleDocLitServiceSkeleton.java&quot;.<br />
</p>

<div class="source"><pre class="prettyprint">
<div>
<pre>public org.apache.axis2.userguide.xsd.EchoStringReturnDocument 
        echoString(org.apache.axis2.userguide.xsd.EchoStringParamDocument param4 ){
        //Todo: fill this with the necessary business logic
        throw new  java.lang.UnsupportedOperationException();
   }
</pre></div></pre></div>


<p>Then complete the code by adding the business logic as shown below:</p>

<div class="source"><pre class="prettyprint">

<div>
<pre>public org.apache.axis2.userguide.xsd.EchoStringReturnDocument 
       echoString(org.apache.axis2.userguide.xsd.EchoStringParamDocument param4) throws Exception {
       //Use the factory to create the output document
       org.apache.axis2.userguide.xsd.EchoStringReturnDocument retDoc = 
           org.apache.axis2.userguide.xsd.EchoStringReturnDocument.Factory.newInstance();
      //send the string back.
      retDoc.setEchoStringReturn(param4.getEchoStringParam());
      return retDoc;
  }</pre></div>
</pre></div>

</div>
<div class="section">
<h3><a name="echoStringArray"></a>echoStringArray</h3>


<p>The code segment for echoStringArray is shown below:</p>

<div class="source"><pre class="prettyprint">

<div>
<pre>public org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument 
      echoStringArray(org.apache.axis2.userguide.xsd.EchoStringArrayParamDocument param0) throws Exception {
      //Use the factory to create the output document.
     org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument retDoc = 
     org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument.Factory.newInstance();
     //Get the String array from the input parameters.
     String[] inParams = param0.getEchoStringArrayParam().getStringArray();
     org.apache.axis2.userguide.xsd.ArrayOfstringLiteral retParams =
            org.apache.axis2.userguide.xsd.ArrayOfstringLiteral.Factory.newInstance();
     //Set the input parameters to the output parameters for echoing.
     for (int i = 0; i &lt; inParams.length; i++) {
         retParams.addString(inParams[i]);     }
     //return the output document.
    retDoc.setEchoStringArrayReturn(retParams);
    return retDoc;
   }</pre></div>
</pre></div>

</div>
<div class="section">
<h3><a name="echoStruct"></a>echoStruct</h3>


<p>The code segment for echoStruct is shown below:</p>

<div class="source"><pre class="prettyprint">
<div>
<pre>
  public org.apache.axis2.userguide.xsd.EchoStructReturnDocument 
        echoStruct(org.apache.axis2.userguide.xsd.EchoStructParamDocument param2) throws Exception {
        //Use the factory to create the output document.
        org.apache.axis2.userguide.xsd.EchoStructReturnDocument retDoc =
        org.apache.axis2.userguide.xsd.EchoStructReturnDocument.Factory.newInstance();
        //Get the SOAPStrcut from the incoming parameters
        org.apache.axis2.userguide.xsd.SOAPStruct inStruct = param2.getEchoStructParam();
        //Struct for the sending back
        org.apache.axis2.userguide.xsd.SOAPStruct outStruct =
                org.apache.axis2.userguide.xsd.SOAPStruct.Factory.newInstance();
        //Fill the outgoing struct
        outStruct.setVarFloat(inStruct.getVarFloat());
        outStruct.setVarInt(inStruct.getVarInt());
        outStruct.setVarString(inStruct.getVarString());
        //Set the outgoing document.
        retDoc.setEchoStructReturn(outStruct);
        return retDoc;
    }
</pre></div></pre></div>

</div>
<div class="section">
<h2><a name="Client:"></a>Client:</h2>


<div class="section">
<h3><a name="Client_for_echoString_Operation"></a>Client for echoString Operation</h3>


<p>The following code fragment shows the necessary code for utilizing the
echoString operation of the Axis2SampleDocLitService that we have already
deployed. The code is very simple to understand and the explanations are in
the form of comments.</p>

<div class="source"><pre class="prettyprint">
<div>
<pre>     try {
                      org.apache.axis2.userguide.Axis2SampleDocLitServiceStub stub 
                        = new org.apache.axis2.userguide.Axis2SampleDocLitServiceStub(null,
                           &quot;http://localhost:8080/axis2/services/Axis2SampleDocLitService&quot;);
                      //Create the request document to be sent.
                      org.apache.axis2.userguide.xsd.EchoStringParamDocument reqDoc =
                          org.apache.axis2.userguide.xsd.EchoStringParamDocument.Factory.newInstance();
                      reqDoc.setEchoStringParam(&quot;Axis2 Echo&quot;);
                      //invokes the Web service.
                      org.apache.axis2.userguide.xsd.EchoStringReturnDocument resDoc = 
                                        stub.echoString(reqDoc);
                      System.out.println(resDoc.getEchoStringReturn());
                      } catch (java.rmi.RemoteException e) {
                       e.printStackTrace();
                      }
</pre></div></pre></div>


<p>Similarly the following code fragments show client side code for
echoStringArray operation and echoStruct operation respectively.</p>

</div>
<div class="section">
<h3><a name="Client_for_echoStringArray_Operation"></a>Client for echoStringArray Operation</h3>

<div class="source"><pre class="prettyprint">
<div>
<pre>      try {
                       //Create the stub by passing the AXIS_HOME and target EPR.
                       //We pass null to the AXIS_HOME and hence the stub will use the current directory as the AXIS_HOME
                       org.apache.axis2.userguide.Axis2SampleDocLitServiceStub stub = 
                                    new org.apache.axis2.userguide.Axis2SampleDocLitServiceStub(null,
                                    &quot;http://localhost:8080/axis2/services/Axis2SampleDocLitService&quot;);
                       //Create the request document to be sent.
                       org.apache.axis2.userguide.xsd.EchoStringArrayParamDocument reqDoc = 
                          org.apache.axis2.userguide.xsd.EchoStringArrayParamDocument.Factory.newInstance();
                      org.apache.axis2.userguide.xsd.ArrayOfstringLiteral paramArray = 
                           org.apache.axis2.userguide.xsd.ArrayOfstringLiteral.Factory.newInstance();
                      paramArray.addString(&quot;Axis2&quot;);
                      paramArray.addString(&quot;Echo&quot;);
                      reqDoc.setEchoStringArrayParam(paramArray);
                      org.apache.axis2.userguide.xsd.EchoStringArrayReturnDocument resDoc = 
                      stub.echoStringArray(reqDoc); 
                      //Get the response params
                      String[] resParams = resDoc.getEchoStringArrayReturn().getStringArray();
                      for (int i = 0; i &lt; resParams.length; i++) {
                          System.out.println(resParams[i]);
                      }
                    } catch (java.rmi.RemoteException e) {
                       e.printStackTrace(); 
                    }
               </pre></div>
    </pre></div>

</div>
<div class="section">
<h3><a name="Client_for_echoStruct_Operation"></a>Client for echoStruct Operation</h3>

<div class="source"><pre class="prettyprint">
<div>
<pre>try {
                //Create the stub by passing the AXIS_HOME and target EPR.
                //We pass null to the AXIS_HOME and hence the stub will use the current directory as the AXIS_HOME
                org.apache.axis2.userguide.Axis2SampleDocLitServiceStub stub =
                        new org.apache.axis2.userguide.Axis2SampleDocLitServiceStub(null,
                        &quot;http://localhost:8080/axis2/services/Axis2SampleDocLitService&quot;);
                          //Create the request Document
                        org.apache.axis2.userguide.xsd.EchoStructParamDocument reqDoc =
                          org.apache.axis2.userguide.xsd.EchoStructParamDocument.Factory.newInstance();
                         //Create the complex type
                        org.apache.axis2.userguide.xsd.SOAPStruct reqStruct =
                        org.apache.axis2.userguide.xsd.SOAPStruct.Factory.newInstance();
                        reqStruct.setVarFloat(100.50F);
                        reqStruct.setVarInt(10);
                        reqStruct.setVarString(&quot;High&quot;);
                        reqDoc.setEchoStructParam(reqStruct);
                        //Service invocation
                        org.apache.axis2.userguide.xsd.EchoStructReturnDocument resDoc = 
                         stub.echoStruct(reqDoc);
                       org.apache.axis2.userguide.xsd.SOAPStruct resStruct = 
                          resDoc.getEchoStructReturn();
                       System.out.println(&quot;floot Value :&quot; + resStruct.getVarFloat());
                       System.out.println(&quot;int Value :&quot; + resStruct.getVarInt());
                       System.out.println(&quot;String Value :&quot; + resStruct.getVarString());
                     } catch (java.rmi.RemoteException e) {
                        e.printStackTrace();
                    }
</pre></div></pre></div>

</div>
</html>
        </div>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
            <p>Copyright &copy;2004&#x2013;2017
<a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.</p>
        </div>
        </div>
    </footer>
    </body>
</html>