<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>subbu.org &#187; JAX-WS</title>
	<atom:link href="http://www.subbu.org/blog/category/jax-ws/feed" rel="self" type="application/rss+xml" />
	<link>http://www.subbu.org</link>
	<description></description>
	<lastBuildDate>Sun, 05 Feb 2012 20:12:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Analytics for Web APIs</title>
		<link>http://www.subbu.org/blog/2008/11/analytics-for-web-apis</link>
		<comments>http://www.subbu.org/blog/2008/11/analytics-for-web-apis#comments</comments>
		<pubDate>Tue, 18 Nov 2008 04:40:37 +0000</pubDate>
		<dc:creator>Subbu Allamaraju</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JAX-WS]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://www.subbu.org/?p=648</guid>
		<description><![CDATA[Runtime linking in RESTful apps can reduce client-server coupling as the server can tweak the workflow at runtime without completely breaking client apps. Here is one more reason to switch from static pre-published URIs to runtime linking. Say, you built a cool Web API. Folks are excited about your API are are actively using it. [...]]]></description>
			<content:encoded><![CDATA[<p></p><div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.subbu.org%2Fblog%2F2008%2F11%2Fanalytics-for-web-apis"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.subbu.org%2Fblog%2F2008%2F11%2Fanalytics-for-web-apis&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://www.subbu.org/blog/2008/09/on-linking-part-1">Runtime linking</a> in RESTful apps can reduce  client-server coupling as the server can tweak the <a href="http://www.subbu.org/blog/2008/11/who-is-composing-your-app">workflow</a> at runtime without completely breaking client apps. Here is one more reason to switch from static pre-published URIs to runtime linking.</p>
<p><span id="more-648"></span></p>
<p>Say, you built a cool Web API. Folks are excited about your API are are actively using it. You now have some better ideas, and want to find the effectiveness of some options you have. How do you go about testing the effectiveness of each option before flipping on the big switch?</p>
<p>For consumer-facing web apps, <a href="http://en.wikipedia.org/wiki/A/B_testing">A/B testing</a> provides an effective technique for segmented testing of various design/implementation options. Here is one simple way to build hooks for A/B testing into web pages.</p>
<pre class="brush: java">
  // Embed test variables into links.

  trackId = createLink(&lt;some ID&gt;, &lt;some test variables&gt;);

  // Store test variables for later analysis

  storeTest(trackId, &lt;test variables&gt;);

  // Render link

  ... + &quot;&#038;track=&quot; + trackId + &quot;...&quot;;
</pre>
<p>This may produce a URI like the following.</p>
<pre name="code" class="html">
  &lt;a href=&quot;http://example.org/blahBlah?someParams&amp;track=xyz&gt;...&lt;/a&gt;
</pre>
<p>Subsequently, when a user actives this link, the server can correlate that link to the test variables used. This correlation data forms the basis for post-hoc analysis for A/B and other forms of bucketed testing.</p>
<p>By using runtime linking for Web APIs, i.e., by making them take advantage of the HATEOAS constraint of REST, we can use the same technique for correlating API calls to test variables and conduct A/B testing. That is, when clients are discovering URIs at runtime based on known <a href="http://www.subbu.org/blog/2008/10/generalized-linking">link relations</a>, servers have a chance to get smarter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.subbu.org/blog/2008/11/analytics-for-web-apis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAX-WS for RESTful Web Services?</title>
		<link>http://www.subbu.org/blog/2006/08/jax-ws-for-restful-web-services</link>
		<comments>http://www.subbu.org/blog/2006/08/jax-ws-for-restful-web-services#comments</comments>
		<pubDate>Thu, 31 Aug 2006 09:04:37 +0000</pubDate>
		<dc:creator>Subbu Allamaraju</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JAX-WS]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://wp.subbu.org/2006/08/jax-ws-for-restful-web-services/</guid>
		<description><![CDATA[This post is in response to Sameer Tyagi&#8216;s article on using JAX-WS for RESTful web services posted at the Sun Developer Network. I find a few points stated in this article troubling if not inaccurate &#8211; (a) it presents REST in a limited scope thereby showing SOAP in better light, and (b) it misses some [...]]]></description>
			<content:encoded><![CDATA[<p></p><div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.subbu.org%2Fblog%2F2006%2F08%2Fjax-ws-for-restful-web-services"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.subbu.org%2Fblog%2F2006%2F08%2Fjax-ws-for-restful-web-services&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>This post is in response to <a href="http://blogs.sun.com/sameert">Sameer Tyagi</a>&#8216;s article on using <a href="http://java.sun.com/developer/technicalArticles/WebServices/restful/">JAX-WS for RESTful web services</a> posted at the <a href="http://java.sun.com/developer/">Sun Developer Network</a>.  I find a few points stated in this article troubling if not inaccurate &#8211; (a) it presents REST in a limited scope thereby showing SOAP in better light, and (b) it misses some key differences between REST and SOAP based web services. Beyond this, the example cited in this article just shows why you SHOULD NOT use JAX-WS for REST style web services. In this post, I would like to discuss the whys behind the two statements I just made.</p>
<p><span id="more-77"></span></p>
<p>Let me first list each point mentioned about when to use REST and when to use SOAP, and comment on each. The statements in italics below are from this article.</p>
<ol>
<li>
<p>Use REST when <em>the web services are completely statelesss</em>.</p>
<p>This article contents that REST is suited for stateless services. To the contrary, most people prefer keeping SOAP style web services stateless. I also find it easier to manage state over REST based services than SOAP based services. With REST based services, you can either manage state with cookies or with the state encoded in the URI. With SOAP based services, the only option is to encode the state within the envelope.
</li>
<li>Use REST when <em>bandwidth is particularly important and needs to be limited</em>.</p>
<p>REST based web services may be less-bloated. That may or may not turn into better performance &#8211; it depends on the network and the latency.</p>
</li>
<li>Use REST for <em>web service delivery or aggregation into existing web sites</em> &#8230; using technologies such as <em>Asynchronous JavaScript with XML (AJAX)</em>.
<p>This point is a stretch for two reasons. It is equally possible to invoke SOAP style services via XMLHttpRequest. There are pros and cons to each approach. Secondly, I would not use JAX-WS for driving Ajax responses as using <a href="http://www.subbu.org/weblogs/main/2006/08/json_vs_xml_1.html">JSON over XML</a> has several advantages and JAX-WS is not meant for anything other than XML.</p>
<li>
<p>Use REST when <em>the service producer and service consumer have a mutual understanding of the context and content being passed along</em> and use SOAP when <em>a format contract mus be established to describe the interface that the web service offers</em>.</p>
<p>Both the statements are misleading. I think these statements are based on the assumption that WSDL and schemas provide such a contract for SOAP based web services. This is only half-true. WSDL and schemas can describe the structure of messages (data, headers, faults etc.), but you still need to describe the <a href="http://www.subbu.org/weblogs/main/2005/10/xml_and_semanti_1.html">semantics</a> of operations and messages outside the WSDL. Without a description of those semantics, it is not difficult for different people to come up with different interpretations. WSDL and schemas don&#8217;t describe the semantic meaning. </p>
<li>
<p>Use SOAP when <em>The architecture must address complex nonfunctional requirements</em> such as <em>Transactions, Security,<br />
Addressing, Trust, Coordination, and so on</em> that <em>go beyond simple CRUD operations</em> possible with REST.
<p>This article contends that real enterprise applications need more than the CRUD operations that are possible with HTTP. Actually, this article starts by saying how HTTP is related to SQL for CRUD capabilities. This is nothing but a mis-interpreation of HTTP. HTTP defines some standard verbs with defined semantics. There are two ways you can use HTTP for REST style services &#8211; by encoding the operations in the URI, and/or by defining new verbs. This gives a wide range of possibilities for surfacing services &#8211; definitely not limited to CRUD. In any case, how is this better than encoding the operations in the header/body of a SOAP message and send all messages via POST? </p>
<p>Regarding the non-functional requirements such as <em>Transactions, Security, Addressing, Trust, and Coordination</em>, except for security, we are yet to see any one using the others seriously today. Who said security cannot be addressed with RESTful web services? </p>
</ol>
<p>What this article forgets to mention is that RESTful services don&#8217;t hide the fact that they are operating over HTTP, where as SOAP style services try to hide this and encourage <a href="http://www.subbu.org/weblogs/main/2006/08/protocol_agnost_1.html">protocol agnosticism</a>. The result of this protocol agnosticism is API bloat with too many indirections. I have been developing web services for over three years, and I don&#8217;t have problems with the lower level APIs (SAAJ, DOM etc.) &#8211; what frustrates me is the bloat added by the higher-level APIs (dispatchers, handlers, XML binding etc.) trying to hide the protocol. </p>
<h3>JAX-WS for RESTful Services?</h3>
<p>JAX-WS (like its dead-cousin JAX-RPC) is designed with protocol abstraction in mind &#8211; so they carry the bloat I just mentioned. The API goes on to great trouble in hiding the protocol with layer upon layer &#8211; may be the thought was if there are too many layers on top of the protocol, nobody would notice the protocol?</p>
<p>Yes, you can use JAX-WS for REST style services, but as I show below, using JAX-WS makes your code inherit some of that bloat. It adds more complexity without necessarily offering any advantages. Note that the example in this article uses JAXB in combination with JAX-WS, and my comments are limited to using JAX-WS.</p>
<p>First, let me briefly describe the example provided in this article. </p>
<ol>
<li>A purchase order service to get, create, update, or delete purchase orders. This service is implemented using the<br />
<a href="http://java.sun.com/javaee/5/docs/api/javax/xml/ws/Provider.html"><code>javax.xml.ws.Provider</code></a> interface<br />
and some annotations of JAX-WS. The <code>invoke()</code> of this class method processes the request by first checking the request<br />
verb and the path of the URI used to make the request.</li>
<li>A client that uses the <a href="http://java.sun.com/javaee/5/docs/api/javax/xml/ws/Service.html"><code>javax.xml.ws.Service</code></a><br />
and <a href="http://java.sun.com/javaee/5/docs/api/javax/xml/ws/Dispatch.html"><code>javax.xml.ws.Dispatch</code></a><br />
interfaces of JAX-WS to 	talk to the purchase order service. </li>
</ol>
<p>This example is simple, yet demonstrates the bloat very well. Let&#8217;s see the bloat.</p>
<ol>
<li>
<p>The servlet API is best suited for providing an entry point for REST-style services. The API has the right abstractions for serving services over HTTP. But since JAX-WS wants to stay protocol agnostic, there is no way you can bind JAX-WS provider classes to servlets. But still JAX-WS leaks some protocol details via the <a href="http://java.sun.com/javaee/5/docs/api/javax/xml/ws/handler/MessageContext.html"><code>javax.xml.ws.handler.MessageContext</code></a><br />
(which IMO, makes <a href="http://www.subbu.org/weblogs/main/2006/04/angle_brackets.html">JAX-WS more usable than JAXRPC</a>). So, this example ends up using the leaks to get details of the request API. </p>
<pre class="brush: java">
public Source invoke(Source source) {
try{
MessageContext mc = wsContext.getMessageContext();
String path = (String)mc.get(MessageContext.PATH_INFO);
String method = (String)mc.get(MessageContext.HTTP_REQUEST_METHOD);
System.out.println("Got HTTP "+method+" request for "+path);
if (method.equals("GET"))
return get(mc);
if (method.equals("POST"))
return post(source, mc);
if (method.equals("PUT"))
return put(source, mc);
if (method.equals("DELETE"))
return delete(source, mc);
throw new WebServiceException("Unsupported method:" +method);
} catch(JAXBException je) {
throw new WebServiceException(je);
}
}
</pre>
<p>The above code from this article makes a good case why you should servlet API and not JAX-WS. Since this service is bound to HTTP, this code had to obtain the request info directly via the leaked abstractions. Here is how you could rewrite this using the servlet API.</p>
<p><code language="Java"><br />
// Nothing<br />
</code></p>
<p>Except for message parsing, there is no need to write code to detect the verb. The good old <a href="http://java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpServlet.html"><code>javax.servlet.http.HttpServlet</code></a> does this job, and would delegate to methods like <code>doGet()</code>, <code>doPost()</code> etc.</p>
</li>
<li>
<p>The purchase order service writes back fault messages and response error codes. Here again, we see the SOAP concepts leaking into the REST-style purchase order service.</p>
<li>
<p>The client side code is similarly more complex like the service implementation. The client first creates a Service, adds a Port, then creates a Dispatcher, creates a RequestContext, and then invokes the service.</p>
<pre class="brush: java">
private  void retrieveOrder() {
service = Service.create(qname);
service.addPort(qname, HTTPBinding.HTTP_BINDING, url + "ABC-123");
Dispatch<Source> dispatcher = service.createDispatch(qname, Source.class, Service.Mode.MESSAGE);
Map<String, Object> requestContext = dispatcher.getRequestContext();
requestContext.put(MessageContext.HTTP_REQUEST_METHOD, "GET");
Source result = dispatcher.invoke(null);
printSource(result);
}
</pre>
<p>There are too many abstractions in this code snippet. It uses APIs designed for SOAP and WSDL to implement REST-style invocations. But why not use <code>HttpURLConnection</code> for the same task?</p>
<pre class="brush: java">
// pseudo code
URL url = new URL(...);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setRequestMethod("GET");
// ...
InputStream is = connection.getInputStream();
// Read and bind to a JAXB object
</pre>
<p>This code is not trivial either, but you are atleast dealing with HTTP directly &#8211; no SOAPy abstractions in the way of doing REST.</p>
</ol>
<p>Due to the fact that JAX-WS hides HTTP, you will also notice that neither the client nor the service can easily deal with things like headers and cookies. This article makes a good point that REST style services can take advatange of HTTP caching, but unfortunately, JAX-WS won&#8217;t let you do it easily.</p>
<h3>My Conclusion</h3>
<p>In summary, this articles makes an attempt to justify that JAX-WS can beused for programming REST-style web services. It should also have<br />
taken the time to justify why you must use JAX-WS as opposed to, let&#8217;s say, servlets and a HTTP client? </p>
<p>If the JAX-WS API is really intent on supporting REST-style programming, here are some the things that it needs to do</p>
<ol>
<li>Provide an easier way to process XML and JSON messages on the server side without hiding HTTP, preferrably by extending the servlet API.</li>
<li>Provide an wasier way to write HTTP client by creating some light-weight abstractions on the top of <code>HttpURLConnection</code> so that writing XML to, and reading XML from HTTP connections is simplified.</lI>
</ol>
<p>As of today, I would not recommend using JAX-WS for REST-style web services.</p>
<p><strong>Update (09/03/2006):</strong> I just came across Mark Baker&#8217;s interview at <a href="http://www.infoq.com/articles/mark-baker-REST">http://www.infoq.com/articles/mark-baker-REST</a>. In response to a question on combining REST with more conventional web services approaches, he says <em>it&#8217;s technically possible, but from what I&#8217;ve seen of Web services toolkits (even those that claim to &#8220;support REST&#8221;), there&#8217;s a very good chance that it&#8217;ll be more trouble than it&#8217;s worth</em>. That says it all.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.subbu.org/blog/2006/08/jax-ws-for-restful-web-services/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Angle Brackets or Annotations</title>
		<link>http://www.subbu.org/blog/2006/04/angle-brackets-or-annotations</link>
		<comments>http://www.subbu.org/blog/2006/04/angle-brackets-or-annotations#comments</comments>
		<pubDate>Wed, 12 Apr 2006 17:10:21 +0000</pubDate>
		<dc:creator>Subbu Allamaraju</dc:creator>
				<category><![CDATA[JAX-WS]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://wp.subbu.org/2006/04/angle-brackets-or-annotations/</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p></p><div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.subbu.org%2Fblog%2F2006%2F04%2Fangle-brackets-or-annotations"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.subbu.org%2Fblog%2F2006%2F04%2Fangle-brackets-or-annotations&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Angle brackets or annotations? Is JAX-WS over-engineered or does it simplify web services development? I am disappointed with the points made by <a href="http://rmh.blogs.com/weblog/2006/03/jaxws_is_bad_ba.html" target="_blank">Richard Monson-Haefel</a> and <a href="http://jboss.org/jbossBlog/blog/jgreene/?permalink=Taking_RMHs_JAX_WS_Challenge.txt" target="_blank">Jason Greene</a> in their challenge and retractions against how complex or easy it is to use JAX-WS. Both their posts were provocative, but sidestep most of the requirements of complex web services. IMO, their positions are at  the extreme ends.</p>
<p><span id="more-63"></span></p>
<p>For of all, let me look at Richard&#8217;s arguments. He complains that JAX-RPC and JAX-WS are over-engineered. He blames the API for its complexity. He blames features like handler chains. He complains that deployment is hard. These complaints are a bit disappointing. Given his expertise as an author of a book on J2EE web services, I would expect him to provide more<br />
concrete criticism, <em>and</em> concrete proposals to address these limitations. Both were missing in his post. On the other side, Jason Greene tries to prove that it is trivial to write a web service using annotations. But I think his example actually proves Richard&#8217;s point that,<br />
for the simplest services, JAX-RPC and JAX-WS work fine. His example does not get into any details of real-world complex web services.</p>
<p>On a scale of 1 to 10, I would give JAX-WS at least a 7 (I would have given a 9 had JAX-WS retained backwards compatibility with JAX-RPC). Here is my take on how JAX-specs scale for developing complex web services. </p>
<h3>XML First</h3>
<p>I would never start designing a web service in Java or some other<br />
programming language, unless, of course, I&#8217;m doing a quick demo. Why?<br />
Because, to design inter-operable and loosely-coupled web services, I need<br />
to focus on the wire format first. Mapping to a programming language comes<br />
later. During design, I need to focus on what kind of messages need to be<br />
exchanged, what pieces of data need to be exposed and accepted, and their<br />
detailed semantics. I also need to focus on the kind of faults need to be<br />
returned, and their semantics. In essence, I would focus on a message<br />
exchange protocol for each service.</p>
<p>
To do all this, starting from Java with some annotations is not necessarily the best<br />
approach. Such an approach would steal the focus away from the wire format<br />
towards programming details such as class names, class hierarchies, method signatures, exceptions, etc.</p>
<p>
To do this effectively, I need an XML-to-Java binding model that maps the<br />
XML well-enough. With the help of JAXB, JAX-WS does a decent job in providing such a binding. </p>
<h3>
Injection of Services</h3>
<p>
The next important thing for me is the ability to inject services.<br />
Take, for example, adding a security token to an outgoing message, or<br />
processing a security token on an incoming message. The best way to do<br />
this by adding handlers. Handlers are pluggable, can be inserted and<br />
swapped as required without changing your application. I don&#8217;t understand<br />
Richard Monson-Haefel&#8217;s complaint on handlers. At BEA, we use handlers to<br />
drive a variety of use cases for our WSRP runtime.</p>
<p>
I do have two complaints about handlers. Firstly, the criteria to inject<br />
handlers is very coarse. Although JAX-WS improves upon JAX-RPC by letting<br />
you specify service name patterns, protocol bindings etc., it is still too<br />
coarse. I like to be able to specify handlers with some filtering criteria<br />
using XPath or XQuery. My second complaint is about the underlying SAAJ,<br />
and its tight-coupling to Java Mail and Java Activation Framework. SAAJ, by itself,<br />
is fine, but I get jittery when it starts jumping to Java Mail API for<br />
processing attachments. The programming model is not intuitive, and takes<br />
some expertise to use it correctly.</p>
<p>JAX-WS needs further refinements in this area.</p>
<h3>
Services without Java Binding</h3>
<p>
JAX-WS adds support for building web services without requiring Java binding. I consider this to be a very important improvement over JAX-RPC. Both JAX-RPC and JAX-WS spend a lot of energy bridging between WSDL and XML and Java classes and methods. This is not necessarily the wrong approach, since it covers most of the use cases. However, for really performance conscious web services development, it is better to program to the XML directly. For instance,<br />
instead of letting the container to unmarshal XML into Java beans, it may<br />
be faster to proces the raw message directly. JAX-WS let&#8217;s you do this with the javax.xml.ws.Provider interface. The provider can receive SOAPMessage or a raw StreamSource</p>
<p>Performance is not the only use case for using providers to build web services. Another key use case is <a href="http://www.subbu.org/weblogs/welcome/2005/08/web_services_ve_2.html">versioning</a>. Direct access to the SOAP message gives more flexibility to create web services that can support multiple versions of web service. Working at this level requires some expertise since you need to be aware of angle brackets, DOM gotchas, namespace prefixes etc, but it is exciting to see this as a possibility with JAX-WS.</p>
<h3>
Protocol Handlers</h3>
<p>
This is yet another improvement in JAX-WS over JAX-RPC. Let me elaborate. In JAX-RPC,<br />
handlers are protocol agnostic. Handlers don&#8217;t know anything about the<br />
network protocol that was used to transport a message. On the server side,<br />
handlers don&#8217;t know anything about the container that was used to run the<br />
service. For purity sake, you might argue that all web services code must<br />
be protocol independent &#8220;don&#8217;t care how the message got delivered &#8211; just<br />
process it&#8221;. This may be the case for most web services, but definitely not<br />
all web services. In real-world, web services co-exist with other apps<br />
bound to various network protocols, and in some cases, we need a way to<br />
peek into or influence protocol-specific aspects. Take, for example, any<br />
WSRP producer implementation. For starters, a WSRP producer is a web<br />
service that can be used to view/invoke portlets. In the J2EE world,<br />
portlets mostly run on top of the servlet container. For a WSRP producer<br />
to be able to interact with the servlet runtime, it needs access to<br />
servlet request and servlet response. So, most WSRP producer<br />
implementations out there use some internal/proprietary APIs to get hodl<br />
of these objects from the servlet container. This is just one example.</p>
<p>JAX-WS has the notion of protocol handlers that can get more direct access to protocol level objects such as request and response headers, servlet-container variables like ServletContext, HttpServletRequest, HttpServletResponse, HttpSession etc.</p>
<h3>My Summary</h3>
<p>Overall, I think JAX-WS is great improvement over JAX-RPC. I take the side of Jason Greene, but not just for annotations. JAX-WS gives me access to more low-level stuff, and I now have less number of reasons to write my own web services stack &#8211; which I had to do a couple of years ago since JAX-RPC did not give me all that I wanted.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.subbu.org/blog/2006/04/angle-brackets-or-annotations/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

