基于CXF Servlet方式发布Restful的Web服务(入门篇) ##。
最近在学WebService,刚刚做好一个实习,希望对自己的学习进行记录,也希望能给其他感兴趣的小伙伴提供帮助。
- 希望通过:http://localhost:9997/rs/calculator/add 来访问服务。
- 该服务以两个参数的各种计算为简单例子。
1.首先,编写POJO类CalNums,@XmlRootElement注解可以实现CalNums类在java 和xml之间转换。
package POJO;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="CalNums")
public class CalNums {
//第一个操作数
private int firstNum;
//第二个操作数
private int secondNum;
//运算结果
private int result;
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public int getFirstNum() {
return firstNum;
}
public void setFirstNum(int firstNum) {
this.firstNum = firstNum;
}
public int getSecondNum() {
return secondNum;
}
public void setSecondNum(int secondNum) {
this.secondNum = secondNum;
}
}
2.编写Calculator接口
@GET @DELETE @POST @PUT 标注HTTP的请求类型
@Path 标注资源类或方法的相对路径
@Produces 标注返回的MIME 媒体类型(注解标注,这
个注解可以包含一组字符串,默认值是/,它指定REST 服务的响应
结果的MIME 类型,例如:application/xml、application/json、image/jpeg
等),也可以同时返回多种类型,但具体生成结果时使用哪种格式取
决于ContentType。CXF 默认返回的是JSON 字符串;
@PathParam(“fn”)与@Path(“/add/{fn}+{sn}”)中的{fn}对应,用来得到URL中的参数
package POJO;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("/calculator")
@Produces("application/xml")
public interface Calculator {
@GET
@Path("/add/{fn}+{sn}")
public CalNums add(@PathParam("fn")String fn,@PathParam("sn")String sn);
@GET
@Path("/minus/{fn}-{sn}")
public CalNums minus(@PathParam("fn")String fn,@PathParam("sn")String sn);
@GET
@Path("/multi/{fn}*{sn}")
public CalNums multi(@PathParam("fn")String fn,@PathParam("sn")String sn);
}
3.实现接口
package DAO;
import javax.xml.bind.annotation.XmlRootElement;
import POJO.CalNums;
import POJO.Calculator;
public class CalculatorImpl implements Calculator {
CalNums calnum=new CalNums();
@Override
public CalNums add(String fn, String sn) {
// TODO Auto-generated method stub
int a=Integer.parseInt(fn);
int b=Integer.parseInt(sn);
int result=a+b;
System.out.println("result of add="+result);
calnum.setFirstNum(a);
calnum.setSecondNum(b);
calnum.setResult(result);
return calnum;
}
@Override
public CalNums minus(String fn, String sn) {
// TODO Auto-generated method stub
int a=Integer.parseInt(fn);
int b=Integer.parseInt(sn);
int result=a-b;
System.out.println("result of minus="+result);
calnum.setFirstNum(a);
calnum.setSecondNum(b);
calnum.setResult(result);
return calnum;
}
@Override
public CalNums multi(String fn, String sn) {
// TODO Auto-generated method stub
int a=Integer.parseInt(fn);
int b=Integer.parseInt(sn);
int result=a*b;
System.out.println("result of multiple="+result);
calnum.setFirstNum(a);
calnum.setSecondNum(b);
calnum.setResult(result);
return calnum;
}
}
4.编写发布类,通过JAXRSServerFactoryBean实例对象来完成。
该类中有一些主要的方法:
public void setResourceClasses(Class… classes);
Class类型的参数,是告诉这个类,发布服务时,会用到的类
public void setAddress(String address);
设置服务的地址,例如”http://localhost:9997/rs”
package Service;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import DAO.CalculatorImpl;
import POJO.CalNums;
public class CalculatorService {
public static void main(String[] args) {
JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();
restServer.getInInterceptors().add(new LoggingInInterceptor());
restServer.getOutInterceptors().add(new LoggingOutInterceptor());
restServer.setResourceClasses(CalculatorImpl.class,CalNums.class);
restServer.setAddress("http://localhost:9997/rs");
restServer.create();
}
}
到此就可以run一下我们的程序了。
5.测试,浏览器输入
http://localhost:9997/rs/calculator/add/1+1
可以看见如下代码
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<CalNums>
<firstNum>1</firstNum>
<result>2</result>
<secondNum>1</secondNum>
</CalNums>
这样就完成了一个入门的小例子。
再次感谢我的老师。