WebService是一种能够使应用程序在不同的平台使用不用的编程语言进行通信的技术规范,而这这种技术规范的实现可以用不同的方法,比如使用基于xml行的soap协议或者是Restful形式
webservice实际上就是http+xml
webservice顾名思义就是基于Web的服务,它使用Web(http)方式,接收和响应外部系统的某种请求,从而实现远程调用
webservice框架有很多,不如axis,axis2,xfire,cxf等等,做服务端和客户端都可以,个人反甲使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对与传递与网络中的xml的解析,代价是你不得不在你的框架中添加对于这些框架的依赖. 个人观点事:服务端使用这些框架还不错,如果做客户端,没有必要使用这些框架,只需要使用httpclient即可
httpClient和webservice区别?httpClient可以替代webservice么?
既然知道使用soap协议和restful详述,那么我们就要对这两种形式进行描述和规范.这两种规范sun公司已经做好了,就是JAX-WS和JAX-RS
JAX-WS是一种规范,在jdk1.6之后就自带实现,但是这种实现比较简单,基本上只能够传递soap协议格式的消息.这就是我们为什么可以在没有axis2或cxf的情况下开发webservice. 这时候我们就会想,如果我们需要其他的服务,比如让jax-ws与spring集成,此时就是使用框架;jax-ws框架有axis2和cxf
cxf既实现了jax-ws也实现了jax-rs规范
soap webservice和restful webservice的使用:soap偏向于活动,有严格的规范和标准,包括安全.事务等各个方面的内容,同时soap强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义. 而restful强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用restful架构风格
cxf可以用来写服务端(提供端),也可以用来写客户端(消费端),一般来说用来写写服务端服务出去,供别人调用,
客户端可以用httpclient等调用即可,但是要自己解析xml呗
https://blog.csdn.net/chen213wb/article/details/80330356
https://www.cnblogs.com/zhuyiqizhi/p/6213502.html
https://www.imooc.com/article/25537?block_id=tuijian_wz
webservice之cxf(和dubbo框架类似)
soap风格:
下面是服务器端,就是网络的提供端.使用cxf把自己的服务发布出去,让别人访问
其实就是暴露service层的接口,让消费者通过wsdl文件来远程调用
一般我们用cxf用于发布提供端,消费端(客户端)一般用httpclient等,消费端用cxf就麻烦了
pom文件
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zgpa</groupId>
<artifactId>webservice</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>webservice Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<cxf.version>3.1.5</cxf.version>
<spring.version>4.3.8.RELEASE</spring.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- spring -->
<!-- 添加 Spring dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- faseJson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
<!-- cxf -->
<!-- 添加CXF ==>XML 依赖 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
</dependencies>
<build>
<finalName>webservice</finalName>
</build>
</project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 配置Spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--配置spring监听 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置cxf框架中的过滤器 -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!--也可以注解扫描com.xtkj全扫 -->
<!--扫描注解 ,扫描到dao,service以及service.impl 这三个层级;controller层放在springMVC-sevlet.xml里面扫描 -->
<context:component-scan base-package="com.webservice.dao"></context:component-scan>
<context:component-scan base-package="com.webservice.service"></context:component-scan>
<!-- 开启注解事务;注释式事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 导入jar包中的cxf配置文件。这里不用写,是写好的放在jar包里,直接引入即可。 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- define web service provider -->
<!-- 要暴露给外部调用的接口,address:请求路径 -->
<jaxws:endpoint implementor="com.webservice.service.impl.DeptServiceImpl" address="/deptService" />
<jaxws:endpoint implementor="com.webservice.service.impl.EmployeeServiceImpl" address="/employeeService" />
</beans>
接口
package com.webservice.service;
import java.util.List;
import javax.jws.WebService;
import com.webservice.vo.Dept;
//此处的targetNamespace="imp.service.webservice.com" 可以不写,不写系统会给默认值得就是url的路径
//如果targetNamespace不写,会按照实现类里面来名称来,如果实现类也不写则就会系统给url默认值反写
@WebService(targetNamespace="imp.service.webservice.com")
public interface IDeptService {
public List<Dept>findDepts();
public void test();
}
接口的实现类
package com.webservice.service.impl;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import org.springframework.stereotype.Component;
import com.webservice.service.IDeptService;
import com.webservice.vo.Dept;
//targetNamespace:指定你想要的名称空间,认是使用接口实现类的包名的反缀
//此处的targetNamespace="com.wbservice.wbservice" 可以不写,不写系统会给默认值得就是url的路径反写
@WebService(targetNamespace="imp.service.webservice.com",endpointInterface="com.webservice.service.IDeptService")
@Component("deptService")
public class DeptServiceImpl implements IDeptService{
public List<Dept> findDepts() {
Dept dept1=new Dept(01, "农业部");
Dept dept2=new Dept(02, "科技部");
Dept dept3=new Dept(03, "销售部");
List <Dept>list=new ArrayList<Dept>();
list.add(dept1);
list.add(dept2);
list.add(dept3);
return list;
}
public void test() {
System.out.println("测试专用--------------------");
}
}
vo类
package com.webservice.vo;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Dept {
private Integer deptNo;
private String deptName;
public Dept() {
super();
// TODO Auto-generated constructor stub
}
public Dept(Integer deptNo, String deptName) {
super();
this.deptNo = deptNo;
this.deptName = deptName;
}
@XmlElement
public Integer getDeptNo() {
return deptNo;
}
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
@XmlElement
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
}
接口测试:
restful风格
restful风格比soap风格更方便,不需要对wsdl,也不需要soap协议,而是通过简单的http协议传输数据(包含xml和json),对xml和json格式都支持.既简化了设计也减少了网络传输量(因为只传输代表数据的xml或josn,没有额外的xml包装)
pom文件
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xtkj</groupId>
<artifactId>cxfrestful</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>cxfrestful Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<cxf.version>3.1.5</cxf.version>
<spring.version>4.3.8.RELEASE</spring.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- spring -->
<!-- 添加 Spring dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- faseJson -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.2.1</version>
</dependency>
<!-- cxf -->
<!-- 添加CXF 依赖 -->
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-core -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxrs -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-rs-client -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.2.5</version>
</dependency>
</dependencies>
<build>
<finalName>cxfrestful</finalName>
</build>
</project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 配置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>
<!-- end Spring Config -->
<!-- CXF 配置Servlet -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.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:annotation-config />
<!-- spring自动扫包 -->
<context:component-scan base-package="com.xtkj" />
<jaxrs:server address="/" id="RESTWebService">
<jaxrs:serviceBeans>
<ref bean="deptService"/> <!--如果还有其它的服务,继续在这里引用-->
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
<bean class="org.apache.cxf.jaxrs.provider.JAXBElementProvider" />
</jaxrs:providers>
</jaxrs:server>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!--调用restful服务端-->
<bean id="webClient" class="org.apache.cxf.jaxrs.client.WebClient" factory-method="create">
<constructor-arg type="java.lang.String" value="http://localhost:8080/empmgrrest/cxf/" />
</bean>
</beans>
接口
package com.xtkj.service;
import java.util.List;
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 com.xtkj.vo.Dept;
@Path(value = "/dept")
public interface IDeptService {
@GET
@Path("/list")
@Produces(MediaType.TEXT_PLAIN)
public List<Dept> findDepts();
@GET
@Path("/one/{deptNo}")
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Dept findDeptById(@PathParam("deptNo")String deptNo);
}
接口的实现类
package com.xtkj.service.impl;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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 org.springframework.stereotype.Component;
import com.xtkj.service.IDeptService;
import com.xtkj.vo.Dept;
@Component("deptService")
@Path(value="/dept")
public class DeptServiceImpl implements IDeptService{
@GET
@Path("/list")
//@Produces(MediaType.APPLICATION_XML) 输出为xml形式
//输出为json字符串形式
@Produces({MediaType.APPLICATION_JSON + ";charset=UTF-8"})
public List<Dept> findDepts() {
System.out.println("==========================");
Dept dept1=new Dept(1,"农业部");
Dept dept2=new Dept(2,"科技部");
Dept dept3=new Dept(3,"销售部");
List<Dept>list=new ArrayList<Dept>();
list.add(dept1);
list.add(dept2);
list.add(dept3);
return list;
}
@GET
@Path("/one/{deptNo}")
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Dept findDeptById(@PathParam("deptNo")String deptNo) {
Dept dept1=new Dept(1,"农业部");
return dept1;
}
}
接口测试:
重点看:
https://blog.csdn.net/zhaofuqiangmycomm/article/details/78701566
web service 整体参考 : https://blog.csdn.net/linjinhuo/article/details/78777694