Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

The Calculator interface defines the Service Endpoint Interface (SEI) for the Web Service.

Code Block
java
borderStylesolid
titleCalculator.java
borderStylesolid
java
package org.apache.geronimo.samples.jws;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

@WebService(name = "CalculatorPortType",
        targetNamespace = "http://jws.samples.geronimo.apache.org")
public interface Calculator {

    /**
     * @param value1
     * @param value2
     * @return returns int
     */
    @WebMethod(operationName = "add")
    @WebResult(name = "return", targetNamespace = "http://jws.samples.geronimo.apache.org")
    @RequestWrapper(localName = "add", targetNamespace = "http://jws.samples.geronimo.apache.org", className = "org.apache.geronimo.samples.jws.Add")
    @ResponseWrapper(localName = "addResponse", targetNamespace = "http://jws.samples.geronimo.apache.org", className = "org.apache.geronimo.samples.jws.AddResponse")
    public int add(@WebParam(name = "value1", targetNamespace = "http://jws.samples.geronimo.apache.org")int value1,
                   @WebParam(name = "value2", targetNamespace = "http://jws.samples.geronimo.apache.org")int value2);

}

The CalculatorService class implements the Web Service business logic. It implements all the methods defined in the SEI. The class does not need to implement the Calculator interface but must reference it through the @WebService.endpointInterface annotation. This class will be exposed as a Servlet through web.xml file even though it does not extend the javax.servlet.Servlet class.
The context variable marked with the @Resource annotation will be injected at runtime. The WebServiceContext can be used to obtain the message context and security information relative to the call.

Code Block
borderStyle
javasolid
titleCalculatorService.java
borderStylesolid
java
package org.apache.geronimo.samples.jws;

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;

@WebService(serviceName = "Calculator",
        portName = "CalculatorPort",
        endpointInterface = "org.apache.geronimo.samples.jws.Calculator",
        targetNamespace = "http://jws.samples.geronimo.apache.org",
        wsdlLocation = "WEB-INF/wsdl/CalculatorService.wsdl")
public class CalculatorService implements Calculator {

    @Resource
    private WebServiceContext context;

    /**
     * @return returns javax.xml.ws.WebServiceContext
     */
    public WebServiceContext getContext() {
        return context;
    }

    /**
     * @param value1
     * @param value2
     * @return returns int
     */
    public int add(int value1, int value2) {
        System.out.println("User Principal: " + context.getUserPrincipal());
        System.out.println("value1: " + value1 + " value2: " + value2);
        return value1 + value2;
    }
}

The web.xml descriptor is used to deploy the Web Service.

Code Block
borderStyle
xmlsolid
titleweb.xml
borderStylesolid
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    <servlet>
	<display-name>CalculatorService</display-name>
	<servlet-name>CalculatorService</servlet-name>
	<servlet-class>
	    org.apache.geronimo.samples.jws.CalculatorService
	</servlet-class>
    </servlet>
	
    <servlet-mapping>
	<servlet-name>CalculatorService</servlet-name>
	<url-pattern>/calculator</url-pattern>
    </servlet-mapping>	

    .....

    <service-ref>
        <service-ref-name>services/Calculator</service-ref-name>
        <service-interface>javax.xml.ws.Service</service-interface>
        <wsdl-file>WEB-INF/wsdl/CalculatorService.wsdl</wsdl-file>
    </service-ref>
</web-app>

...

The geronimo plan has no information for the web service but does specify more information for the service-ref for the jsp client. For tomcat, the plan can be located after building the project in jaxws-calculator/jaxws-calculator-tomcat/target/resources/META-INF/plan.xml. For Jetty, the plan can be located after building the project in jaxws-calculator/jaxws-calculator-jetty/target/resources/META-INF/plan.xml.

Code Block
xmlborderStylesolid
titlegeronimo-web.xml for tomcat
borderStylesolid
xml
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1">
  <dep:environment xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2">
    <dep:moduleId>
      <dep:groupId>org.apache.geronimo.samples</dep:groupId>
      <dep:artifactId>jaxws-calculator-tomcat</dep:artifactId>
      <dep:version>2.1.2-SNAPSHOT</dep:version>
      <dep:type>car</dep:type>
    </dep:moduleId>
    <dep:dependencies>
      <dep:dependency>
        <dep:groupId>org.apache.geronimo.configs</dep:groupId>
        <dep:artifactId>jasper</dep:artifactId>
        <dep:version>2.1.2-SNAPSHOT</dep:version>
        <dep:type>car</dep:type>
      </dep:dependency>
      <dep:dependency>
        <dep:groupId>org.apache.geronimo.configs</dep:groupId>
        <dep:artifactId>tomcat6</dep:artifactId>
        <dep:version>2.1.2-SNAPSHOT</dep:version>
        <dep:type>car</dep:type>
      </dep:dependency>
      <dep:dependency>
        <dep:groupId>org.apache.geronimo.configs</dep:groupId>
        <dep:artifactId>axis2</dep:artifactId>
        <dep:version>2.1.2-SNAPSHOT</dep:version>
        <dep:type>car</dep:type>
      </dep:dependency>
    </dep:dependencies>
    <dep:hidden-classes/>
    <dep:non-overridable-classes/>
  </dep:environment>
  <context-root>/jaxws-calculator</context-root>
  <service-ref>
    <service-ref-name>services/Calculator</service-ref-name>
    <port>
      <port-name>CalculatorPort</port-name>
      <protocol>http</protocol>
      <host>localhost</host>
      <port>8080</port>
      <uri>/jaxws-calculator/calculator</uri>
    </port>
  </service-ref>
