- 浏览: 447200 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (267)
- java (8)
- 求职&面试 (1)
- linux (33)
- windows (1)
- C++ (5)
- android (12)
- QT (1)
- 经验 (1)
- memory-leaks (1)
- Streaming&V/A (1)
- network&security (5)
- SCM (13)
- mysql (10)
- browsers (4)
- Windows APIs (2)
- opensource (1)
- pm (1)
- GDI (1)
- database (14)
- MFC (1)
- web&fronts (17)
- Tomcat (4)
- OLE (1)
- 观后感 (1)
- Production (2)
- UML (3)
- Javascript (7)
- Cloud Computing&SAAS (5)
- SoftwareEngineering (1)
- Computer&Maintenance (1)
- Web (8)
- Desgin (1)
- J2ee (10)
- mysql cluster (0)
- LB&HA (2)
- webserver (11)
- php (5)
- cas&authtication (0)
- Languages (1)
- IDEs (3)
- architecture (2)
- iOS (8)
- spring (3)
- webservices (1)
- security (1)
- MVCFrameworks (2)
- bservices (0)
- build-tools (2)
- unittest (1)
- spring-security (0)
- sphinx (2)
- hibernate (1)
- mybatis (2)
- search (0)
- nginx (2)
- design&production (2)
- DFS (0)
- algorithm (0)
- distributed&network (0)
- blogs (0)
- os&admin (0)
- fastcgi (0)
- kv-db (0)
- operation&maintenance (1)
- productions (9)
- 养生 (1)
- appserver (1)
- HTTP (2)
- test (1)
- erlang (2)
- browser (0)
- 非技术 (2)
- mobiles (2)
- cloud computing (2)
- Business (2)
- maven (1)
- python (5)
- 人生 (0)
- Cryptography (3)
- CV (0)
- cms (2)
- jqm (2)
- html (2)
- flex (1)
- redmine (1)
- iptables (1)
- groovy (1)
- scala (1)
- grails (1)
- ftp (3)
- vsftpd (2)
- lua (0)
- chroot (3)
- jailkit (3)
- UED (0)
- myeclipse (2)
- ide (2)
- eclipse (2)
最新评论
-
Nick712:
http://blog.csdn.net/victory08/ ...
处理SVN出现:Cleanup failed to process the following paths: xxx -
xs6262460:
Spring AOP根据JdbcTemplate方法名动态设置数据源 -
xhpscdx:
我的解决办法是把D:\ACRS\Projects\TAIS 下 ...
处理SVN出现:Cleanup failed to process the following paths: xxx -
hnraysir:
总结得相当不错,支持下。
使用CodeIgniter 创建 RESTful 服务 REST API【原创译文】 -
云上太阳:
这个必须评论下,间接的救过俺的命啊
解决tomcat启动报错,加强错误日志的显示:
需求
公司有一个产品,包括前台WEB界面和多个后台服务,各个服务都需要在前面界面中进行配置和控制,以调整服务的行为。以前,配置文件都存放在数据库中,界面上修改配置后入库,并发送消息(Socket)通知特定的服务重新加载配置。这样有些问题,一方面自己维护Socket带来很多麻烦,二来数据库重建的时候,需要备份/恢复这些配置数据。
所以,我们想把配置文件局部化到各个服务(比如用本地文件存储),然后在界面上修改的时候,实时向服务请求当前配置数据(XML格式),修改完毕后,再直接发给服务进行更新和存储。而在通信方式上,我们希望各个服务提供Web Service接口来实现配置的检索和更新。
但Web Service通常需要在Web Container(比如,tomcat, jboss)中实现,而我们不想把所有的服务都跑在tomcat里,于是想找到一种更加轻量级的方式。
今天偶然看到JSR311,进而发现在Java后台服务中内嵌grizzly(基于NIO的实现)和Jersey(Sun的JSR311参考实现)来提供Restful Web Service能力,是非常方便的。个人认为这种方式适用于后台Java程序的控制、配置和监视,其作用有些类似于JMX,但比实现JMX要简单的多(JSR311基于POJO)。
背景知识
Representational state transfer (REST) Web Service:
它是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。在目前三种主流的Web Service实现方案中,因为REST与SOAP和XML-RPC相比显的更加简洁,因此越来越多的Web Service开始采用REST风格设计和实现。
参考资料:http://en.wikipedia.org/wiki/Representational_State_Transfer
Jersey:
它是Sun对JSR311的官方参考实现,而JSR311是java中实现Restful Web Service的API规范(JSR311: JAX-RS: The Java API for RESTful Web Services)。JSR311有一个重要目标:使用注解(annotation)把POJO暴露成Web Service,这样就比较轻量级。
参考资料:https://jsr311.dev.java.net/nonav/releases/1.0/spec/index.html
Grizzly:
Grizzly于2004年诞生在GlassFish中,开始目的是要建构一个HTTP Web服务器,用来代替Tomcat的Coyote连接器和Sun WebServ er6.1。后来,Grizzly成为一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基础,并隐藏其编程的复杂性。在本例中,我们将其用作内嵌的Servlet Container。
参考资料:https://grizzly.dev.java.net/
准备工作
首先,下载grizzly和jersey。其中,grizzly的下载地址为:http://download.java.net/maven/2/com/sun/grizzly/grizzly-servlet-webserver/1.9.18a/grizzly-servlet-webserver-1.9.18a.jar,jersey的下载地址为:http://download.java.net/maven/2/com/sun/jersey/jersey-archive/1.1.2-ea/jersey-archive-1.1.2-ea.zip
在Eclipse中建一个Java工程,名为jsr331,然后把下载的jersey-archive-1.1.2-ea.zip解压,将jersey-archive-1.1.2-ea\contribs、jersey-archive-1.1.2-ea\lib两个目录下的jar包,连同下载的grizzly-http-webserver-1.9.18a.jar都拷贝到jsr331工程下的lib目录,并加入到该工程的Build Path。(实测中,发现还需要引入一个包,下载地址:http://repository.jboss.org/maven2/org/jvnet/mimepull/1.2/mimepull-1.2.jar)
编写最简单的服务
JSR331把准备提供Web Service的类称为Resource class。Resource class是一个普通类(POJO),但是按照规范要求增加了特定的注解(annotation)。我们首先实现最简单的hello world服务。
在jinxfei.test.jsr311.service下,建立HelloService类,内容如下:
- package jinxfei.test.jsr311.service;
- import javax.ws.rs.GET;
- import javax.ws.rs.Path;
- import javax.ws.rs.Produces;
- @Path("/hello")
- public class HelloService {
- @GET
- @Produces("text/plain")
- public String helloWorld(){
- return "Hello world!";
- }
- }
代码中的注解(annotation)决定了程序发布成Web Service后的行为和特性。其中,HelloService类前面的@PATH,表明该Service的URL路径,这种类名前面带@PATH注解的类被称为Root Resource Class,因为他们决定了访问Service时URI中的第一级路径;@GET表示访问该服务使用HTTP GET方法;@Produces规定该服务返回结果的类型,这里的”text/plain”表名返回纯文本。
发布服务
实现服务类后,我们要启动一个内嵌的grizzly servlet container,并把HelloService发布到该Container中,这样就能通过HTTP协议访问该服务。Jersey提供了两种发布方式,标准的做法需要在web.xml中做配置,所以比较适用于部署在独立的Web Container下的应用,本文不做深入介绍,可参见:http://docs.sun.com/app/docs/doc/820-4867/6nga7f5o4?l=en&a=view。本例与grizzly整合,所以使用grizzly的工具类,通过代码进行部署配置。
在jinxfei.test.jsr311包下创建ServiceDeployer类,内容如下:
- package jinxfei.test.jsr311;
- import java.io.IOException;
- import java.net.URI;
- import java.util.HashMap;
- import java.util.Map;
- import javax.ws.rs.core.UriBuilder;
- import com.sun.grizzly.http.SelectorThread;
- import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory;
- public class ServiceDeployer {
- public static void main(String[] args) throws IOException {
- URI ServerURI=UriBuilder.fromUri("http://localhost/").port(9876).build();
- startServer(ServerURI);
- System.out.println("服务已启动,请访问:"+ServerURI);
- }
- protected static SelectorThread startServer(URI serverURI) throws IOException {
- final Map<String, String> initParams = new HashMap<String, String>();
- initParams.put("com.sun.jersey.config.property.packages","jinxfei.test.jsr311.service");
- System.out.println("Grizzly 启动中...");
- SelectorThread threadSelector = GrizzlyWebContainerFactory.create(serverURI, initParams);
- return threadSelector;
- }
- }
在Eclipse中运行该类,控制台上打印“服务已启动”字样,表示系统启动成功,打开浏览器,输入:http://localhost:9876/hello,即可看到效果,如下图所示:
让功能再强一点点
接下来,我们要让服务能够接受参数,并根据参数打印不同的信息,最简单的就是回显(Echo)。为了实现这一功能,我们给HelloService类增加一个方法:
- @POST @Path("echo")
- @Consumes("application/x-www-form-urlencoded")
- public String echo(@FormParam("msg") String message){
- return "Are you saying:"+message;
- }
@POST表明该方法要用HTTP Post来访问,@Path表明访问该方法的相对路径是echo,@Consumes表明该方法处理HTTP Post请求中何种类型的数据。该方法参数中的注解@FormParam("msg")说明后面的“String message”参数取自表单提交数据中的msg。
由于该方法需要Post访问,且需要通过表单提交数据,所以我们创建一个test.htm,在其中写一个简单的Form:
- <form action="http://localhost:9876/hello/echo" method="post">
- <input type="text" name="msg">
- <input type="submit" value="submit">
- </form>
重启ServiceDeployer,然后在浏览器中打开test.htm,表单中输入任意信息:
这说明HelloService已经提取了表单参数,并回显给用户。
深入学习
请参考官方资料:
JSR311规范:https://jsr311.dev.java.net/nonav/releases/1.0/spec/index.html
JSR311参考实现的主要特性:http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features
发表评论
-
说说大型高并发高负载网站的系统架构(更新)
2012-09-05 01:04 0说说大型高并发高 ... -
JAX-RS @QueryParam Example
2012-09-04 11:58 983JAX-RS @QueryParam Example ... -
REST 风格的 Web 服务入门指南
2012-09-04 10:53 0REST 风格的 Web 服务入门 ... -
REST总结
2012-09-04 10:49 0REST总结 目录 ... -
REST
2012-09-04 10:47 01、“无状态服务器”约束 REST 的 ... -
RESTful Web服务非常简单
2012-09-04 10:07 0很多Java开发人员都对学习基本的RESTful web ... -
Jersey1.8在spring环境下的实现 包括实例代码
2012-09-04 10:06 0Jersey1.8在spring环境 ... -
CXF、Restlet、RESTEasy、Jersey对比
2012-08-28 17:21 1160CXF、Restlet、RESTEasy、Jersey对 ... -
Java REST框架一览
2012-08-24 23:42 1364目前宣称支持REST的Java框架包括以下这些: Restle ... -
Java下RESTful WebService的实现框架介绍
2012-08-24 23:39 6093Java下RESTful WebService的实现 ... -
比较JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket
2012-08-22 10:28 996Java Web层 ... -
应用Apache Axis2 实现Webservice发布
2012-08-09 14:32 2844应用Apache Axis2 实现Webservic ... -
天涯bbs系统架构分析
2012-08-08 21:59 0天涯bbs系统架构分析 研究,就先从入口开始。天涯所 ... -
服务器系统架构分析日志
2012-08-08 21:57 0sudone.com 服务器系统架构分析日志 ... -
squid,nginx,lighttpd反向代理的区别
2012-08-08 21:38 971squid,nginx,lighttpd反向代理的区 ...
相关推荐
"Eclipse中使用Jersey和Tomcat构建RESTful WebService及其调用" RESTful Web服务简介 ----------------- RESTful Web服务是使用HTTP和REST原理实现的Web服务。REST 中最重要的概念是资源(resources),使用全球ID...
### Jersey和Tomcat构建RESTful WebService #### RESTful Web服务简介 REST(Representational State Transfer)是由HTTP规范1.0和1.1版的主要作者之一Roy Fielding在其2000年的博士论文中提出的。REST的核心思想...
WebService接口定义了对外公开的服务方法,这些方法使用Java的JSR 181注解(如`@WebService`和`@WebParam`)进行标记。`@WebService`注解标记接口为一个Web服务,而`@WebParam`注解用于指定方法参数的元数据,如...
### JAVA的WebService支持 #### SOA(Service-Oriented Architecture)概览 面向服务架构(SOA)是一种设计理念,它强调通过标准化的服务接口将不同功能模块连接起来,这些接口独立于具体的硬件平台、操作系统以及编程...
3. JAX-RS(Java API for RESTful Web Services):JAX-RS是为REST风格的Web服务制定的规范,它较晚推出,并且不随JDK1.6一起发行,需要单独下载。JAX-RS的目标是简化Web服务的构建过程。 Apache CXF是实现上述规范...
- **`javax.ws.rs`**:JSR 311和JSR 339(JAX-RS)定义了Java API for RESTful Web Services。这个API使得创建RESTful服务变得简单,通过注解可以轻松地将HTTP方法映射到Java方法上。 - **`javax.xml.ws`**:JSR ...
在JAX-WS中,`@Path`是一个重要的注解,它源自JSR 311(Java API for RESTful Web Services),这是一个为Java平台定义RESTful Web服务的标准。`@Path`注解被用来标识一个类或方法,表示它们是RESTful服务的资源。这...
JAX-RS自JSR 311规范起被引入,并成为Java EE 6的一部分。JAX-RS允许开发者使用注解的方式来定义RESTful服务,极大地简化了开发过程。 - **示例代码**: ```java package com.example.rest; import javax.ws....
Jersey是Java世界中实现RESTful Web服务的主要库,它基于JSR 311和JSR 339(JAX-RS)标准。在Jersey v2.10版本中,开发者可以构建高度可扩展和模块化的RESTful服务。这个框架包含了对基础认证(Base Authentication...
1. `javax.jws-api.jar` - 提供了Java Web服务接口(JSR 311)。 2. `jaxb-api.jar` - Java Architecture for XML Binding,用于对象到XML的转换。 3. `javax.xml.soap-api.jar` - 提供SOAP API。 4. `activation....
首先,Jersey作为JAX-RS(JSR 311)的开源参考实现,被广泛用于创建RESTful接口。它不仅提供了标准的API,还允许开发者通过扩展机制自定义功能。 **1. Maven配置** Maven是一个项目管理和综合工具,它帮助我们管理...
- **版本**:JSR 311,当前版本为1.0。 - **API位置**:`javax.ws.rs.*`包内。 #### 五、实现工具和技术 Apache CXF是一个流行的开源框架,用于构建和消费WebService,支持JAX-WS和JAX-RS规范。CXF的核心组件是`...
3. **cxf-rt-frontend-jaxrs**:支持RESTful Web服务,遵循JSR 311或JSR 339规范。 4. **cxf-rt-transports-http** 和 **cxf-rt-transports-http-jetty**:提供HTTP和HTTPS的传输层支持,Jetty版本可以内嵌HTTP...
JAX-WS(Java API for XML Web Services)是Java平台上用于构建Web服务的标准,它取代了早期的JAX-RPC,提供了一种更简单、更面向对象的方式来创建和消费Web服务。在使用JAX-WS开发Java Web服务时,我们需要依赖一些...
标题“Java-tomcat-axis2开发webservice返回json数据”涉及的是使用Java、Tomcat服务器以及Axis2框架来创建Web服务,并返回JSON格式的数据。这是一个常见的技术组合,用于构建RESTful API或者提供服务化接口。下面...
Apache CXF是一个开源的Web服务框架,它支持多种Web服务标准,如SOAP、RESTful API和WS-*规范。CXF提供了丰富的API和工具,帮助开发者构建和部署服务。 2. **Spring 3框架**: Spring是Java企业级应用程序的流行...