webservice--cxf和spring结合,发布restFull风格的服务
rest(Representational State Transfer):表现层状态转化,它是一种风格,用于资源定位,例如:http://ip:port/user/student/001
和资源操作:http的GET,POST,PUT,DELETE四种操作分别对应数据库的select,update,insert,delete
资源(Resources):网络上的一个具体信息。它可以是一段文本、一张图片,总之就是一个具体的实在,你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的
URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
表现层(Representation):把"资源"具体呈现出来的形式,叫做它的"表现层",比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,
在HTTP请求的头信息中Accept和Content-Type这两个字段,是对"表现层"的描述。
状态转化:互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状
态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
总结:什么是RESTful架构?
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
下面是发布一个restFull风格的实例:
服务端:
实体:
package entity; import java.util.Date; import javax.xml.bind.annotation.XmlRootElement; /** * 实体 */ @XmlRootElement(name="student") public class Pojo { private long id; //温度 private String detail; //日期 private Date date; //最高 private int temperature_max; //最低 private int temperature_min; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public int getTemperature_max() { return temperature_max; } public void setTemperature_max(int temperature_max) { this.temperature_max = temperature_max; } public int getTemperature_min() { return temperature_min; } public void setTemperature_min(int temperature_min) { this.temperature_min = temperature_min; } }
一定要在实体类的前边加上annotation ,这样才能让信息在POJO和XML之间转换
SEI:
package service; import java.util.List; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import entity.Pojo; /** * 接口 */ @WebService @Path("/student") public interface WeatherInterface { //MediaType //查询学生列表 @GET @Path("/queryList/{type}") @Consumes(MediaType.APPLICATION_XML) public List<Pojo> queryWeather(@PathParam("type")String cityName); //查询学生 @GET @Path("/query/{id}") @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) public Pojo queryById(@PathParam("id")long id); }
每个方法之前,要用annotation声明http请求的method类型,比如GET,DELETE,POST, PUT
@Path("/room/{id}")中的id是一个参数,应该在方法的参数列表中声明: public Pojo queryById(@PathParam("id")long id)
实现类:
package service; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import com.sun.org.glassfish.gmbal.ParameterNames; import entity.Pojo; /** * 实现类 */ public class Impl implements WeatherInterface { @Override public List<Pojo> queryWeather(String cityName) { List<Pojo> list = new ArrayList<Pojo>(); //日历附件 Calendar calendar = Calendar.getInstance(); int day = calendar.get(Calendar.DATE); Pojo pojo1 = new Pojo(); pojo1.setId(01); pojo1.setDetail("晴1"); pojo1.setDate(new Date()); pojo1.setTemperature_max(5); pojo1.setTemperature_min(-6); Pojo pojo2 = new Pojo(); pojo2.setId(02); pojo2.setDetail("晴2"); calendar.set(Calendar.DATE, day+1); pojo2.setDate(calendar.getTime()); pojo2.setTemperature_max(5); pojo2.setTemperature_min(-6); Pojo pojo3 = new Pojo(); pojo3.setId(003); pojo3.setDetail("晴3"); calendar.set(Calendar.DATE, day+2); pojo3.setDate(calendar.getTime()); pojo3.setTemperature_max(5); pojo3.setTemperature_min(-6); list.add(pojo1); list.add(pojo2); list.add(pojo3); return list; } @Override public Pojo queryById(long id) { Pojo pojo1 = new Pojo(); pojo1.setId(id); pojo1.setDetail("张三"); pojo1.setDate(new Date()); pojo1.setTemperature_max(5); pojo1.setTemperature_min(-6); return pojo1; } }
spring配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd" > <!-- service --> <bean id="WeatherInterface" class="service.Impl" /> <!-- 通过jaxrs:server方式来配置webservice --> <jaxrs:server address="/weather"> <jaxrs:serviceBeans> <ref bean="WeatherInterface" /> </jaxrs:serviceBeans> </jaxrs:server> </beans>
xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 加载spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- cxf的servlet --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/ws/*</url-pattern> </servlet-mapping> </web-app>
把项目部署到tomcat,地址栏输入:http://localhost:8989/cxf_rest_spring_service/ws/

浙公网安备 33010602011771号