WebService其实就是远程调用服务,分为服务端开发和客户端开发。看上去很厉害的样子,其实使用起来很简单。下面介绍不使用框架和使用CXF框架两种使用WebService的方法。
一、不使用框架的WebService
1、服务端代码,生成供客户端使用的方法
/*
@WebService:是一个注解,用在类上指定将此类发布成一个ws
*/
@WebService
public class JwsServiceHello {
/*
供客户端调用的方法,该方法是非静态的,会被发布
*/
public String getValue(String name){
return "欢迎你!"+name;
}
/*
方法上加@WebMethod(exclude = true)后,此方法不被发布
*/
@WebMethod(exclude = true)
public String getHello(String name){
return "你好!"+name;
}
/*
静态方法不会发布
*/
public static String getString(String name){
return "再见!"+name;
}
/*
*通过EndPoint(端点服务)发布一个WebService,参数包括本地的服务地址和提供服务的类
*发布成功后再浏览器输入http://188.188.181.151:8080/Service/ServiceHello?wsdl即可看到XML格式代码
*/
public static void main(String[] args){
Endpoint.publish("http://188.188.181.151:8080/Service/ServiceHello",new JwsServiceHello());
System.out.println("发布成功");
}
}
2、编译运行
然后在浏览器器输入http://188.188.181.151:8080/Service/ServiceHello?wsdl,如果看到XML格式的代码即表示发布成功
3、客户端代码
1、通过IDE生成使用webService的类,.将地址上的文件下载下来
2、删除不需要的class文件,剩下如下图
3、写调用方法调用下载下来的WebService中的java类中的方法
总结:如何发布一个Web服务
1)在类上添加@WebService注解(位于javax.jws.WebService包中)
2)通过EndPoint(端点服务)发布一个WebService(该类的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。位于 javax.xml.ws.Endpoint包中)
3)类上添加注解@WebService,类中所有非静态方法都会被发布;静态方法和final方法不能被发布;方法上加@WebMentod(exclude=true)后,此方法不被发布;
二、使用CXF框架的WebService
1、添加依赖
pom.xml
<!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.2.6</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.6</version>
</dependency>
2、写webService接口
@WebService
public interface LanguageService {
public String getLanguage(@WebParam(name = "position")int position);
}
3、webService具体实现方法
@WebService(endpointInterface = "com.example.demo.cxf.LanguageService")
public class LanguageServiceImpl implements LanguageService{
@Override
public String getLanguage(int position) {
String language =null;
switch (position){
case 1:
language="java";
break;
case 2:
language="c";
break;
case 3:
language="Objective-C";
break;
case 4:
language="C#";
break;
default:
break;
}
return language;
}
}
4、写Config文件发布webService服务
@Configuration
public class CXFConfig {
/*
*ServletRegistrationBean是由spring boot提供专门来注册servlet的
*这个是添加CXF的Servlet,处理webservice的请求
*/
@Bean
public ServletRegistrationBean servletRegistrationBean(){
return new ServletRegistrationBean(new CXFServlet(),"/webservice/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus(){
return new SpringBus();
}
/*
创建提供WebService的服务类
*/
@Bean
public LanguageService getLanguageService(){
return new LanguageServiceImpl();
}
/*
发布WebService服务
*/
@Bean
public Endpoint getEndpoint(){
EndpointImpl endpoint = new EndpointImpl(springBus(),getLanguageService());
endpoint.publish("/language");
return endpoint;
}
}
5、启动程序
这里我使用的springBoot,在启动的过程中报错:Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class]
需要在启动类的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {DataSourceAutoConfiguration.class},排除此类的autoconfig。启动以后就可以正常运行。
另外会出现警告:No MyBatis mapper was found in '[com.pollyduan.cms],可以通过编写的一个mapper接口进行解决。
启动程序后在浏览器输入:http://188.188.181.151:8080/webservice/language?wsdl,出现XML格式的内容即发布成功
6、编写客户端
这里客户端的使用也可以用上一个方法中客户端的使用方法,也可以通过工厂方法创建客户端调用WebService。下面的代码是通过工厂方法创建客户端的。
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class CXFClient {
public static void main(String[] args) {
//创建WebService客户端代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//注册WebService接口
factory.setServiceClass(LanguageService.class);
//设置WebService地址
factory.setAddress("http://188.188.181.151:8080/webservice/language?wsdl");
LanguageService languageService = (LanguageService) factory.create();
System.out.println(languageService.getLanguage(1));
}
}
成功调用webservice的方法