﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-阳衡锋的技术专栏-随笔分类-restful webservice</title><link>http://www.blogjava.net/Hafeyang/category/37449.html</link><description>&lt;a style='color:#fff' href='http://www.blogjava.net/Hafeyang/archive/2009/02/02/253007.html' &gt;cnblogs=&gt;blogjava&amp;javaeye&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 10 Feb 2009 16:03:01 GMT</lastBuildDate><pubDate>Tue, 10 Feb 2009 16:03:01 GMT</pubDate><ttl>60</ttl><item><title>RESTful Web Service(三):使用ajax创建客户端</title><link>http://www.blogjava.net/Hafeyang/archive/2009/02/10/254129.html</link><dc:creator>阳衡锋</dc:creator><author>阳衡锋</author><pubDate>Tue, 10 Feb 2009 13:34:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2009/02/10/254129.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/254129.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2009/02/10/254129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/254129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/254129.html</trackback:ping><description><![CDATA[<p>上个文章中使用eclipse创建的web service。根据rest的思想，每一个资源都有唯一标识的URI。在REST Web service explorer 中可以看到每个资源的URI。</p> <p>这里放出一些调用的例子：</p> <p>1.get请求获得Category xml 数据。</p><pre class="code">$(<span style="color: #2a00ff">"#btncall"</span>).click(<span style="color: #7f0055">function </span>(){
    $.ajax({
        url:<span style="color: #2a00ff">"/restblog/services/category"</span>,
        type:<span style="color: #2a00ff">"GET"</span>,
        <strong>dataType:<span style="color: #2a00ff">'xml'</span></strong>,
        success :<span style="color: #7f0055">function </span>(data){
            <span style="color: #7f0055">var </span>tablehtml=<span style="color: #2a00ff">"&lt;table class='tableresult' border='1' bordercolor='#ccc'&gt;&lt;tr&gt;&lt;th&gt;编号&lt;/th&gt;&lt;th&gt;名称&lt;/th&gt;&lt;/tr&gt;"</span>;
            $(<span style="color: #2a00ff">"category"</span>,data).each(<span style="color: #7f0055">function </span>(i,category){
                <span style="color: #7f0055">var </span>id=$(<span style="color: #2a00ff">"id"</span>,category).text();
                <span style="color: #7f0055">var </span>name=$(<span style="color: #2a00ff">"name"</span>,category).text();
                tablehtml+=(<span style="color: #2a00ff">"&lt;tr&gt;&lt;td&gt;"</span>+id+<span style="color: #2a00ff">"&lt;/td&gt;&lt;td&gt;"</span>+name+<span style="color: #2a00ff">"&lt;/td&gt;&lt;/tr&gt;"</span>);
            });
            tablehtml+=<span style="color: #2a00ff">"&lt;/table&gt;"</span>;
        $(tablehtml).appendTo(<span style="color: #2a00ff">"#result"</span>);
        },error:<span style="color: #7f0055">function </span>(){
            alert(<span style="color: #2a00ff">"get category list failed!"</span>);
    }});
});</pre>
<p>jquery的ajax调用有一个参数dataType是期望得到的数据格式，目前版本的可选值为xml,json,html,jsonp.默认的是html。指定了该属性，jquery会自动解析数据格式。</p>
<p>上面的例子接受到的数据形如：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br>&nbsp;&nbsp; &lt;Categories&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;category&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;1&lt;/id&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;第一个分类&lt;/name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/category&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;category&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;2&lt;/id&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;第二个分类&lt;/name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/category&gt; <br>&nbsp;&nbsp; &lt;/Categories&gt; 
<p>data是一个xml对象，在没有jquery的情况下解析xml是一件很麻烦的事情。但是使用jquery，xml解析起来和html一样。 
<p>$(<span style="color: #2a00ff">"category"</span>,data)是查找标签名(tagName)为category节点，返回jquery对象。注意获得节点值用的是text()方法。 
<p>还得注意的地方就是url 这里的路径和请求jsp的规则是一样。 
<p>2.发送json的例子。<pre class="code">$(<span style="color: #2a00ff">"#btnAddbyjson"</span>).click(<span style="color: #7f0055">function </span>(){
    $.ajax({
        url:<span style="color: #2a00ff">"/restblog/services/category/add"</span>,
        <strong>type:<span style="color: #2a00ff">"PUT"</span>,</strong>
        <strong>data:<span style="color: #2a00ff">"{\"id\":1,\"name\":\"category1\"}"</span>,</strong>
        <strong>contentType:<span style="color: #2a00ff">'application/json'</span>,</strong>
        success :<span style="color: #7f0055">function </span>(result){
            alert(result);
        },error:<span style="color: #7f0055">function </span>(){
            alert(<span style="color: #2a00ff">"add category failed!"</span>);
    }});
});</pre>
<p>注意type: 通常的ajax调用都只是GET POST 这里用的是PUT，要回过神来。</p>
<p>contentType:与服务方法上的Consume 标注属性一样。在ajax调用的时候会在请求的Header添加{"contentType","application/json"}的键/值标明发送的数据格式是json。</p>
<p>即便发送的数据格式是json,但是真正的数据是以字符串的形式在网络传输的，所以data属性只是json的字符串，由服务器端解析成Category对象。这里的json字符串格式比较严格，不能适用单引号' ,这里要注意。</p>
<p>data属性即可以是字符串又可以是json,jquery会根据contentType解析成需要发送的格式。</p>
<p>下面的截图是在FireBug下看到的数据发送情况：</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/RESTfulWebServiceajax_10732/1.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="202" alt="1" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/RESTfulWebServiceajax_10732/1_thumb.jpg" width="320" border="0"></a>&nbsp;</p>
<p>这张图旨在说明发送的数据不是一个键/值类型。区别与下面的例子。</p>
<p>3.POST的表单提交。</p><pre class="code">$(<span style="color: #2a00ff">"#btnAdd"</span>).click(<span style="color: #7f0055">function </span>(){
    $.ajax({
        url:<span style="color: #2a00ff">"/restblog/services/category/addbyname"</span>,
        type:<span style="color: #2a00ff">"POST"</span>,
        data:{<span style="color: #2a00ff">'categoryname'</span>:$(<span style="color: #2a00ff">"#txtName"</span>).val()},
        success :<span style="color: #7f0055">function </span>(result){
            alert(result);
        },error:<span style="color: #7f0055">function </span>(){
            alert(<span style="color: #2a00ff">"add category failed!"</span>);
    }});
});</pre>
<p>addbyname方法的categoryname标识为@FormParam 所以用POST提交的数据被当做Form提交的数据。下面的截图说明浏览器发送的是一个标准的键/值数据</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/RESTfulWebServiceajax_10732/2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="177" alt="2" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/RESTfulWebServiceajax_10732/2_thumb.jpg" width="238" border="0"></a> </p>
<p> 4.调用带@Context标识参数的方法</p><pre class="code">$(<span style="color: #2a00ff">"#btncommonProcess"</span>).click(<span style="color: #7f0055">function </span>(){
    $.ajax({
        url:<span style="color: #2a00ff">"/restblog/services/category/commonProcess"</span>,
        type:<span style="color: #2a00ff">"GET"</span>,
        data:<span style="color: #2a00ff">"a=b&amp;a=e&amp;c=d"</span>,
        success :<span style="color: #7f0055">function </span>(result){
            alert(result);
        },error:<span style="color: #7f0055">function </span>(){
            alert(<span style="color: #2a00ff">"commonProcess failed!"</span>);
    }});
});</pre><a href="http://11011.net/software/vspaste"></a>
<p>服务端的代码见上一篇文章。</p>
<p>控制台上打印：</p>
<p>c : [d]<br>a : [b, e]</p>
<h3>总结</h3>
<p>REST Web service 不但提供了标准的调用方法，同时拥有非常简便的ajax调用。由于请求的纯数据，所以他更适合于ajax调用。而且的客户端可以跨平台，跨应用。他的优势是无可比拟的，我相信他的未来不可估量。</p> <img src ="http://www.blogjava.net/Hafeyang/aggbug/254129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">阳衡锋</a> 2009-02-10 21:34 <a href="http://www.blogjava.net/Hafeyang/archive/2009/02/10/254129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RESTful Web Service(二):使用eclipse创建restful webservice 工程</title><link>http://www.blogjava.net/Hafeyang/archive/2009/02/05/253458.html</link><dc:creator>阳衡锋</dc:creator><author>阳衡锋</author><pubDate>Thu, 05 Feb 2009 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2009/02/05/253458.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/253458.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2009/02/05/253458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/253458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/253458.html</trackback:ping><description><![CDATA[<p>使用环境:jdk1.5+eclispe3.4+myeclispe7</p>
<p>File=&gt;New=&gt;Web Service Project。</p>
<p>project name: restblog,选择REST(JAX-RS) 下一步。</p>
<p>勾选core,jaxb,client,json然后下一步。</p>
<p>之所以创建servlet是因为会请求一些物理不存在的URI，事实上就是这个servlet在处理这些resource。</p>
<p>jaxb(Java Architecture for XML Binding)可以将java class序列号成xml，请参考<a title="http://java.sun.com/developer/technicalArticles/WebServices/jaxb/" href="http://java.sun.com/developer/technicalArticles/WebServices/jaxb/">http://java.sun.com/developer/technicalArticles/WebServices/jaxb/</a></p>
<p>json就不多说了，这个包可以实现java class 转化成json。</p>
<p>点击finish完成工程创建。</p>
<p>这样创建的工程与通常的web工程的区别就是添加了servlet在web.xml，这里贴出servlet代码：后续的文章中也会提到他。</p>
<pre class="code"><span style="color: teal">&lt;</span><span style="color: #3f7f7f">servlet</span><span style="color: teal">&gt;
&lt;</span><span style="color: #3f7f7f">display-name</span><span style="color: teal">&gt;</span>JAX-RS REST Servlet<span style="color: teal">&lt;/</span><span style="color: #3f7f7f">display-name</span><span style="color: teal">&gt;
&lt;</span><span style="color: #3f7f7f">servlet-name</span><span style="color: teal">&gt;</span>JAX-RS REST Servlet<span style="color: teal">&lt;/</span><span style="color: #3f7f7f">servlet-name</span><span style="color: teal">&gt;
&lt;</span><span style="color: #3f7f7f">servlet-class</span><span style="color: teal">&gt;
</span>com.sun.jersey.spi.container.servlet.ServletContainer
<span style="color: teal">&lt;/</span><span style="color: #3f7f7f">servlet-class</span><span style="color: teal">&gt;
&lt;</span><span style="color: #3f7f7f">load-on-startup</span><span style="color: teal">&gt;</span>1<span style="color: teal">&lt;/</span><span style="color: #3f7f7f">load-on-startup</span><span style="color: teal">&gt;
&lt;/</span><span style="color: #3f7f7f">servlet</span><span style="color: teal">&gt;
&lt;</span><span style="color: #3f7f7f">servlet-mapping</span><span style="color: teal">&gt;
&lt;</span><span style="color: #3f7f7f">servlet-name</span><span style="color: teal">&gt;</span>JAX-RS REST Servlet<span style="color: teal">&lt;/</span><span style="color: #3f7f7f">servlet-name</span><span style="color: teal">&gt;
&lt;</span><span style="color: #3f7f7f">url-pattern</span><span style="color: teal">&gt;</span>/services/*<span style="color: teal">&lt;/</span><span style="color: #3f7f7f">url-pattern</span><span style="color: teal">&gt;
&lt;/</span><span style="color: #3f7f7f">servlet-mapping</span><span style="color: teal">&gt;</span></pre>
<a href="http://11011.net/software/vspaste"></a>
<p>在工程的classpath下会引用下列包：</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/11.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="315" alt="11" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/11_thumb.jpg" width="371" border="0" /></a> </p>
<p>这些包可以从<a href="http://download.java.net/maven/2/com/sun/jersey/">http://download.java.net/maven/2/com/sun/jersey/</a> 下载(使用maven2)</p>
<p>首先创建一个简单的类Category</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/12.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="149" alt="12" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/12_thumb.jpg" width="371" border="0" /></a> </p>
<p>使用@XmlRootElement标注该类</p>
<p>点击<a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/13.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="20" alt="13" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/13_thumb.jpg" width="25" border="0" /></a> 图标创建webservice,选择restblog工程，Framework选择REST(JAX-RS)</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/14.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="533" alt="14" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/14_thumb.jpg" width="646" border="0" /></a></p>
<p>Java class : CategoryService </p>
<p>URL path: 资源路径 填写category ,这样所有与category相关的资源都使用<a href="http://yourpath/services/category">http://yourpath/services/category</a>访问</p>
<p>LIfecycle: Pre-request(JAX-RS default)每次请求时生成一个服务类实例(这里指CategoryService),singleton:单例，只存在一个实例</p>
<p>Consumes: 接受的contentType 包括application/xml ,application/json 通俗来说就是接受提交数据的格式。</p>
<p>Produces: 产生的数据格式选项同样为applicatin/xml,application/json 等。<br />
注意这里的Consumes/Produces是指请求<a href="http://yourpath/services/category">http://yourpath/services/category</a>的数据格式。</p>
<p>点击 Add 按钮添加服务方法，界面如下：</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/16.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="517" alt="16" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/16_thumb.jpg" width="637" border="0" /></a> </p>
<p>这是一个构造服务方法的界面，下面有代码预览。在添加参数的时候，选择Param Type选项的意义：</p>
<p>Context: 这是一个标识该参数为请求上下文。可以直接获得request的参数。</p>
<p>QueryParam:uri?之后的参数</p>
<p>PathParam:uri中的参数如：/category/{id}中的id就是PathParam</p>
<p>FormParam:使用post提交的参数。</p>
<p>CookieParam: Cookie参数。</p>
<p>HeaderParam: 请求的头部信息。</p>
<p>也许你已经注意到没有session参数，是的，所谓的"无状态stateless"多少就体现在这里，web服务不保存请求相关的信息。</p>
<p>综合上面的用法，下面的例子涵盖了常用的服务方法的写法，之中的处理过程暂时用硬编码。后面的文章会介绍HIbernate,Spring的应用。<br />
</p>
<p><font face="Trebuchet MS"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.dawnpro.restblog;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.ArrayList;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.List;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.Consumes;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.DELETE;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.DefaultValue;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.FormParam;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.GET;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.POST;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.PUT;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.Path;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.PathParam;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.Produces;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.core.Context;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.ws.rs.core.UriInfo;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.codehaus.jettison.json.JSONException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.codehaus.jettison.json.JSONObject;<br />
<br />
@Path(</span><span style="color: #000000">"</span><span style="color: #000000">category</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CategoryService&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GET<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Produces(&nbsp;{</span><span style="color: #000000">"</span><span style="color: #000000">application/json</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">application/xml</span><span style="color: #000000">"</span><span style="color: #000000">})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;getCategories&nbsp;产生json,xml两种数据格式，具体那种格式取决于contentType<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Category</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getCategories()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Category</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">Category</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Category(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">第一个分类</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Category(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">第二个分类</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GET<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Path(</span><span style="color: #000000">"</span><span style="color: #000000">{id}</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Category&nbsp;getCategory(@PathParam(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Category(id,</span><span style="color: #000000">"</span><span style="color: #000000">id为</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">id</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">的类别</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GET<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Path(</span><span style="color: #000000">"</span><span style="color: #000000">json/{id}</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Produces(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">application/json</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;JSONObject&nbsp;getCategoryJson(@PathParam(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id){</span><span style="color: #008000">//</span><span style="color: #008000">产生json</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;o&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JSONObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.put(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.put(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">id为</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">id</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">的category</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(JSONException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;o;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@PUT<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Path(</span><span style="color: #000000">"</span><span style="color: #000000">add</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Produces(</span><span style="color: #000000">"</span><span style="color: #000000">text/html</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Consumes(&nbsp;{&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">application/xml</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">application/json</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;addCategory(Category&nbsp;category)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">处理添加类别逻辑，接受的数据为id:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">category.getId()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">,name:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">category.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ok</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@POST<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Path(</span><span style="color: #000000">"</span><span style="color: #000000">addbyname</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;addCategory(@FormParam(</span><span style="color: #000000">"</span><span style="color: #000000">categoryname</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;@DefaultValue(</span><span style="color: #000000">"</span><span style="color: #000000">[未命名]</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;String&nbsp;cateogryname)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">处理添加类别逻辑，接受的数据为name:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">cateogryname);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">添加类别</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">cateogryname</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">成功</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@POST<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Produces(</span><span style="color: #000000">"</span><span style="color: #000000">text/html</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Path(</span><span style="color: #000000">"</span><span style="color: #000000">updatecategory</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Consumes(&nbsp;{&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">application/xml</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">application/json</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;updateCategory(Category&nbsp;category)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">处理更新类别逻辑，接受的数据为id:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">category.getId()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">,name:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">category.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ok</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@DELETE<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Path(</span><span style="color: #000000">"</span><span style="color: #000000">delete/{id}</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;deleteCategory(@PathParam(</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">处理删除类别逻辑，接受的数据为id:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ok</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@GET<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Path(</span><span style="color: #000000">"</span><span style="color: #000000">commonProcess</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;commonProcess(@Context&nbsp;UriInfo&nbsp;info){</span><span style="color: #008000">//</span><span style="color: #008000">@Context&nbsp;参数标识UriInfo</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;buf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuilder();&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(String&nbsp;param:&nbsp;info.getQueryParameters().keySet())&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append(param</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">info.getQueryParameters().get(param));&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(buf.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ok</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<p><br />
你可以在CategoryService.java编辑中 右键菜单=&gt;MyEclipse=&gt;Add REST Method添加服务方法。</font></p>
<pre><font face="Trebuchet MS">右键工程根目录restblog选择MyEclipse=&gt;Test with RESTful WebServices Explorer 将会打开测试窗口。</font></pre>
<pre><a href="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/17.jpg"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="436" alt="17" src="http://www.blogjava.net/images/blogjava_net/Hafeyang/WindowsLiveWriter/9d8ea9e6231f_10562/17_thumb.jpg" width="604" border="0" /></a> </pre>
<pre>浏览中的地址为:http://localhost:8080/restblog/services/application.wadl 首先/services是由servlet拦截。</pre>
<pre>如果在浏览器中浏览该地址，将得到一个xml文件。这个文件叫web service application description language。顾名思义他是一个服务描述文件。</pre>
<pre>需要说明的是当调用方法的参数为Category类型，调用时传递的是xml同时contentType设置为application/xml这样jersey会将xml转化为Category类型的对象。如果转化出错则服务调用失败，会返回错误信息。</pre>
<h3>总结</h3>
<pre>本节主要介绍在Myeclipse中创建RESTful web service project 以及测试。到目前为止，只写了两个类就轻松的实现了RESTful Web service。</pre>
<pre>参考资料：</pre>
<pre>介绍rest:<a href="http://java.sun.com/developer/technicalArticles/WebServices/restful/">http://java.sun.com/developer/technicalArticles/WebServices/restful/</a></pre>
<pre>介绍使用myeclipse rest 支持<a href="http://www.myeclipseide.com/documentation/quickstarts/webservices_rest/">http://www.myeclipseide.com/documentation/quickstarts/webservices_rest/</a></pre>
<pre class="code">RESTful Web Services Developer's Guide<a href="http://docs.sun.com/app/docs/doc/820-4867?l=zh">http://docs.sun.com/app/docs/doc/820-4867?l=zh</a></pre>
<pre>netbeans的restful webservice 支持：<a href="http://www.netbeans.org/kb/60/websvc/rest_zh_CN.html">http://www.netbeans.org/kb/60/websvc/rest_zh_CN.html</a></pre>
<img src ="http://www.blogjava.net/Hafeyang/aggbug/253458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">阳衡锋</a> 2009-02-05 22:19 <a href="http://www.blogjava.net/Hafeyang/archive/2009/02/05/253458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RESTful Web Service(一):概述</title><link>http://www.blogjava.net/Hafeyang/archive/2009/02/05/253430.html</link><dc:creator>阳衡锋</dc:creator><author>阳衡锋</author><pubDate>Thu, 05 Feb 2009 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2009/02/05/253430.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/253430.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2009/02/05/253430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/253430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/253430.html</trackback:ping><description><![CDATA[<p>本节介绍sun的RESTful Webservice的实现框架jersey,以及RESTful Webservice的理论知识。做为该系列的第一篇，本节会介绍后续的内容。</p> <h3>什么是RESTful Web Services？</h3> <p>RESTful web services是表象状态传输的web服务。REST的基础是适用http创建一个简单的web服务体系架构。它为http数据传输提供了统一的接口。rest有五个关键性原则：</p> <ul> <li>所有资源都有唯一的URI：所有的数据都在唯一的URI标识。  <li>将所有的事物链接在一起：由于是URI，在任何的可能的情况下，适用链接指向被标识的事物。  <li>适用标准方法：同一个资源适用不同的verb可以获得不同的结果，在接下来的例子中可以得到验证。这里的verb除了常用的GET和POST，还有PUT,DELETE。每一个动词刚好对应着数据库的基本操作：GET对应获取数据，就是查询；POST对应的更新数据UPDATE；PUT对应着insert；DELETE就对应这数据库删除。这样的定义不仅能更语义化动词，更重要的是他定义的一种标准，有了这个标准，可以跨应用，跨域，跨系统的调用。  <li>资源的多重表述：资源的获取会随着请求的head而不同。  <li>无状态通信：REST要求状态要么被放入资源状态中，要么保存在客户端上。换句话说，服务端不能保持除了单词请求之外的，任何与其通信的客户端的通信状态。这样做的理由一是可伸缩性，他可以使服务端的变化对客户端是不可见的。</li></ul> <h3>jersey介绍</h3> <p>jersey是sun的RESTful web service实现。他使用jdk5的新特征anotation。其参考站点是<a href="https://jersey.dev.java.net/">https://jersey.dev.java.net/</a>其他的参考资料：</p> <p>rest介绍：<a href="http://www.infoq.com/cn/articles/rest-introduction">http://www.infoq.com/cn/articles/rest-introduction</a></p> <p>下面几个家伙就是jersey的开发者</p> <p>■ Earthly Powers, by Paul Sandoz, at <a href="http://blogs.sun.com/sandoz/category/REST">http://blogs.sun.com/sandoz/category/REST</a>.<br>■ MarcHadley's Blog, at <a href="http://weblogs.java.net/blog/mhadley/">http://weblogs.java.net/blog/mhadley/</a><br>■ Japod's Blog, by Jakub Podlesak, at <a href="http://blogs.sun.com/japod/category/REST">http://blogs.sun.com/japod/category/REST</a>.</p> <p>&nbsp;</p> <p>本系列索引：</p> <p>使用eclipse创建restful webservice 工程。</p><img src ="http://www.blogjava.net/Hafeyang/aggbug/253430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">阳衡锋</a> 2009-02-05 18:20 <a href="http://www.blogjava.net/Hafeyang/archive/2009/02/05/253430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>