`
redhacker
  • 浏览: 489358 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jersey框架初体验

    博客分类:
  • REST
 
阅读更多
一、背景

最近,Jersey学习群组的朋友越来越多,很多朋友问一些非常基础的问题,我看这种现象普遍存在,原因是进入群中的同学们大部分是Jersey的初学者,更有甚者,可能是java的初学者,他们带着对REST webservice的好奇,闯入了Jersey这个框架的学习领域,然而,由于是新手,感觉老虎吃天,无法下爪!为了引导新手们学习,后续我将写几篇关于Jersey入门级的博客,敬请大家期待!

二、前言

本篇主要是Jersey体验,你将在不做任何编码的情况下,体验Jersey框架的神气魅力!本文还假定你在eclipse里安装了Maven插件!

三、步骤

1、新建Maven项目







2、选择项目的Maven原型(jersey-quickstart-grizzly),这个是基于1.7版本的Jersey



3、填写本项目的项目信息,填写完点击“Finish”



4、在Eclipse地址栏右下方可以看到项目正在生成



5、生成后的项目结构如下图,其中Main.java是grizzly web server启动的Java小应用程序,
MyResource是自动生成第一个REST Resource类,包含了一个简单的GET请求的资源。




6、执行Main.java,grizzly web server将启动。



7、访问http://localhost:9998/application.wadl,如下图所示,这是生成的REST资源描述语言



8、访问生成的测试资源,如下图所示,看到“Got it”,说明你成功的体验了Jersey的第一个Hello World程序!



总结:

1、目前,大部分开源项目都使用Maven管理,能够掌握Maven对于学习一个开源项目至关重要,否则都不知道如何开始!

2、使用Maven可以自动下载对应Jar的源码和Javadocs,这对深入学习某个开源项目提供了简便的途径,否则下了二进制的jar,还要去找源码,不仅浪费时间,而且可能找到的源码对不上版本。

3、最好是使用Eclipse maven插件,一些操作都可视化执行,比命令行简单多了,否则要记很多命令,也很费神,我深有体会!希望大家能尽快入门,少走弯路。


如果您觉得本文对您有益,请点击博文后的google广告或在博主微店(美鲜果店)订购一份水果以表感谢,对作者表示支持,谢谢!
  • 大小: 50.4 KB
  • 大小: 30.6 KB
  • 大小: 41.4 KB
  • 大小: 58.9 KB
  • 大小: 47.8 KB
  • 大小: 2.7 KB
  • 大小: 47.6 KB
  • 大小: 79.5 KB
  • 大小: 56.8 KB
  • 大小: 35.5 KB
分享到:
评论
18 楼 redhacker 2014-10-29  
楼主,想问一下访问这个http://localhost:9998/application.wadl
里面的内容是从哪里来的???
apwy111 写道
楼主,想问一下访问这个http://localhost:9998/application.wadl
里面的内容是从哪里来的???


<application xmlns="http://wadl.dev.java.net/2009/02">
<doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.18.1 02/19/2014 03:28 AM"/>
<grammars/>
<resources base="http://localhost:9998/">
<resource path="/myresource">
<method id="getIt" name="GET">
<response>
<representation mediaType="text/plain"/>
</response>
</method>
</resource>
</resources>
</application>

这个应该是自动生成的啊。类似于wsdl
17 楼 apwy111 2014-10-11  
楼主,想问一下访问这个http://localhost:9998/application.wadl
里面的内容是从哪里来的???


<application xmlns="http://wadl.dev.java.net/2009/02">
<doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.18.1 02/19/2014 03:28 AM"/>
<grammars/>
<resources base="http://localhost:9998/">
<resource path="/myresource">
<method id="getIt" name="GET">
<response>
<representation mediaType="text/plain"/>
</response>
</method>
</resource>
</resources>
</application>
16 楼 空谷悠悠 2014-09-17  
redhacker 写道
空谷悠悠 写道
jersey文档中提到:
Client instances are expensive resources. It is recommended a configured instance is reused for the creation of Web resources
这也是我关注的问题,如何保证避免每次调用资源去重新new一个client对象,文档中也给出了配置实例方案
ClientConfig cc = new DefaultClientConfig();
    cc.getProperties().put(
        ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);
    Client c = Client.create(cc);

源码中Client.create(cc)静态方法中也是new的一个client,这里每次仍去创建一个新的对象了,貌似没有避免我上面提到的问题。
Q:jersey有实现避免重复创建client的方案吗?有,如果实现呢?


你可以通过工厂模式避免重复实例化Client类,也可以通过Spring声明式配置,使用Spring容器实例化一个单例的Client类。create的具体实现我没去看,但我上述的方式就可以解决你的问题。

直接单例模式我也说不上妥与不妥,如果这么除暴,文档没必要给出配置实例方案而忽略单例模式,我思考一个问题,能够保证为了一个session(客户端),创建一个实例。
15 楼 redhacker 2014-09-17  
空谷悠悠 写道
jersey文档中提到:
Client instances are expensive resources. It is recommended a configured instance is reused for the creation of Web resources
这也是我关注的问题,如何保证避免每次调用资源去重新new一个client对象,文档中也给出了配置实例方案
ClientConfig cc = new DefaultClientConfig();
    cc.getProperties().put(
        ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);
    Client c = Client.create(cc);

源码中Client.create(cc)静态方法中也是new的一个client,这里每次仍去创建一个新的对象了,貌似没有避免我上面提到的问题。
Q:jersey有实现避免重复创建client的方案吗?有,如果实现呢?


你可以通过工厂模式避免重复实例化Client类,也可以通过Spring声明式配置,使用Spring容器实例化一个单例的Client类。create的具体实现我没去看,但我上述的方式就可以解决你的问题。
14 楼 空谷悠悠 2014-09-17  
jersey文档中提到:
Client instances are expensive resources. It is recommended a configured instance is reused for the creation of Web resources
这也是我关注的问题,如何保证避免每次调用资源去重新new一个client对象,文档中也给出了配置实例方案
ClientConfig cc = new DefaultClientConfig();
    cc.getProperties().put(
        ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true);
    Client c = Client.create(cc);

源码中Client.create(cc)静态方法中也是new的一个client,这里每次仍去创建一个新的对象了,貌似没有避免我上面提到的问题。
Q:jersey有实现避免重复创建client的方案吗?有,如果实现呢?
13 楼 redhacker 2014-09-05  
空谷悠悠 写道
请教一个问题:
   webResource.type(MediaType.APPLICATION_JSON).post(ClientRespnse.class,object)。这里obejct是单个对象的json形式,当然可以请求成功,但是批量新增时,往往是传递一个List<Object>,我将这里的List<Object>转成json形式,post请求就报错,难得jersey不支持这种方式吗?如果可以,正确的方式又该怎么样呢?


如果不支持某种类型,可实现相应的Reader,请参考:http://redhacker.iteye.com/blog/267604中的例子
12 楼 空谷悠悠 2014-08-29  
请教一个问题:
   webResource.type(MediaType.APPLICATION_JSON).post(ClientRespnse.class,object)。这里obejct是单个对象的json形式,当然可以请求成功,但是批量新增时,往往是传递一个List<Object>,我将这里的List<Object>转成json形式,post请求就报错,难得jersey不支持这种方式吗?如果可以,正确的方式又该怎么样呢?
11 楼 redhacker 2014-08-08  
it_palmer 写道
很好!期待以后继续进一步分享

嗯嗯。。谢谢支持!
10 楼 redhacker 2014-06-23  
suny0906 写道
很好,转发了

谢谢!
9 楼 redhacker 2014-06-23  
it_palmer 写道
很好!期待以后继续进一步分享


今年有点忙,继续发布博客的假话搁浅了,有时间还会继续发。。。
8 楼 it_palmer 2014-06-16  
很好!期待以后继续进一步分享
7 楼 suny0906 2013-11-11  
很好,转发了
6 楼 redhacker 2013-08-03  
冬天秋天 写道
按照你说手动添加可以找到quickstart项目骨架了
http://ldq2010-163-com.iteye.com/picture/126811
成功创建maven项目。
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	... 48 more
MultiException stack 4 of 4

运行Main.java 报这样一堆错误提示……,但是能够查看到wadl并在页面访问,得到Got it! 的输出。
不过看着这一堆报错,很不爽。


奇怪,我没有看到这个错误!
5 楼 冬天秋天 2013-08-02  
按照你说手动添加可以找到quickstart项目骨架了
http://ldq2010-163-com.iteye.com/picture/126811
成功创建maven项目。
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
	... 48 more
MultiException stack 4 of 4

运行Main.java 报这样一堆错误提示……,但是能够查看到wadl并在页面访问,得到Got it! 的输出。
不过看着这一堆报错,很不爽。
4 楼 冬天秋天 2013-08-02  
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
-DarchetypeVersion=2.1

这些命令是在CMD 的命令行窗口输入吗?
3 楼 redhacker 2013-08-01  
冬天秋天 写道
我安装的maven插件找不到这个---选择项目的Maven原型(jersey-quickstart-grizzly)

搜的下面有个 add 的手动添加。
2 楼 redhacker 2013-08-01  
冬天秋天 写道
我安装的maven插件找不到这个---选择项目的Maven原型(jersey-quickstart-grizzly)

嗯,可能会出现这种情况的,不行你就照着下面的信息输进去。这种情况可能是eclipse自身导致的,没有初始化缓存过来,成功添加几次原型就好了。

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
-DarchetypeVersion=2.1
1 楼 冬天秋天 2013-07-31  
我安装的maven插件找不到这个---选择项目的Maven原型(jersey-quickstart-grizzly)

相关推荐

Global site tag (gtag.js) - Google Analytics