RESTEasy是JBoss的开源项目之一,是一个RESTful Web Services框架。RESTEasy的开发者Bill Burke同时也是JAX-RS的J2EE标准制定者之一。JAX-RS 是一个JCP制订的新标准,用于规范基于HTTP的RESTful Web Services的API。
我们已经有SOAP了,为什么需要Restful WebServices?用Bill自己的话来说:"如果是为了构建SOA应用,从技术选型的角度来讲,我相信REST比SOAP更具优势。开发人员会意识到使用传统方式有进行SOA架构有多复杂,更不用提使用这些做出来的接口了。这时他们就会发现Restful Web Services的光明之处。"
说了这么多,我们使用RESTEasy做一个项目玩玩看。首先创造一个maven1的web 项目
Java代码
1.mvn archetype:create -DgroupId=org.bluedash \
2.
3.-DartifactId=try-resteasy -DarchetypeArtifactId=maven-archetype
-webapp
准备工作完成后,我们就可以开始写代码了,假设我们要撰写一个处理客户信息的Web Service,它包含两个功能:一是添加用户信息;二是通过用户Id,获取某个用户的信息,而交互的方式是标准的WebService形式,数据交换格式为XML。假设一条用户包含两个属性:Id和用户名。那么我们设计交换的XML数据如下:
Java代码
1.
2.
3.
4.
首先要做的就是把上述格式转换成XSD2,网上有在线工具可以帮助我们完成这一工作3,在此不详细展开。使用工具转换后,生成如下xsd文件:
Java代码
1.
2. lt="qualified" 3.version="1.0" xmlns:xsd="https://www.sodocs.net/doc/1d350286.html,/2001/XMLSchema"> 4. 5. 6. 7. 8. 9. 10. 11.
有了xsd文件,我们便可以使用JDK自带工具的xjc将xsd转换成为Java的Class。将上述xsd文件存为 user.xsd,并使用如下命令进行转换:
Java代码
1.xjc user.xsd
执行结束后我们会得到一系列的类文件:
Java代码
1.Li-Weinans-MacBook-Pro:Desktop liweinan$ xjc user.xsd
2.parsing a schema...
https://www.sodocs.net/doc/1d350286.html,piling a schema...
4.generated/ObjectFactory.java
5.generated/UserType.java
这样,我们的XML格式的交换数据便转化为面向对像的Java类了,是不是感觉有点像Hibernate的ORM理念?没错,将XML映射成成面向对象的数据类,这个过程叫做XML Binding,即XML绑定。这个过程也有J2EE标准,叫做JAXB4。而RESTEasy是全面支持JAXB的。可以说RESTEasy所支持的JAX-RS标准,当与JAXB 标准结合在一起使用时,就可以发挥出最大优势,让程序员少写一堆一堆的代码。有关JAXB标准,会在独立的篇章中详细讨论,在此先不展开。总之我们将生成的Java类放进项目中等候使用。我们可以看一下UserType类的内容:
Java代码
1.package org.bluedash.resteasy;
2.
3.import javax.xml.bind.annotation.XmlAccessType;
4.import javax.xml.bind.annotation.XmlAccessorType;
5.import javax.xml.bind.annotation.XmlElement;
6.import javax.xml.bind.annotation.XmlType;
7.
8.@XmlAccessorType(XmlAccessType.FIELD)
9.@XmlType(name = "userType", propOrder = {
10. "id",
11. "name"
12.})
13.public class UserType {
14.
15. protected int id;
16. @XmlElement(required = true)
17. protected String name;
18.
19. /**
20. * Gets the value of the id property.
21. *
22. */
23. public int getId() {
24. return id;
25. }
26.
27. /**
28. * Sets the value of the id property.
29. *
30. */
31. public void setId(int value) {
32. this.id = value;
33. }
34.
35. /**
36. * Gets the value of the name property.
37. *
38. * @return
39. * possible object is
40. * {@link String }
41. *
42. */
43. public String getName() {
44. return name;
45. }
46.
47. /**
48. * Sets the value of the name property.
49. *
50. * @param value
51. * allowed object is
52. * {@link String }
53. *
54. */
55. public void setName(String value) {
56. https://www.sodocs.net/doc/1d350286.html, = value;
57. }
58.
59.}
可以看到,XML格式就是通过一些JAXB的标记被映射成了Java类。我们没写什么代码,已经把数据模型定义清楚了。接下来我们撰写最核心的WebService API。我们的WebService包含两个接口:一个是添加用户接口createUser,另一个是获取用户接口getUser:
Java代码
1.package org.bluedash.resteasy;
2.
3.import https://www.sodocs.net/doc/1d350286.html,.URI;
4.import java.util.Map;
5.import java.util.concurrent.ConcurrentHashMap;
6.import java.util.concurrent.atomic.AtomicInteger;
7.
8.import javax.ws.rs.Consumes;
9.import javax.ws.rs.GET;
10.import javax.ws.rs.POST;
11.import javax.ws.rs.Path;
12.import javax.ws.rs.PathParam;
13.import javax.ws.rs.Produces;
14.import javax.ws.rs.WebApplicationException;
15.import javax.ws.rs.core.Response;
16.
17.@Path("/users")
18.public class UserServlet {
19.
20. private Map
21. new ConcurrentHashMap
22. private AtomicInteger idGenerator = new AtomicInteger();
23.
24. @POST
25. @Consumes("application/xml")
26. public Response createUser(UserType user) {
27. user.setId(idGenerator.incrementAndGet());
28. userStore.put(user.getId(), user);
29. System.out.println(user.getName() + " created: "
30. + user.getId());
31. return Response.created(URI.create("/users/"
32. + user.getId())).build();
33. }
34.
35. @GET
36. @Path("{id}")
37. @Produces("application/xml")
38. public UserType getUser(@PathParam("id") int id) {
39. UserType u = userStore.get(id);
40. if (u == null) {
41. throw new WebApplicationException(
42. Response.Status.NOT_FOUND);
43. }
44. return u;
45. }
46.
47.}
用几个简单的JAX-RS标记,便把普通的函数变成了WebService接口。而这些标记将由RESTEasy支持生效。接下来我们将要进行RESTEasy的配置工作。RESTEasy 的配置方法有多种多样,可以和Spring等容器集成,也可以独立运行,因为我们用的Servlet的形式使RESTEasy进行工作,这也是最主流的方式,因此在这里使用web容器来加载它,首先定义一个配置类:
Java代码
1.package org.bluedash.resteasy;
2.
3.import java.util.HashSet;
4.import java.util.Set;
5.
6.import javax.ws.rs.core.Application;
7.
8.public class BluedashResteasyApplication extends Application {
9. private Set
10. private Set
11.
12. public BluedashResteasyApplication() {
13.// classes.add(UserServlet.class);
14. singletons.add(new UserServlet());
15. }
16.
17. @Override
18. public Set
19. return classes;
20. }
21.
22. @Override
23. public Set
24. return singletons;
25. }
26.}
这个类扩展JAX-RS的Application接口,用于封装我们的WebService API方法。我们可以看到JAX-RS支持两种封装方法,一种是classes封装,由容器管理WebServices类的实例化和销毁等动作,一个线程一个实例,开发者不需要关心线程安全问题。但这种方法可能比较浪费资源。如果开发者想自己管理线程安全,共线程共用一个WebServices实例,那么就用singletons封装。我们在这里用的singletons封装,这也就解释了为什么我们在 UserServlet中使用了ConcurrentHashMap和AtomicInteger这些保障线程安全的类。接下来就是在web.xml中启动RESTEasy:
Java代码
1.
2. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
3. "https://www.sodocs.net/doc/1d350286.html,/dtd/web-app_2_3.dtd" >
4.
5.
6. me> 7. 8. 9. 10. 11. BluedashResteasyApplication 12. 13. 14. 15. 16. servlet.ResteasyBootstrap 17. 19. 20. 21. t. 22. HttpServletDispatcher 23. 24. 25. 26. 27. 28. 29. 没错,就是这么简单,这样,我们的WebService就完成了!还差点什么呢?嗯,还差一个Test Case来使用我们的WebService接口,并验证它的正确性,让我们来写一个TestUserAPI Java代码 1.package org.bluedash.resteasy.test.integration.test; 2. 3.import java.io.IOException; 4.import java.io.OutputStream; 5.import https://www.sodocs.net/doc/1d350286.html,.HttpURLConnection; 6.import https://www.sodocs.net/doc/1d350286.html,.URL; 7. 8.import junit.framework.TestCase; 9. 10.public class TestUserAPI extends TestCase { 11. public static final String USER_API = 12. "http://127.0.0.1:8080/try-resteasy/users"; 13. 14. public void testCreateUserAndGetUser() throws IOException { 15. URL url = 16. new URL(USER_API); 17. HttpURLConnection connection = 18. (HttpURLConnection) url.openConnection(); 19. connection.setRequestMethod("POST"); 20. connection.setRequestProperty("Content-Type", "applicat ion/xml"); 21. connection.setDoOutput(true); 22. connection.setInstanceFollowRedirects(false); 23. connection.setConnectTimeout(1000); 25. String userXML = " 26. OutputStream os = connection.getOutputStream(); 27. os.write(userXML.getBytes()); 28. os.flush(); 29. 30. assertEquals(HttpURLConnection.HTTP_CREATED, connection 31. .getResponseCode()); 32. connection.disconnect(); 33. 34. } 35.} 一切都已经准备就绪,最后我们要配置一下Maven,让它下载所需的RESTEasy 等库,然后配置Maven使用Jetty Web服务器,来把我们的服务和测试跑起来: Java代码 1. 2. xmlns:xsi="http://www.w https://www.sodocs.net/doc/1d350286.html,/2001/XMLSchema-instance" 3. xsi:schemaLocation="https://www.sodocs.net/doc/1d350286.html,/POM/ 4.0.0 4.https://www.sodocs.net/doc/1d350286.html,/maven-v4_0_0.xsd"> 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. lude> 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. > 93. 94. 95. 96. 97. 98. 99. 101. 102. 103. 104. 105. 107. 108. 109. 110. e> 111. 112. 113. 114. 115. 116. 117. 118. 119. 有关Maven的配置就不详细展开了。配置完成后我们便可以运行单元测试,看看WebServices是否正确运行。执行下述命令 Java代码 1.mvn integration-test 执行结果如下: Java代码 1.------------------------------------------------------- 2. T E S T S 3.------------------------------------------------------- 4.Running org.bluedash.resteasy.test.integration.test.TestUserAPI 5.liweinan created: 1 6.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.372 sec 7. 8.Results : 9. 10.Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 可以看到,我们的测试按预期执行成功了。这篇文章中,我简单向大家介绍了RESTEasy的初步使用方法,希望对大家在架构SOA应用时,有所帮助。JAX-RS 标准做为J2EE家庭中相对较新的一员,其应用前景是十分广阔的。 HTML5教程 什么是HTML5? HTML5 将成为HTML、XHTML 以及HTML DOM 的新标准。 HTML 的上一个版本诞生于1999 年。自从那以后,Web 世界已经经历了巨变。HTML5 仍处于完善之中。然而,大部分现代浏览器已经具备了某些HTML5 支持。 你是不是多少有了解一点,但是你却对这个不精啊!可以进群交流,⑤①④①⑥⑦⑥⑦⑧。HTML5 是如何起步的? HTML5 是W3C 与WHATWG 合作的结果。 编者注:W3C 指World Wide Web Consortium,万维网联盟。 编者注:WHATWG 指Web Hypertext Application Technology Working Group。WHATWG 致力于web 表单和应用程序,而W3C 专注于XHTML 2.0。在2006 年,双方决定进行合作,来创建一个新版本的HTML。 为HTML5 建立的一些规则: ?新特性应该基于HTML、CSS、DOM 以及JavaScript。 ?减少对外部插件的需求(比如Flash) ?更优秀的错误处理 ?更多取代脚本的标记 ?HTML5 应该独立于设备 ?开发进程应对公众透明 新特性 HTML5 中的一些有趣的新特性: ?用于绘画的canvas 元素 ?用于媒介回放的video 和audio 元素 ?对本地离线存储的更好的支持 ?新的特殊内容元素,比如article、footer、header、nav、section ?新的表单控件,比如calendar、date、time、email、url、search 浏览器支持 最新版本的Safari、Chrome、Firefox 以及Opera 支持某些HTML5 特性。Internet Explorer 9 将支持某些HTML5 特性。 HTML 5 视频 许多时髦的网站都提供视频。HTML5 提供了展示视频的标准。 Web 上的视频 直到现在,仍然不存在一项旨在网页上显示视频的标准。 今天,大多数视频是通过插件(比如Flash)来显示的。然而,并非所有浏览器都拥有同样的插件。 HTML5 规定了一种通过video 元素来包含视频的标准方法。 视频格式 当前,video 元素支持两种视频格式: Internet Explorer Firefox 3.5 Opera 10.5 Chrome 3.0 Safari 3.0 Ogg X X X MPEG 4 X X Ogg = 带有Thedora 视频编码和Vorbis 音频编码的Ogg 文件 MPEG4 = 带有H.264 视频编码和AAC 音频编码的MPEG 4 文件 艾伦经典语录 1、一个人怎样思考,就代表他是怎样的人。 2、弱小就只能哭泣吗? 3、这个世界是残酷的。同时也很美。 4、哈?愚蠢?我觉得那些安于当家畜的人才更加愚蠢。 5、觉得赢不了就只好死心吗? 6、看到了那些的人,才是获得了这世上最大的自由的人。 7、确实,迄今为止人类一直在打败仗,面对巨人,人海战术没有任何意义。 8、无论世界有多么残酷,都无所谓。战斗啊!战斗啊!战斗啊! 9、战斗啊,哪怕是粉身碎骨也在所不惜。无论世界有多么**,都无所谓。 10、战。战斗啊,快战斗啊。赢不了,就得死。赢了,就能活下去。不战斗,就赢不了! 11、即使一生都出不了城墙,吃了睡,睡了吃,也能活下去。但是,那样的话不就简直,简直和家畜没有区别了吗? 12、我一定会将巨人一个不留的驱逐出去,走出这个狭小的墙内世界,这就是我的梦想,人类,还没有彻底败北! 13、我不想一无所知,一辈子呆在城墙里。而且如果没有人继续做这份工作,那之前牺牲的那些人不就白白牺牲了吗? 14、对了。这家伙就是只知道宣泄心中感情的,以前的那个我,但我 已不同往日了,我得用自己的技巧来收场。 15、我以为此时此刻全世界的热闹都只给你,全世界的烟火全都给你,所有的所有,不能更明亮了,就像你一直以来的那个样子。 16、我们所有人,从出生的那一刻起,就是自由的。阻碍我们自由的事物,不论有多么强大,都无所谓无论是石油,冰川还是别的任何东西。 17、就在你吊儿郎当的期间,我可是吃了不少苦头学会了这门格斗技,放纵自己,任由感情支配你的生活就是现实?你这样子,还算是士兵吗? 18、我们虽然输了,但是通过战斗所获得的那些信息,也切实的将我们同下一个希望紧密联络在一起,我们就白白放弃,那十万人的牺牲所换来的战术发展吗? 19、有时候向前看的唯一方式就是重温过去那些牵绊着你的事,你必须迎面去解决,不管他们有多可怕,因为一旦我们这么做了,就会发现你能比自己想象的走的更远 搜集整理,仅供参考学习,请按需要编辑修改 H t m l+c s s基础教程 (适合新手) 在这里我把h t m l和c s s放在一起了,适合新手和在学习的人当成笔记用。希望对大家有所帮助。 HTML是网页主要的组成部分,基本上一个网页都是由HTML语言组成的,所以要学习网站怎样建设,必须从网页的基本语言学起。 一、HTML的组成结构 HTML分为单标识语句和双标识语句。 <标识>内容如:HTML5基础入门教程(小编搜集辛苦啊,必看)
艾伦经典语录
Html+css基础教程
<标识>内容标识> 如:搜狐 标识中存在标识属性用来定义各标识属性的值。 中心内容 二、HTML全局结构 1、头部。(标题栏)只要你学过英语,你应该知道头怎么用英文写吧!yes,HEAD就是了;所以,头部的HTML写法就是
语言入门教程(一) ?什么是HTML语言 HTML(HyperText MarkUp Language)是使用特殊标记来描述文档结构和表现形式的一种语言,由W3C(World Wide Web Consortium)所制定和更新。我们可以用任何一种文本编译起来编辑HTML文件,因为它就是一总纯文本文件。 ?HTML语言的基本结构 下面我们来看一小段HTML语言的代码,来了解HTML语言的基本结构:
html5入门教程网盘下载 Html5的发展让不少开发商发现了机遇,html5开发人才也遭受疯抢,但传统前端人才很难驾驭移动端。因此,html5开发人才出现严重紧缺状态,很多企业陷入两难境地。那么想学习这门技术,当然要有好的学习资料,千锋教育免费分享html5自学教程! 设计模式是在软件开发中,经过验证的,用于解决在特定环境下,重复出现的特定的问题的解决方案。在编写JS代码的过程中,运用一定的设计模式可以让我们的代码更加优雅、灵活。 每个设计模式的构成如下: 1、模式名称:模式的一个好记的名字 2、环境和问题:描述在什么环境下,出现什么特定的问题 3、解决方案:描述如何解决问题 4、效果:描述应用模式后的效果,以及可能带来的问题 简单地说,模式就是一些经验,一套场景/问题+解决方案。 千锋HTML5百人教学天团,每个讲师都是具有多年开发经验的行业佼佼者。设计模式课程的讲解将从实际应用场景出发,以实践和尝试的方式,分析可能出现的问题以及如何解决,以期达到“避免犯前人犯过的错误+ 避免引入不成熟的设计“这一目标。让大家快速领略编程之美,模式之美。 为什么要学习设计模式?
设计模式的种类较多,各个模式都有它对应的场景,不能武断地认为某个模式就是最优解决方案。通过学习这些设计模式,让你找到“封装变化”、“松耦合”、“针对接口编程”的感觉,从而设计出易维护、易复用、扩展性好、灵活性足的程序。通过学习设计模式让你领悟面向对象编程的思想(SOLID),到最后就可以抛弃设计模式,把这些思想应用在你的代码中,写出高内聚、低耦合、可扩展、易维护的代码了。此时已然是心中无设计模式,而处处是设计模式了。这就是学习设计模式的目的。 常见的几种设计模式 单例模式 之所以叫做单例模式是因为它限定对于一个类,它他只允许有一个实例化对象,经典的实现方式是,创建一个类,这个类包含一个方法,这个方法在没
人生必看的25部励志电影 励志名言京ICP备13016261号-1)他们的马海洋饼干也和主人相仿佛,是赛马中的失败者,不仅个子比寻常赛马小,看上去腿也有问题。但是当三个人开始训练这匹看起来没什么希望的马,人和马的执著劲头都显露出来,他们的坚韧和胜利在那个灰暗的年代给整个国家带了了希望。 11、《末路狂花》Thelma&Louise 该片被认为是向男权社会发出抗争的女性主义电影代表作。 生活在沉闷与琐碎家务中的家庭主妇赛尔玛(SusanSarandon)与在某间咖啡厅做女侍应生的闺中密友路易丝(GeenaDavis)对平凡的生活与工作产生厌倦后,结伴一起外出旅游散心。路上,在某家酒吧外的停车厂,赛尔玛险遭无名男子强暴,幸好路易丝及时赶到,拔枪将该男子射杀。惊慌失措的两人掉头逃亡,自此踏上不归路,过程中两人
性格均有了很重大的改变。 12、《天使艾米丽》 艾美丽看来不是一个天使,她只是个平凡的咖啡馆招待,从小孤独自闭的长大,母亲意外死亡父亲碌碌无为,生活的多少有点不幸。但她愿意帮助周围每一个需要帮助的人,事实上周围的每一个人也都需要帮助,她精心准备每一个帮助的计划,始终不让别人发现是谁在帮助他们,艾美丽成了他们身边真正的“天使”。终于她也鼓起勇气,找到了属于她的幸福,她的心灵花园中也开满了鲜花。 作为新人,来到新环境,也许会受到排斥与冷落。想处好人际关系,也许你可以像艾米丽一样,去主动关心别人,做一些小小的努力,哪怕换来的是一个微笑或一声谢谢,但是你逐步建立起来的良好的人际关系会让你事半功倍。 13、《放牛班的春天》 克莱门特是一个才华横溢的音乐家,不过在1949年的法国乡村,他没有
第1章HTML 5概述 一、选择题 1.A 2.D 3.C 4.C 二、填空题 1.HyperText Markup Language 2. 3.HTML 4.UTF-8 5.