You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by Ke...@sunlife.com on 2002/06/28 16:35:32 UTC

Struts for serving Web Services - dev list

I follow the Axis list and have been doing quite a bit of Web Services work
for my job recently.

Here's a note I got from one of the list members that works at Macromedia
in their Server Development group (they put out Jrun and Cold Fusion). He
says that they are embedding Axis directly into both Cold Fusion and JRun
to make it easy to deploy web services on that platform.

If there are thoughts about adding functionality to Struts to make it easy
to use to build Web Services, then it may be worth looking at these two
products and how they've done it.

Thought that the developers on this list may find it valuable to see this.

In addition, I've put some thought to it and feel it may not be difficult
to adapt Struts as a Web Service platform:

 - Model components would not change much (and could be reused between
Struts apps and Struts Web Services apps

- The ActionServlet would need to recognize SOAP requests (from the
SoapAction header or some other way) and process them slightly different.
     - Much of the changes to the ActionServlet may just be done using Axis
functionality. These changes would include:
          - Send back WSDL if it were asked (using Axis functionality).
          - Deserialize soap arguments/attachments (using Axis
functionality).
          - Populate the arguments into the form bean
          - Continue processing as it does now.

     - This would be probably be built by ceating helper classes called by
the ActionServlet.

 - The Action classes users create would have to change some - here is what
I'm thinking:
     - Create a WebServiceAction (that might just subclass Action). Then
MyAction.java would begin:

          public class MyAction extends WebServiceAction {

          instead of

          public class MyAction extends Action {

     - WebServiceAction would have it's primary method be:
          public WebServiceResponse execute(ActionMapping mapping,
                     ActionForm form,
                     HttpServletRequest request,
                     HttpServletResponse response)
          throws Exception {

          returning a WebServiceResponse instead of an ActionForward.

          I think this is fine because a "view" in WebServices is different - it's the encoded data in the web service response - not HTML.
          Struts users shouldn't have to know how to encode the XML response - if they return a collection of values, then Struts should handle the
rest (using Axis).

 - WebServiceResponse.java would replace ActionForward as the "thing" you return from an Action.
     - It would encapsulate the data for the response.
     - It would be able to map each data element returned to its argument as defined in the WSDL (struts-config entries here to point to the WSDL?)
     - It would be able to serialize the data elements (using Axis functionality).

- The ActionServlet then would be able to take a WebServiceResponse and use Axis functionality to turn that into the actual XML going out - and then
send the response.

I think this is doable - the people at Macromedia are already doing something like it. The detail would likely be slightly different than what I've
laid out, but it's a place to start.

I'll look at this some more as I have time, but would be interested in discussing it on the list if people have time. I know you're all gearing up for
 the next beta release.

Thanks for the efforts,

Kevin








---------------------- Forwarded by Kevin Bedell/Systems/USHO/SunLife on
06/28/2002 10:10 AM ---------------------------

Tom Jordahl <to...@macromedia.com> on 06/27/2002 02:31:51 PM

Please respond to axis-user@xml.apache.org

To:   "'axis-user@xml.apache.org'" <ax...@xml.apache.org>
cc:    (bcc: Kevin Bedell/Systems/USHO/SunLife)
Subject:  RE: Interesting TAG -> Code Questions


Kevin,

<blatant-product-plug>
ColdFusion MX has much cooler support for web services, the <CFINVOKE> tag.

You can provide a WSDL file and CFMX will run the Axis WSDL2Java under the
covers, compile it, convert all of your ColdFusion structures and arguments
to the right Java types, invoke the web service using the generated
proxies, then convert the output back in to CFML variables. (it only does
the generation the first time, so its not as slow as it sounds!)

Makes it trivial to use a web service.

You can also publish web services written in CFML (called ColdFusion
Components or CFC's) with a single Admin step.

Download the FREE developer edition at
http://www.macromedia.com/sorfware/coldfusion.

</blatant-product-plug>

One quick warning, both JRun and ColdFusion MX embed Axis Beta 1 currently,
although we have aggressive plans to update that to Axis 1.0 (when
released)

--
Tom Jordahl
Macromedia Server Development


-----Original Message-----
From: Kevin.Bedell@sunlife.com [mailto:Kevin.Bedell@sunlife.com]
Sent: Thursday, June 27, 2002 2:09 PM
To: axis-user@xml.apache.org
Subject: RE: Interesting TAG -> Code Questions



Tom -

Will this tag lib make its way into Cold Fusion?






Tom Jordahl <to...@macromedia.com> on 06/27/2002 02:22:19 PM

Please respond to axis-user@xml.apache.org

To:   "'axis-user@xml.apache.org'" <ax...@xml.apache.org>
cc:    (bcc: Kevin Bedell/Systems/USHO/SunLife)
Subject:  RE: Interesting TAG -> Code Questions



Hi Mick,

First, let me just point out that the webservice tag you are using is a
feature of JRun, not part of Axis.  I am glad you are having success with
the tag, since I wrote it.

Anyway, to answer your Axis coding questions

1. You need to register a type mapping. You need the following call:

 call.registerTypeMapping(
  com.themindelectric.www.LocationInfo.class,
  new QName(
   "http://www.themindelectric.com/package/com.esri.is.services.common/"
   "LocationInfo"),
  org.apache.axis.encoding.ser.BeanSerializerFactory.class,
  org.apache.axis.encoding.ser.BeanDeserializerFactory.class);

2. You need to set a SoapAction in the tag (use soapaction="") or in the
  Call:
  call.setUseSOAPAction(true);
  call.setSOAPActionURI("action here");

For .NET, you will probably need to set the style= attribute when using the
tag to "wrapped" and the use= attribute to "literal".

A really good way to figure out what Axis client code is needed is to run
the WSDL2Java tool on the WSDL for the service you are trying to access,
then examining the Stub code that is generated.


--
Tom Jordahl
Macromedia




-----Original Message-----
From: Mick Robinson [mailto:mrobinson@mapcloud.com]
Sent: Thursday, June 27, 2002 2:05 PM
To: axis-user@xml.apache.org
Subject: Interesting TAG -> Code Questions



Hello, I'm Mick, I'm new to the list, and it's a pleasure meeting
everyone, I see big things happening between all of us! :)

Ok lets get to the point. I got 2 things.

First, I've been very successful consuming web services in JSP with the
use of the webservice taglib. What I need to do now is consume using
straight code.  This is what I got so far:
------------------------
If this is the taglib:
------------------------
<web:invoke
url="http://www.geographynetwork.com/services/v1/PlaceFinder"
namespace="http://www.geographynetwork.com/PlaceFinder"
operation="findPlace"
resultType="LocationInfo"
result="myResult"
scope="page">
<web:param name="arg0" value="Paris"/>
</web:invoke>

<% locationInfo = (LocationInfo)pageContext.getAttribute("myResult",
pageContext.PAGE_SCOPE); %>

------------------------
Then this is the code I've come up with so far, please let me know if
I'm missing anything:
------------------------
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new
java.net.URL("http://www.geographynetwork.com/services/v1/PlaceFinder"))
;
call.setOperationName(new
QName("http://www.geographynetwork.com/PlaceFinder","findPlace"));

locationInfo = (LocationInfo) call.invoke( new Object[] { "Paris" } );

------------------------
Now that code doesn't work, because I'm missing a key ingredient, my
MAIN question, is what is the code equivalent of the following tag (the
key ingredient:)):
------------------------
<web:beanmapping class="com.themindelectric.www.LocationInfo"
namespace="http://www.themindelectric.com/package/com.esri.is.services.c
ommon/" type="LocationInfo"/>

------------------------

I hope someone can help me out with that, or point in the right
direction, I couldn't find anything about that for code.

My Second thing is, I have never been able to consume a service written
in .NET, no matter what the service, or what it returns, I always get a
"500 Server did not recognize the value of HTTP Header SOAPAction:"
error? Anyone know what I got to do to consume to a .NET web service?

Thanks in advance!
Mick

_________________________
Mick Robinson
MapCloud Services Inc
1200-1185 West Georgia St
Vancouver B.C.
604-895-7611 (P)
604-682-3497 (F)












--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>