</web-app>

...

The following WSDL file describes the Web Service:

Code Block
xmlborderStylesolid
titleCalculatorService.wsdl
borderStylesolid
xml
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="Calculator"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://jws.samples.geronimo.apache.org"
    xmlns:tns="http://jws.samples.geronimo.apache.org">

    <wsdl:types>
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                    xmlns="http://jws.samples.geronimo.apache.org" 
                    targetNamespace="http://jws.samples.geronimo.apache.org"
                    attributeFormDefault="unqualified" elementFormDefault="qualified">

             <xsd:element name="add">
                <xsd:complexType>
                   <xsd:sequence>
                      <xsd:element name="value1" type="xsd:int"/>
                      <xsd:element name="value2" type="xsd:int"/>
                   </xsd:sequence>
                </xsd:complexType>
             </xsd:element>

             <xsd:element name="addResponse">
                <xsd:complexType>
                   <xsd:sequence>
                      <xsd:element name="return" type="xsd:int"/>
                   </xsd:sequence>
                </xsd:complexType>
             </xsd:element>
        </xsd:schema>
    </wsdl:types>
  
    <wsdl:message name="add">
       <wsdl:part name="add" element="tns:add"/>
    </wsdl:message>

    <wsdl:message name="addResponse">
       <wsdl:part name="addResponse" element="tns:addResponse"/>
    </wsdl:message>

    <wsdl:portType name="CalculatorPortType">
       <wsdl:operation name="add">
         <wsdl:input name="add" message="tns:add"/>
         <wsdl:output name="addResponse" message="tns:addResponse"/>
       </wsdl:operation>
    </wsdl:portType>
        
    <wsdl:binding name="CalculatorSoapBinding" type="tns:CalculatorPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        
        <wsdl:operation name="add">
            <soap:operation soapAction="add" style="document"/>
            <wsdl:input name="add">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="addResponse">
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
                
    </wsdl:binding>
  
    <wsdl:service name="Calculator">
        <wsdl:port name="CalculatorPort" binding="tns:CalculatorSoapBinding">
            <soap:address location="http://localhost:8080/jaxws-calculator/calculator"/>
        </wsdl:port>
    </wsdl:service>
      
</wsdl:definitions>

...

The add.jsp is a basic client for the CalculatorService Web Service.

Code Block
javaborderStylesolid
titleadd.jsp
borderStylesolid
java
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.xml.ws.Service" %>
<%@ page import="org.apache.geronimo.samples.jws.Calculator" %>
<html  xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <title>Apache Geronimo Sample Application - JAX-WS Calculator</title>
  <meta content="text/html; CHARSET=iso-8859-1" http-equiv="Content-Type">
</head>

<BODY>
  <font face="Verdana, Helvetica, Arial">

    <h3>This is a JAX-WS web service sample application.   Please type the value 1 and value 2 below to see the add result.</h3>
    <form action="add.jsp">
        Value 1: <input type="text" name="value1">   Value 2: <input type="text" name="value2"> <input type="submit" value="Add">
    </form>
    <br>
<%
    String value1 = request.getParameter( "value1" );
    String value2 = request.getParameter( "value2" );

    if (value1 != null && value1.trim().length() > 0 &&
        value2 != null && value2.trim().length() > 0) {

        out.println("<h4>");

        try {
            int v1 = Integer.parseInt(value1);
            int v2 = Integer.parseInt(value2);
    
            InitialContext ctx = new InitialContext();
            Service service = (Service)ctx.lookup("java:comp/env/services/Calculator");
            Calculator calc = service.getPort(Calculator.class);         
            int sum = calc.add(v1, v2);
            out.println("Result: " + v1 + " + " + v2 + " = " + sum);
        } catch ( Exception e ) {
            out.println("Error: " + e.getMessage());
       }

       out.println("</h4>");
    }
%>

  </FONT>
</body>
</html>

The add.jsp looks up a Web Service reference in the JNDI tree. The Web Service reference must first be added the web.xml file.

Code Block
xmlborderStylesolid
titleweb.xml
borderStylesolid
xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
        .....

        <service-ref>
            <service-ref-name>services/Calculator</service-ref-name>
            <service-interface>javax.xml.ws.Service</service-interface>
            <wsdl-file>WEB-INF/wsdl/CalculatorService.wsdl</wsdl-file>
        </service-ref>

        .....
</web-app>

...