`
redhacker
  • 浏览: 498461 次
  • 性别: 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)

相关推荐

    java Jersey框架初体验

    通过这次简单的体验,你可以感受到Jersey框架的便捷性和灵活性。Maven的使用使得项目管理和依赖管理变得简单,而Eclipse的Maven插件进一步简化了这些操作,避免了手动配置的麻烦。在深入学习Jersey的过程中,建议...

    函数式编程报告template1

    1. **SML/NJ使用体验** - Standard ML of New Jersey (SML/NJ) 是一个强大的函数式编程环境,其静态类型系统提供了良好的错误预防。在实验过程中,我深入理解了模式匹配、高阶函数和数据抽象等概念,这些都增强了我...

    matlab实时接收蓝牙和串口数据,并实时显示.zip

    matlab

    共享汽车管理系统.zip

    Java项目基于Springboot框架的课程设计,包含LW+ppt

    面板数据-A股公司监管距离数据集-含原始数据+参考文献+处理代码(2000-2023年).txt

    因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/T0620514/article/details/146715315

    储能系统中双向DC/DC变换器并联运行的下垂控制与电流分配优化

    内容概要:本文详细探讨了储能系统中双向DC/DC变换器并联运行时的下垂控制技术及其电流分配优化方法。首先介绍了下垂控制的基本概念,即通过虚拟电阻实现电流按比例分配,避免个别变换器过载或欠载。接着讨论了电压补偿机制,用于应对负载变化引起的母线电压波动。文中提供了具体的Python代码示例,展示了如何通过虚拟电阻和下垂系数进行电流分配,并通过电压补偿保持母线电压稳定。此外,还涉及了线路阻抗对电流分配的影响以及相应的在线估算方法。最后,提出了动态虚拟阻抗和自适应控制等前沿研究方向。 适合人群:从事电力电子、储能系统设计与维护的技术人员,以及对分布式电源管理感兴趣的科研人员。 使用场景及目标:适用于需要精确控制并联运行的双向DC/DC变换器电流分配的储能系统设计和调试。主要目标是提高系统的稳定性和效率,确保电流均匀分布,防止单个变换器过载或欠载。 其他说明:文中提供的代码示例和调试技巧有助于理解和实施下垂控制技术。同时,强调了参数整定的重要性,并给出了实际调试过程中的一些经验和教训。

    (源码)基于Python的微信智能聊天机器人.zip

    # 基于Python的微信智能聊天机器人 ## 项目简介 本项目旨在将微信打造成一个智能聊天机器人,支持多端部署,包括个人微信、微信公众号和企业微信应用。机器人能够进行智能对话、语音识别、图片生成等功能,并且支持丰富的插件扩展,如多角色切换、文字冒险、敏感词过滤等。 ## 项目的主要特性和功能 多端部署支持个人微信、微信公众号和企业微信应用等多种部署方式。 智能对话支持私聊及群聊的消息智能回复,支持多轮会话上下文记忆,支持GPT3、GPT3.5、GPT4模型。 语音识别可识别语音消息,通过文字或语音回复,支持Azure、Baidu、Google、OpenAI等多种语音模型。 图片生成支持图片生成和图生图(如照片修复),可选择DellE、Stable Diffusion、Replicate模型。 丰富插件支持个性化插件扩展,已实现多角色切换、文字冒险、敏感词过滤、聊天记录总结等插件。

    15kW数字充电桩开发方案:三相PFC+移相全桥电路与DSP控制详解

    内容概要:本文详细介绍了15kW数字充电桩的开发方案,重点讨论了三相PFC和移相全桥电路的设计与实现。三相PFC采用无桥维也纳结构,利用TI的DSP进行数字化控制,提高了效率并降低了直流母线电压纹波。移相全桥则通过精确的时序控制和合理的PCB布局,实现了高效的ZVS软开关。文中还探讨了双DSP架构的协同机制、散热设计、EMC优化以及通讯协议等方面的技术细节,并分享了一些开发过程中遇到的实际问题及其解决方案。 适用人群:从事电力电子、充电桩开发的技术人员,尤其是对大功率电源设计感兴趣的工程师。 使用场景及目标:适用于希望深入了解和掌握15kW充电桩开发技术的专业人士,旨在帮助他们提高设计水平,解决实际开发中的难题。 其他说明:文章不仅提供了理论指导,还结合了大量的实践经验,包括具体的电路图、代码示例和调试技巧,有助于读者更好地理解和应用相关技术。

    七彩汽球幼儿园教育教学课件模板.pptx

    七彩汽球幼儿园教育教学课件模板

    基于MATLAB Simulink自动生成TMS320F28335 DSP代码实现永磁同步电机电流环控制

    内容概要:本文详细介绍了使用MATLAB Simulink搭建模型并自动生成针对TMS320F28335 DSP的代码,用于实现永磁同步电机(PMSM)的电流环控制。主要内容涵盖硬件选择、工具链配置、PWM和ADC模块的具体应用、id=0矢量控制策略以及电流环PI控制器的设计与优化。文中强调了Simulink与DSP结合的优势,如减少手动编写寄存器配置代码的工作量,同时提供了多个实际代码片段展示生成代码的关键部分及其优化方法。 适合人群:具有一定嵌入式开发经验,特别是熟悉DSP和电机控制领域的工程师和技术爱好者。 使用场景及目标:适用于希望提高开发效率、缩短产品上市时间的研发团队。通过学习本文,读者能够掌握如何利用Simulink进行自动化代码生成功能,从而快速构建稳定可靠的PMSM控制系统。 其他说明:尽管Simulink提供的自动生成代码功能极大简化了开发流程,但在某些情况下仍需深入了解硬件特性和底层机制,以便更好地解决可能出现的问题。此外,文中提到的一些具体参数和配置可能需要根据实际情况进行适当调整。

    2023年上半年广州房地产市场总结合富.pdf

    2023年上半年广州房地产市场总结

    约瑟夫环(循环链表和顺序表) 问题描述: 编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数) 一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序

    约瑟夫环(循环链表和顺序表) 问题描述: 编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。 1.循环链表 2.顺序表

    【计算机求职笔试】资源

    【计算机求职笔试】资源

    tacacs-libs-F4.0.4.28.7fb~20231005g4fdf178-2.el8.x64-86.rpm.tar.gz

    1、文件说明: Centos8操作系统tacacs-libs-F4.0.4.28.7fb~20231005g4fdf178-2.el8.rpm以及相关依赖,全打包为一个tar.gz压缩包 2、安装指令: #Step1、解压 tar -zxvf tacacs-libs-F4.0.4.28.7fb~20231005g4fdf178-2.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm

    “壮族三月三”教学课件模板.pptx

    “壮族三月三”教学课件模板

    基于TMS320F28069的伺服驱动器设计方案详解与优化技巧

    内容概要:本文详细介绍了基于TMS320F28069的成熟量产型DIY伺服驱动器方案。硬件方面,采用四层板设计,将控制、驱动、电源、滤波等功能分区明确,选用高性能IGBT和MOS管,确保稳定性和高效性能。关键电路如PWM输出、电流环采样、PID算法等进行了深入剖析,并提供了优化建议。软件部分涵盖了ePWM模块配置、ADC采样、PID控制器实现以及FOC SVPWM算法等核心技术。此外,还特别强调了PCB布局、EMI设计、隔离电路等方面的经验教训。 适合人群:具有一定嵌入式开发经验和电机控制基础知识的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解伺服驱动器设计原理和实现方法的技术人员,旨在帮助他们掌握从硬件设计到软件编程的完整流程,提高产品性能和可靠性。 其他说明:文中提到多个具体实现细节和常见问题解决方案,对于初学者来说有一定的挑战性,建议先熟悉相关基础知识再进行尝试。

    在线商城系统设计与开发-代码.zip

    Java项目基于Springboot框架的课程设计,包含LW+ppt

    基于模糊神经网络的风光互补系统负荷功率智能分配与Simulink仿真

    内容概要:本文详细介绍了在风光互补发电系统中,利用模糊神经网络进行不同等级负荷的智能功率分配及其在Simulink/Matlab环境下的仿真实现。文中首先阐述了光伏和风机的MPPT算法,分别采用了扰动观察法和叶尖速比控制来优化能量捕获。接着深入探讨了模糊控制器的设计,包括输入输出变量选择、隶属度函数构建以及规则库制定。针对VSC逆变器的控制,讨论了锁相环参数设置和LC滤波器的应用,确保并网电流质量。此外,还分享了一些实用的仿真技巧,如Fast Restart功能的使用,以提高调试效率。 适用人群:从事电力电子、智能控制系统研究的技术人员,尤其是对风光互补发电系统感兴趣的科研工作者和工程技术人员。 使用场景及目标:适用于希望深入了解风光互补系统中智能功率分配机制的研究人员和技术开发者。目标是掌握模糊神经网络在复杂电力系统中的应用方法,提升系统的可靠性和效率。 其他说明:文章不仅提供了详细的理论分析,还包括具体的代码实现和实践经验,有助于读者更好地理解和应用于实际项目中。

    质子交换膜燃料电池阴极催化层梯度结构对其性能和耐久性的影响研究(复现论文,含详细可运行代码及解释)

    内容概要:本文复现了一篇关于质子交换膜燃料电池(PEMFC)阴极催化层梯度结构对其性能和耐久性影响的论文。文中详细介绍了1D Pt降解模型和1D PEMFC性能模型的相关参数设定、函数定义及其计算方法。通过Python代码实现了关键计算步骤,包括总表面张力、净Pt溶解速率、净Pt氧化速率、Pt颗粒直径和氧化物覆盖率的更新、Pt2+浓度场的求解、电化学活性表面积(ECSA)的计算以及极化曲线的绘制。此外,还增加了对催化剂层梯度结构的模拟,进一步探讨了其对电池性能的影响。 适合人群:具备一定编程基础和燃料电池基础知识的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解PEMFC内部机制、优化电池设计的研究人员。主要目标是通过模拟实验验证阴极催化层梯度结构对PEMFC性能和耐久性的具体影响。 阅读建议:读者可以结合论文原文,逐步理解和修改提供的Python代码,以适应不同的研究需求。同时,可以通过调整参数和边界条件,探索更多可能性。

    项目管理实用表格 - 软考高级-信息系统项目管理师

    项目管理实用表格 - 软考高级-信息系统项目管理师

Global site tag (gtag.js) - Google Analytics