服务协议Rest风格的web服务开发-入门篇1
2013-05-02 20:34
405 查看
废话就不多说了,开始。。。
在这里简略的说下CXF对REST的支撑,先对REST观点说下。
REST 是一种软件架构模式,只是一种风格,不是像SOAP 那样本身承载着一种消息协议,也可以叫做REST 是基于HTTP协议的软件架构。
REST 中主要的两个观点就是源资位定和源资作操,而HTTP 协议恰好完整的供给了这两个要点,HTTP 协议中的URI 可以成完源资位定,GET、POST、OPTION等法方可以成完源资作操,因此REST 完整依附HTTP 协议以可就成完Web 服务,而不像SOAP 协议那样只利用HTTP 的传输性特,位定与作操由SOAP 协议自身成完,也是正由于SOAP 消息的存在,使得SOAP 粗笨。你也可以说REST 充分利用了HTTP 协议的性特,而不是像SOAP 那样只利用了其传输这一性特(事实上大多数人提到HTTP 协议就只会想到它能用于数据传输)。
REST 是一种软件架构理念,现在被移植到Web 服务上(因此不要提到REST 就马上想到WebService,JAX-RS 只是将REST 计划风格应用到Web 服务开辟),那么在开辟Web 服务上,偏于面向源资的服务适用于REST,偏于面向动活的服务。另外,REST 简略易用,效率高,SOAP 成熟度较高,安全性较好。REST 供给的网络服务叫做OpenAPI,它不仅把HTTP 作为传输协议,也作为理处数据的具工,可以说对HTTP 协议做了较好的解释,充分体现了HTTP 技巧的网络力能。现在Google、Amazon、淘宝都有基于REST 的OpenAPI 供给用调。
WebService中,JAX-RS 只是将REST 计划应用到Web 服务开辟.JAX-RS供给对了REST的支撑
我们先看看体具的例子
1、接口类
Java代码
@Path("/rest_HelloWorld")
public interface Rest_HelloWorld {
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/say/{name}")
public String say(@PathParam("name")String name);
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/sayHello/{name}")
public String sayHello(@PathParam("user")User user);
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/getList/{id}")
public List<User> getList(@PathParam("id")Long id);
}
CXF的Rest用使的JAX-RS标准。JAX-RS: Java API for RESTful Web Services是一个Java编程语言的应用程序接口,支撑按照 表象化态状变转 (REST)架构风格创立Web服务Web服务. JAX-RS用使了Java SE 5引入的Java 标注来简化Web服务客户端和服务端的开辟和署部。
JAX-RS供给了一些标注将一个源资类,一个POJOJava类,封装为Web源资。标注括包:
(1)、@Path,标注源资类或法方的相对路径
(2)、@GET,@PUT,@POST,@DELETE,标注法方是用的HTTP求请的类型
(3)、@Produces,标注回返的MIME媒体类型,( 解注标注,这个解注可以含包一组字符串,认默值是*/*,它指定REST 服务的应响结果的MIME 类型,例如:application/xml、application/json、image/jpeg 等),你 也可以同时回返多种类型,但体具生成结果时用使种哪格式取决于ContentType。CXF 认默回返的是JSON 字符串。
(4)、@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分离标注法方的参数来自于HTTP求请的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP求请的头信息,@CookieParam来自于HTTP求请的Cookie。
注意:前两章说的CXF与spring整合及 都是用使JAX-WS标准。JAX-WS标准是一组XML web services的JAVA API。jaxws 是配置SOAP 式方的Web 服务
Spring中引入了两个新的名称间空jaxws、jaxrs,因为CXF 实现了Spring 的NamespaceHandler 接口,实现这个接口可以在Spring 中增长额定的配置。那么jaxws 自然是配置SOAP 式方的Web 服务,你可以看到有jaxws:server、jaxws:endpoint、jaxws:client 三个元素,jaxws:server 和jaxws:endpoint 是等效的,都用于布发Web 服务,现出jaxws:endpoint 的原因是JAX-WS 标准中用使EndPoint 布发Web 服务(面前用使过种这
式方),CXF 为了和JAX-WS 对应,供给了这个与jaxws:server 功能一样的配置元素;
jaxrs是REST 式方的Web 服务,有jaxrs:server、jaxrs:client 两个元素。
2、接口实现类
Java代码
@Service("rest_HelloWorldImpl")
public class Rest_HelloWorldImpl implements Rest_HelloWorld {
public String say(String name) {
return name+",您好!";
}
public String sayHello(User user) {
return user.getName()+",您好!";
}
public List<User> getList(Long id){
List<User> list = new ArrayList<User>();
Long sid=1L;
User user = new User(sid,"张三"+sid,21);
list.add(user);
sid=2L;
user = new User(sid,"张三"+sid,21);
list.add(user);
sid=3L;
user = new User(sid,"张三"+sid,21);
list.add(user);
return list;
}
}
3、CXF在Spring中的配置
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<!--id:名称(随意配),implementor:指定接口体具实现类,address:随意配-->
<jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
<!-- 输入日志拦截器 -->
<jaxws:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxws:inInterceptors>
<!-- 输出日志拦截器 -->
<jaxws:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxws:outInterceptors>
<jaxws:properties>
<entry key="mtom_enabled" value="true"></entry>
</jaxws:properties>
</jaxws:endpoint>
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
<!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里供给了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
可以方便实现的用调WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要用调webservice,
只要将client这个bean注入到需要用使的bean里。-->
<bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
<property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
</bean>
</beans>
注意:以下代码是新增长代码
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
Java代码
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
4、访问
http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1
回返JSON格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=json
回返XML格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=xml
得到结果
Java代码
<Users>
<User>
<id>1</id>
<name>张三1</name>
<age>21</age>
</User>
<User>
<id>2</id>
<name>张三2</name>
<age>21</age>
</User>
<User>
<id>3</id>
<name>张三3</name>
<age>21</age>
</User>
</Users>
用使CXF的rest还需要额定增长一个Jar:jsr311-api-1.1.1.jar
为了支撑回返JSON格式,还需要jettison-1.1.jar
在这里简略的说下CXF对REST的支撑,先对REST观点说下。
每日一道理
只有启程,才会到达理想和目的地,只有拼搏,才会获得辉煌的成功,只有播种,才会有收获。只有追求,才会品味堂堂正正的人。
REST 是一种软件架构模式,只是一种风格,不是像SOAP 那样本身承载着一种消息协议,也可以叫做REST 是基于HTTP协议的软件架构。
REST 中主要的两个观点就是源资位定和源资作操,而HTTP 协议恰好完整的供给了这两个要点,HTTP 协议中的URI 可以成完源资位定,GET、POST、OPTION等法方可以成完源资作操,因此REST 完整依附HTTP 协议以可就成完Web 服务,而不像SOAP 协议那样只利用HTTP 的传输性特,位定与作操由SOAP 协议自身成完,也是正由于SOAP 消息的存在,使得SOAP 粗笨。你也可以说REST 充分利用了HTTP 协议的性特,而不是像SOAP 那样只利用了其传输这一性特(事实上大多数人提到HTTP 协议就只会想到它能用于数据传输)。
REST 是一种软件架构理念,现在被移植到Web 服务上(因此不要提到REST 就马上想到WebService,JAX-RS 只是将REST 计划风格应用到Web 服务开辟),那么在开辟Web 服务上,偏于面向源资的服务适用于REST,偏于面向动活的服务。另外,REST 简略易用,效率高,SOAP 成熟度较高,安全性较好。REST 供给的网络服务叫做OpenAPI,它不仅把HTTP 作为传输协议,也作为理处数据的具工,可以说对HTTP 协议做了较好的解释,充分体现了HTTP 技巧的网络力能。现在Google、Amazon、淘宝都有基于REST 的OpenAPI 供给用调。
WebService中,JAX-RS 只是将REST 计划应用到Web 服务开辟.JAX-RS供给对了REST的支撑
我们先看看体具的例子
1、接口类
Java代码
<pre class="java" name="code">@Path("/rest_HelloWorld")
public interface Rest_HelloWorld {
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/say/{name}")
public String say(@PathParam("name")String name);
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/sayHello/{name}")
public String sayHello(@PathParam("user")User user);
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/getList/{id}")
public List<User> getList(@PathParam("id")Long id);
}</pre>
CXF的Rest用使的JAX-RS标准。JAX-RS: Java API for RESTful Web Services是一个Java编程语言的应用程序接口,支撑按照 表象化态状变转 (REST)架构风格创立Web服务Web服务. JAX-RS用使了Java SE 5引入的Java 标注来简化Web服务客户端和服务端的开辟和署部。
JAX-RS供给了一些标注将一个源资类,一个POJOJava类,封装为Web源资。标注括包:
(1)、@Path,标注源资类或法方的相对路径
(2)、@GET,@PUT,@POST,@DELETE,标注法方是用的HTTP求请的类型
(3)、@Produces,标注回返的MIME媒体类型,( 解注标注,这个解注可以含包一组字符串,认默值是*/*,它指定REST 服务的应响结果的MIME 类型,例如:application/xml、application/json、image/jpeg 等),你 也可以同时回返多种类型,但体具生成结果时用使种哪格式取决于ContentType。CXF 认默回返的是JSON 字符串。
(4)、@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分离标注法方的参数来自于HTTP求请的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP求请的头信息,@CookieParam来自于HTTP求请的Cookie。
注意:前两章说的CXF与spring整合及 都是用使JAX-WS标准。JAX-WS标准是一组XML web services的JAVA API。jaxws 是配置SOAP 式方的Web 服务
Spring中引入了两个新的名称间空jaxws、jaxrs,因为CXF 实现了Spring 的NamespaceHandler 接口,实现这个接口可以在Spring 中增长额定的配置。那么jaxws 自然是配置SOAP 式方的Web 服务,你可以看到有jaxws:server、jaxws:endpoint、jaxws:client 三个元素,jaxws:server 和jaxws:endpoint 是等效的,都用于布发Web 服务,现出jaxws:endpoint 的原因是JAX-WS 标准中用使EndPoint 布发Web 服务(面前用使过种这
式方),CXF 为了和JAX-WS 对应,供给了这个与jaxws:server 功能一样的配置元素;
jaxrs是REST 式方的Web 服务,有jaxrs:server、jaxrs:client 两个元素。
2、接口实现类
Java代码
@Service("rest_HelloWorldImpl")
public class Rest_HelloWorldImpl implements Rest_HelloWorld {
public String say(String name) {
return name+",您好!";
}
public String sayHello(User user) {
return user.getName()+",您好!";
}
public List<User> getList(Long id){
List<User> list = new ArrayList<User>();
Long sid=1L;
User user = new User(sid,"张三"+sid,21);
list.add(user);
sid=2L;
user = new User(sid,"张三"+sid,21);
list.add(user);
sid=3L;
user = new User(sid,"张三"+sid,21);
list.add(user);
return list;
}
}
3、CXF在Spring中的配置
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<!--id:名称(随意配),implementor:指定接口体具实现类,address:随意配-->
<jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
<!-- 输入日志拦截器 -->
<jaxws:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxws:inInterceptors>
<!-- 输出日志拦截器 -->
<jaxws:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxws:outInterceptors>
<jaxws:properties>
<entry key="mtom_enabled" value="true"></entry>
</jaxws:properties>
</jaxws:endpoint>
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
<!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里供给了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
可以方便实现的用调WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要用调webservice,
只要将client这个bean注入到需要用使的bean里。-->
<bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
<property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
</bean>
</beans>
注意:以下代码是新增长代码
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
Java代码
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
4、访问
http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1
回返JSON格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=json
回返XML格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=xml
得到结果
Java代码
<Users>
<User>
<id>1</id>
<name>张三1</name>
<age>21</age>
</User>
<User>
<id>2</id>
<name>张三2</name>
<age>21</age>
</User>
<User>
<id>3</id>
<name>张三3</name>
<age>21</age>
</User>
</Users>
用使CXF的rest还需要额定增长一个Jar:jsr311-api-1.1.1.jar
为了支撑回返JSON格式,还需要jettison-1.1.jar
文章结束给大家分享下程序员的一些笑话语录:
程序员喝酒
我偶尔采用“木马策略”、“交叉测试”,时间不长就开始“频繁分配释放资源”,“cache”也是免不了的了,
不过我从不搞“轮巡”,也不会“捕获异常”,更不会“程序异常”,因为我有理性
克制的。
在这里简略的说下CXF对REST的支撑,先对REST观点说下。
REST 是一种软件架构模式,只是一种风格,不是像SOAP 那样本身承载着一种消息协议,也可以叫做REST 是基于HTTP协议的软件架构。
REST 中主要的两个观点就是源资位定和源资作操,而HTTP 协议恰好完整的供给了这两个要点,HTTP 协议中的URI 可以成完源资位定,GET、POST、OPTION等法方可以成完源资作操,因此REST 完整依附HTTP 协议以可就成完Web 服务,而不像SOAP 协议那样只利用HTTP 的传输性特,位定与作操由SOAP 协议自身成完,也是正由于SOAP 消息的存在,使得SOAP 粗笨。你也可以说REST 充分利用了HTTP 协议的性特,而不是像SOAP 那样只利用了其传输这一性特(事实上大多数人提到HTTP 协议就只会想到它能用于数据传输)。
REST 是一种软件架构理念,现在被移植到Web 服务上(因此不要提到REST 就马上想到WebService,JAX-RS 只是将REST 计划风格应用到Web 服务开辟),那么在开辟Web 服务上,偏于面向源资的服务适用于REST,偏于面向动活的服务。另外,REST 简略易用,效率高,SOAP 成熟度较高,安全性较好。REST 供给的网络服务叫做OpenAPI,它不仅把HTTP 作为传输协议,也作为理处数据的具工,可以说对HTTP 协议做了较好的解释,充分体现了HTTP 技巧的网络力能。现在Google、Amazon、淘宝都有基于REST 的OpenAPI 供给用调。
WebService中,JAX-RS 只是将REST 计划应用到Web 服务开辟.JAX-RS供给对了REST的支撑
我们先看看体具的例子
1、接口类
Java代码
@Path("/rest_HelloWorld")
public interface Rest_HelloWorld {
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/say/{name}")
public String say(@PathParam("name")String name);
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/sayHello/{name}")
public String sayHello(@PathParam("user")User user);
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/getList/{id}")
public List<User> getList(@PathParam("id")Long id);
}
CXF的Rest用使的JAX-RS标准。JAX-RS: Java API for RESTful Web Services是一个Java编程语言的应用程序接口,支撑按照 表象化态状变转 (REST)架构风格创立Web服务Web服务. JAX-RS用使了Java SE 5引入的Java 标注来简化Web服务客户端和服务端的开辟和署部。
JAX-RS供给了一些标注将一个源资类,一个POJOJava类,封装为Web源资。标注括包:
(1)、@Path,标注源资类或法方的相对路径
(2)、@GET,@PUT,@POST,@DELETE,标注法方是用的HTTP求请的类型
(3)、@Produces,标注回返的MIME媒体类型,( 解注标注,这个解注可以含包一组字符串,认默值是*/*,它指定REST 服务的应响结果的MIME 类型,例如:application/xml、application/json、image/jpeg 等),你 也可以同时回返多种类型,但体具生成结果时用使种哪格式取决于ContentType。CXF 认默回返的是JSON 字符串。
(4)、@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分离标注法方的参数来自于HTTP求请的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP求请的头信息,@CookieParam来自于HTTP求请的Cookie。
注意:前两章说的CXF与spring整合及 都是用使JAX-WS标准。JAX-WS标准是一组XML web services的JAVA API。jaxws 是配置SOAP 式方的Web 服务
Spring中引入了两个新的名称间空jaxws、jaxrs,因为CXF 实现了Spring 的NamespaceHandler 接口,实现这个接口可以在Spring 中增长额定的配置。那么jaxws 自然是配置SOAP 式方的Web 服务,你可以看到有jaxws:server、jaxws:endpoint、jaxws:client 三个元素,jaxws:server 和jaxws:endpoint 是等效的,都用于布发Web 服务,现出jaxws:endpoint 的原因是JAX-WS 标准中用使EndPoint 布发Web 服务(面前用使过种这
式方),CXF 为了和JAX-WS 对应,供给了这个与jaxws:server 功能一样的配置元素;
jaxrs是REST 式方的Web 服务,有jaxrs:server、jaxrs:client 两个元素。
2、接口实现类
Java代码
@Service("rest_HelloWorldImpl")
public class Rest_HelloWorldImpl implements Rest_HelloWorld {
public String say(String name) {
return name+",您好!";
}
public String sayHello(User user) {
return user.getName()+",您好!";
}
public List<User> getList(Long id){
List<User> list = new ArrayList<User>();
Long sid=1L;
User user = new User(sid,"张三"+sid,21);
list.add(user);
sid=2L;
user = new User(sid,"张三"+sid,21);
list.add(user);
sid=3L;
user = new User(sid,"张三"+sid,21);
list.add(user);
return list;
}
}
3、CXF在Spring中的配置
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<!--id:名称(随意配),implementor:指定接口体具实现类,address:随意配-->
<jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
<!-- 输入日志拦截器 -->
<jaxws:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxws:inInterceptors>
<!-- 输出日志拦截器 -->
<jaxws:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxws:outInterceptors>
<jaxws:properties>
<entry key="mtom_enabled" value="true"></entry>
</jaxws:properties>
</jaxws:endpoint>
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
<!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里供给了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
可以方便实现的用调WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要用调webservice,
只要将client这个bean注入到需要用使的bean里。-->
<bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
<property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
</bean>
</beans>
注意:以下代码是新增长代码
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
Java代码
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
4、访问
http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1
回返JSON格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=json
回返XML格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=xml
得到结果
Java代码
<Users>
<User>
<id>1</id>
<name>张三1</name>
<age>21</age>
</User>
<User>
<id>2</id>
<name>张三2</name>
<age>21</age>
</User>
<User>
<id>3</id>
<name>张三3</name>
<age>21</age>
</User>
</Users>
用使CXF的rest还需要额定增长一个Jar:jsr311-api-1.1.1.jar
为了支撑回返JSON格式,还需要jettison-1.1.jar
在这里简略的说下CXF对REST的支撑,先对REST观点说下。
每日一道理
只有启程,才会到达理想和目的地,只有拼搏,才会获得辉煌的成功,只有播种,才会有收获。只有追求,才会品味堂堂正正的人。
REST 是一种软件架构模式,只是一种风格,不是像SOAP 那样本身承载着一种消息协议,也可以叫做REST 是基于HTTP协议的软件架构。
REST 中主要的两个观点就是源资位定和源资作操,而HTTP 协议恰好完整的供给了这两个要点,HTTP 协议中的URI 可以成完源资位定,GET、POST、OPTION等法方可以成完源资作操,因此REST 完整依附HTTP 协议以可就成完Web 服务,而不像SOAP 协议那样只利用HTTP 的传输性特,位定与作操由SOAP 协议自身成完,也是正由于SOAP 消息的存在,使得SOAP 粗笨。你也可以说REST 充分利用了HTTP 协议的性特,而不是像SOAP 那样只利用了其传输这一性特(事实上大多数人提到HTTP 协议就只会想到它能用于数据传输)。
REST 是一种软件架构理念,现在被移植到Web 服务上(因此不要提到REST 就马上想到WebService,JAX-RS 只是将REST 计划风格应用到Web 服务开辟),那么在开辟Web 服务上,偏于面向源资的服务适用于REST,偏于面向动活的服务。另外,REST 简略易用,效率高,SOAP 成熟度较高,安全性较好。REST 供给的网络服务叫做OpenAPI,它不仅把HTTP 作为传输协议,也作为理处数据的具工,可以说对HTTP 协议做了较好的解释,充分体现了HTTP 技巧的网络力能。现在Google、Amazon、淘宝都有基于REST 的OpenAPI 供给用调。
WebService中,JAX-RS 只是将REST 计划应用到Web 服务开辟.JAX-RS供给对了REST的支撑
我们先看看体具的例子
1、接口类
Java代码
<pre class="java" name="code">@Path("/rest_HelloWorld")
public interface Rest_HelloWorld {
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/say/{name}")
public String say(@PathParam("name")String name);
@GET
@Produces (MediaType.TEXT_PLAIN)
@Path("/sayHello/{name}")
public String sayHello(@PathParam("user")User user);
@GET
@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
@Path("/getList/{id}")
public List<User> getList(@PathParam("id")Long id);
}</pre>
CXF的Rest用使的JAX-RS标准。JAX-RS: Java API for RESTful Web Services是一个Java编程语言的应用程序接口,支撑按照 表象化态状变转 (REST)架构风格创立Web服务Web服务. JAX-RS用使了Java SE 5引入的Java 标注来简化Web服务客户端和服务端的开辟和署部。
JAX-RS供给了一些标注将一个源资类,一个POJOJava类,封装为Web源资。标注括包:
(1)、@Path,标注源资类或法方的相对路径
(2)、@GET,@PUT,@POST,@DELETE,标注法方是用的HTTP求请的类型
(3)、@Produces,标注回返的MIME媒体类型,( 解注标注,这个解注可以含包一组字符串,认默值是*/*,它指定REST 服务的应响结果的MIME 类型,例如:application/xml、application/json、image/jpeg 等),你 也可以同时回返多种类型,但体具生成结果时用使种哪格式取决于ContentType。CXF 认默回返的是JSON 字符串。
(4)、@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,分离标注法方的参数来自于HTTP求请的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP求请的头信息,@CookieParam来自于HTTP求请的Cookie。
注意:前两章说的CXF与spring整合及 都是用使JAX-WS标准。JAX-WS标准是一组XML web services的JAVA API。jaxws 是配置SOAP 式方的Web 服务
Spring中引入了两个新的名称间空jaxws、jaxrs,因为CXF 实现了Spring 的NamespaceHandler 接口,实现这个接口可以在Spring 中增长额定的配置。那么jaxws 自然是配置SOAP 式方的Web 服务,你可以看到有jaxws:server、jaxws:endpoint、jaxws:client 三个元素,jaxws:server 和jaxws:endpoint 是等效的,都用于布发Web 服务,现出jaxws:endpoint 的原因是JAX-WS 标准中用使EndPoint 布发Web 服务(面前用使过种这
式方),CXF 为了和JAX-WS 对应,供给了这个与jaxws:server 功能一样的配置元素;
jaxrs是REST 式方的Web 服务,有jaxrs:server、jaxrs:client 两个元素。
2、接口实现类
Java代码
@Service("rest_HelloWorldImpl")
public class Rest_HelloWorldImpl implements Rest_HelloWorld {
public String say(String name) {
return name+",您好!";
}
public String sayHello(User user) {
return user.getName()+",您好!";
}
public List<User> getList(Long id){
List<User> list = new ArrayList<User>();
Long sid=1L;
User user = new User(sid,"张三"+sid,21);
list.add(user);
sid=2L;
user = new User(sid,"张三"+sid,21);
list.add(user);
sid=3L;
user = new User(sid,"张三"+sid,21);
list.add(user);
return list;
}
}
3、CXF在Spring中的配置
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="outMessageInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<!--id:名称(随意配),implementor:指定接口体具实现类,address:随意配-->
<jaxws:endpoint id="helloWorld" implementor="#HelloWorldImpl" address="/HelloWorld" >
<!-- 输入日志拦截器 -->
<jaxws:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxws:inInterceptors>
<!-- 输出日志拦截器 -->
<jaxws:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxws:outInterceptors>
<jaxws:properties>
<entry key="mtom_enabled" value="true"></entry>
</jaxws:properties>
</jaxws:endpoint>
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
<!-- WebService 客户端 spring 配置文件cxf与Spring集成,cxf里供给了一个工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,
可以方便实现的用调WebService。serviceClass属性是接口类,address是webService的路径在其他bean里如果要用调webservice,
只要将client这个bean注入到需要用使的bean里。-->
<bean id="client" class="com.exp.service.outer.HelloWorld" factory-bean="clientFactory" factory-method="create" />
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.exp.service.outer.HelloWorld" />
<property name="address" value="http://localhost:8080/demo/webservice/HelloWorld" />
</bean>
</beans>
注意:以下代码是新增长代码
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
Java代码
<jaxrs:server id="rest_HelloWorld" address="/">
<jaxrs:inInterceptors>
<ref bean="inMessageInterceptor"/>
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<ref bean="outMessageInterceptor"/>
</jaxrs:outInterceptors>
<jaxrs:serviceBeans>
<ref bean="rest_HelloWorldImpl" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings>
</jaxrs:server>
4、访问
http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1
回返JSON格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=json
回返XML格式: http://localhost:8080/demo/webservice/rest_HelloWorld/getList/1?_type=xml
得到结果
Java代码
<Users>
<User>
<id>1</id>
<name>张三1</name>
<age>21</age>
</User>
<User>
<id>2</id>
<name>张三2</name>
<age>21</age>
</User>
<User>
<id>3</id>
<name>张三3</name>
<age>21</age>
</User>
</Users>
用使CXF的rest还需要额定增长一个Jar:jsr311-api-1.1.1.jar
为了支撑回返JSON格式,还需要jettison-1.1.jar
文章结束给大家分享下程序员的一些笑话语录:
程序员喝酒
我偶尔采用“木马策略”、“交叉测试”,时间不长就开始“频繁分配释放资源”,“cache”也是免不了的了,
不过我从不搞“轮巡”,也不会“捕获异常”,更不会“程序异常”,因为我有理性
克制的。
相关文章推荐
- Rest风格的web服务开发-入门篇1
- REST 风格的 Web 服务入门指南和 (重要)REST关键原则
- Beginning Spring学习笔记——第11章 使用Spring开发REST风格的Web服务
- REST 风格的 Web 服务入门指南和 (重要)REST关键原则
- 【项目搭建】使用spring-boot进行REST风格的微服务开发入门
- REST 风格的 Web 服务入门指南和 (重要)REST关键原则
- RESTful GeoWeb学习手记(一):构建REST风格的网络服务
- 黑马第六天之web开发入门和HTTP协议
- 转载:如何构建REST风格的WEB地图服务
- 使用C++ REST SDK开发简单的Web(HTTP)服务
- [webservices开发]使用xfire开发jsr181风格的web服务
- C# 实现Rest 风格的web服务
- 使用xfire开发jsr181风格的web服务
- 通过 Jersey 客户端 API 调用 REST 风格的 Web 服务
- 在Android开发中调用Rest web服务
- 通过 Jersey 客户端 API 调用 REST 风格的 Web 服务
- RESTful GeoWeb学习手记(一):构建REST风格的网络服务
- Jersey客户端API调用REST风格的Web服务
- 使用C++ REST SDK开发简单的Web(HTTP)服务
- MyEclipse开发Rest服务入门