用resteasy搭建了一個rest風格的項目,改用apach 實現相同的功能.
cxf是Services 框架,支持web-service的多種協議 ,可以運用cxf來構建相關的web service 服務(cxf).
jaxrs(Java API for RESTful Web Services),是一個Java 編程語言的應用程序接口,支持按照表述性狀態轉移(REST)架構風格創建Web服務(其實此服務更傾向於理解成是httpservice,比如get或者post,當post中傳遞的是soap的xml格式,還有點webservice的樣子).
本着實現與resteasy相同功能,因而此次實驗,僅僅運用了cxf中jaxrs中的一部分功能.主要測試get,put,返回json格式
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>stu</groupId>
<artifactId>stu</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>cxf</artifactId>
<packaging>war</packaging>
<dependencies>
<!-- jaxrs 依賴 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.0-milestone1</version>
</dependency>
<!--轉sjon -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.13</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
</dependencies>
</project>
spring-cxf.xml<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" 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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.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">
<context:component-scan base-package="cxf.test" />
<!--事務之類,沒用到,此處可不配-->
<context:annotation-config />
<!--配置cxf的server(一個server相當於resteasy的一個application)-->
<!-- jaxrs:server中address 可設置前綴 -->
<jaxrs:server id="testServiceContainer">
<!--配置server對應的serviceBean(一個serviceBean相當於resteasy中的resource)-->
<jaxrs:serviceBeans>
<ref bean="testService" />
</jaxrs:serviceBeans>
<!--配置相關provider(跟resteasy配置provider一致,因爲都是屬於jaxrs的東西)-->
<jaxrs:providers>
<!--對象序列化json -->
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<!--自定義時間轉yyyy-MM-dd HH:mm:ss -->
<bean class="cxf.test.provider.JacksonConfigurator" />
</jaxrs:providers>
</jaxrs:server>
<!-- 設置accept與accept_language,使用jaxrs指定返回值,可不配-->
<!-- <jaxrs:extensionMappings>
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<jaxrs:languageMappings>
<entry key="en" value="en-gb" />
</jaxrs:languageMappings> -->
</beans>
web.xml<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="JAXRS-cxf" version="3.0">
<display-name>cxf</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring*.xml</param-value>
</context-param>
<!-- spring context listener -->
<!--處理一些內存泄漏問題,spring中不存在此問題,Struts等會有這些問題,詳情百度...-->
<!-- <listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener> -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- CXFservlet(本次實驗通過http請求,服務器應servlet技術處理)-->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
處理返回時間格式的providerpackage cxf.test.provider;
import java.text.SimpleDateFormat;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.ObjectMapper;
/*@Provider*/
@Produces("application/json")
public class JacksonConfigurator implements ContextResolver<ObjectMapper>{
private ObjectMapper mapper = new ObjectMapper();
public JacksonConfigurator() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(dateFormat);
}
@Override
public ObjectMapper getContext(Class<?> arg0) {
return mapper;
}
}
servicepackage cxf.test.service;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import cxf.test.vo.Student;
@Path("test")
public interface TestService {
@GET
@Path("get")
@Produces(MediaType.APPLICATION_JSON)
public Student testGet(@QueryParam("name")String name,
@QueryParam("marray")Boolean marry,
@QueryParam("age")Integer age,
@QueryParam("time")Long time
);
@POST
@Path("post")
@Produces(MediaType.APPLICATION_JSON)
public Student testPost(@FormParam("name")String name,
@FormParam("marray")Boolean marry,
@FormParam("age")Integer age,
@FormParam("time")Long time
);
}
serviceImplpackage cxf.test.service.impl;
import java.util.Date;
import org.springframework.stereotype.Service;
import cxf.test.service.TestService;
import cxf.test.vo.Student;
@Service("testService")
public class TestServiceImpl implements TestService {
@Override
public Student testGet(String name, Boolean marry, Integer age,Long time) {
return new Student(name, age, marry, new Date(time));
}
@Override
public Student testPost(String name, Boolean marry, Integer age,Long time) {
return new Student(name, age, marry, new Date(time));
}
}
studentpackage cxf.test.vo;
import java.util.Date;
public class Student {
private String name;
private Integer age;
private Boolean marry;
private Date birthday;
public Student(){}
public Student(String name, Integer age, Boolean marry, Date birthday) {
super();
this.name = name;
this.age = age;
this.marry = marry;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getMarry() {
return marry;
}
public void setMarry(Boolean marry) {
this.marry = marry;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
分別用get與post(x-www-form-urlencoded)測試ok. 此處搭建應用層與resteasy應用層都是使用jaxrs,所有相關用法都是相通,包括參數接受與返回值處理,只是根據配置不同(server-serverBean,application-resource)進行不同的url印射.