=======================服务端:=======================
1 基于spring注解的WebService。首先需要引用相关的jar(是额外补充的。之前的文档是‘基于spring注解的webService.txt’):
commons-logging-1.1.1.jar
cxf-2.4.3.jar--去除,改为cxf-2.7.6.jar
neethi-3.0.1.jar
spring-aop-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-core-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.1.jar--去除,改为xmlschema-core-2.0.3.jar
再添加:
stax2-api-3.1.x.jar 和 woodstox-core-asl-4.2.x.jar
如stax2-api-3.1.1.jar和woodstox-core-asl-4.2.0.jar
http://blog.youkuaiyun.com/yangxiaovip/article/details/11693359
2 需要新建一个接口类作为所提供的WebService类。该类需要添加@WebService注解。同时对于方法来说。方法的参数用@WebParam(name = "name")表示。方法的名称用@WebMethod(operationName="sayHello4")表示。方法的返回值用@WebResult(name = "result")表示。
如:
@WebService
public interface Test1 {
public String sayHello();
public void sayHello2(@WebParam(name = "name") String name);
public String sayHello3(@WebParam(name = "name") String name);
@WebMethod(operationName="sayHello4")
public void sayHello4(@WebParam(name = "name") String name);
@WebMethod(operationName="sayHello5")
@WebResult(name = "result")
public String sayHello5(@WebParam(name = "name") String name);
}
有关WebService的注解详细说明:
@WebService是用于注解一个接口类的。表明这个接口类是用于WebService用的。
@WebParam是用于注解一个WebService的方法的参数用的。name="name"。表示参数名称为name(双引号里面的值为参数名称)
@WebMethod是用于注解一个WebService方法的。告知该方法是用于WebService用的。operationName="sayHello5"表示方法的方法名为sayHello5
@WebResult是用于注解一个WebService方法的返回值的。(name = "result")告知方法的返回值变量为result
至此:有关WebService的注解有
注解接口类的:@WebService
注解方法参数的:@WebParam(name = "name")
注解方法的:@WebMethod(operationName="sayHello5")
注解方法返回值的:@WebResult(name = "result")
3 接口实现类如下:
@WebService(endpointInterface = "com.zbeninfo.webservice.Test1")
@Component//这个是spring的注解
public class Test1Impl implements Test1{
@Override
public String sayHello() {
return "say hello";
}
@Override
public void sayHello2(String name) {
System.out.println("hello," + name);
}
@Override
public String sayHello3(String name) {
return "test:"+name;
}
@Override
public void sayHello4(String name) {
System.out.println("调用webservice的insert方法成功,参数:name="+name);
}
@Override
public String sayHello5(String name) {
return "sayHello5:"+name;
}
}
接口实现类也用@WebService来进行注解。里面有endpointInterface = "com.zbeninfo.webservice.Test1"。endpointInterface是指明webservice的接口。接下来就是实现该接口的方法。普通的java方法。
还有一个注解:@Component。该注解主要用于在不确定该类是什么类型的情况下(controller、service、dao)。用@Component注解一个类,即等于在spring的配置文件中设置了定义了bean
3 接下来就是创建webservice的配置文件了(放在src下,和普通的spring配置文件放在一起即可):applicationContext-webservice.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:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="test1" implementor="com.zbeninfo.webservice.impl.Test1Impl" address="/test1"/>
<jaxws:endpoint id="greetingService" implementor="com.gary.test.ws.service.impl.GreetingServiceImpl" address="/GreetingService"/>
</beans>
配置文件说明:
beans的命名空间不做过多的解释,照着添加就行。
主要解释jaxws:endpoint标签。
jaxws:endpoint标签用于设置和发布WebService类用的。
id表示id属性,
implementor表示该WebService接口的具体实现类。
address表示用于WebService用于发布的地址。
4 在web.xml中需要配置cxf的相关配置。
如:
首先添加加载有关WebService的配置文件
如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext-*.xml</param-value>
</context-param>
加载CXF的相关配置:
<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>
表示凡是/ws/*的路径都是WebService的地址。
5 测试,测试有两种方法。
第一中是通过网页测试,查看是否能看到wsdl文件。打开浏览器,例如工程名为testWebService2。所发布的WebService的地址为/test1。则wsdl文件路径为:http://localhost:8080/testWebService2/ws/test1?wsdl
打开浏览器。输入http://localhost:8080/testWebService2/ws/test1?wsdl,然后回车。如果能看到先关内容,则表示WebService发布成功。
第二种方式,是通过WebService的客户端测试工具:WebServiceStudio.exe。打开后。输入http://localhost:8080/testWebService2/ws/test1?wsdl。在invoke能看到能调用到的方法。能进行测试调用。
=======================服务端:=======================
=======================客户端:=======================
1 下载Axis2-1.6.2(主要用的就是wsdl2java.bat文件,在Axis2-1.6.2\bin中)
2 打开cmd 进入wsdl2java.bat文件的文件夹目录。然后执行
wsdl2java -uri http://192.168.1.3:8080/testWebService2/ws/test1?wsdl -p com.zbeninfo.webservice -o test
参数解释:
-uri表示参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径
-p参数指定了生成的Java类的包名
-o参数指定了生成的一系列文件保存的根目录
在执行完上面的命令后,读者就会发现在当前目录下多了个train目录,可以找到一个TrainTimeWebServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类。
这样客户端代码就生成好了。
3 新建普通工程,将生成的客户端代码
加入到src下(将Axis2的jar都添加进来),然后新建测试类。建立main方法。如下:
public static void main(String[] args) {
try {
Test1ImplServiceStub test1ImplServiceStub=new Test1ImplServiceStub();
Test1ImplServiceStub.SayHello5 sayHello5=new Test1ImplServiceStub.SayHello5();//方法的参数类
sayHello5.setName("测试bbb");//方法的参数类
Test1ImplServiceStub.SayHello5E sayHello5e=new Test1ImplServiceStub.SayHello5E();//方法类
sayHello5e.setSayHello5(sayHello5);//方法类中添加方法的参数类
Test1ImplServiceStub.SayHello5ResponseE sayHello5ResponseE=test1ImplServiceStub.sayHello5(sayHello5e);//调用
Test1ImplServiceStub.SayHello5Response sayHello5Response=sayHello5ResponseE.getSayHello5Response();//返回结果类
String result=sayHello5Response.getResult();//从返回结果类中得到结果值
System.out.println("返回结果:"+result);
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
说明:
Test1ImplServiceStub 主要的类
如:Test1ImplServiceStub test1ImplServiceStub=new Test1ImplServiceStub();
Test1ImplServiceStub.SayHello5 主要是用于设置方法的参数值的类,
如:Test1ImplServiceStub.SayHello5 sayHello5=new Test1ImplServiceStub.SayHello5();//方法的参数类
sayHello5.setName("测试bbb");//方法的参数类
Test1ImplServiceStub.SayHello5E 主要是添加方法的参数类
如:Test1ImplServiceStub.SayHello5E sayHello5e=new Test1ImplServiceStub.SayHello5E();//方法类
sayHello5e.setSayHello5(sayHello5);//方法类中添加方法的参数类
Test1ImplServiceStub.SayHello5ResponseE 主要是调用方法(通过Test1ImplServiceStub对象调用方法,
如:Test1ImplServiceStub.SayHello5ResponseE sayHello5ResponseE=test1ImplServiceStub.sayHello5(sayHello5e);//调用
Test1ImplServiceStub.SayHello5Response 主要是得到调用方法的返回值的类
如:Test1ImplServiceStub.SayHello5Response sayHello5Response=sayHello5ResponseE.getSayHello5Response();//返回结果类
最后通过Test1ImplServiceStub.SayHello5Response对象的getResult()得到返回值的值。
如:String result=sayHello5Response.getResult();//从返回结果类中得到结果值
1 基于spring注解的WebService。首先需要引用相关的jar(是额外补充的。之前的文档是‘基于spring注解的webService.txt’):
commons-logging-1.1.1.jar
cxf-2.4.3.jar--去除,改为cxf-2.7.6.jar
neethi-3.0.1.jar
spring-aop-3.0.5.RELEASE.jar
spring-asm-3.0.5.RELEASE.jar
spring-beans-3.0.5.RELEASE.jar
spring-context-3.0.5.RELEASE.jar
spring-context-support-3.0.5.RELEASE.jar
spring-core-3.0.5.RELEASE.jar
spring-expression-3.0.5.RELEASE.jar
spring-web-3.0.5.RELEASE.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.1.jar--去除,改为xmlschema-core-2.0.3.jar
再添加:
stax2-api-3.1.x.jar 和 woodstox-core-asl-4.2.x.jar
如stax2-api-3.1.1.jar和woodstox-core-asl-4.2.0.jar
http://blog.youkuaiyun.com/yangxiaovip/article/details/11693359
2 需要新建一个接口类作为所提供的WebService类。该类需要添加@WebService注解。同时对于方法来说。方法的参数用@WebParam(name = "name")表示。方法的名称用@WebMethod(operationName="sayHello4")表示。方法的返回值用@WebResult(name = "result")表示。
如:
@WebService
public interface Test1 {
public String sayHello();
public void sayHello2(@WebParam(name = "name") String name);
public String sayHello3(@WebParam(name = "name") String name);
@WebMethod(operationName="sayHello4")
public void sayHello4(@WebParam(name = "name") String name);
@WebMethod(operationName="sayHello5")
@WebResult(name = "result")
public String sayHello5(@WebParam(name = "name") String name);
}
有关WebService的注解详细说明:
@WebService是用于注解一个接口类的。表明这个接口类是用于WebService用的。
@WebParam是用于注解一个WebService的方法的参数用的。name="name"。表示参数名称为name(双引号里面的值为参数名称)
@WebMethod是用于注解一个WebService方法的。告知该方法是用于WebService用的。operationName="sayHello5"表示方法的方法名为sayHello5
@WebResult是用于注解一个WebService方法的返回值的。(name = "result")告知方法的返回值变量为result
至此:有关WebService的注解有
注解接口类的:@WebService
注解方法参数的:@WebParam(name = "name")
注解方法的:@WebMethod(operationName="sayHello5")
注解方法返回值的:@WebResult(name = "result")
3 接口实现类如下:
@WebService(endpointInterface = "com.zbeninfo.webservice.Test1")
@Component//这个是spring的注解
public class Test1Impl implements Test1{
@Override
public String sayHello() {
return "say hello";
}
@Override
public void sayHello2(String name) {
System.out.println("hello," + name);
}
@Override
public String sayHello3(String name) {
return "test:"+name;
}
@Override
public void sayHello4(String name) {
System.out.println("调用webservice的insert方法成功,参数:name="+name);
}
@Override
public String sayHello5(String name) {
return "sayHello5:"+name;
}
}
接口实现类也用@WebService来进行注解。里面有endpointInterface = "com.zbeninfo.webservice.Test1"。endpointInterface是指明webservice的接口。接下来就是实现该接口的方法。普通的java方法。
还有一个注解:@Component。该注解主要用于在不确定该类是什么类型的情况下(controller、service、dao)。用@Component注解一个类,即等于在spring的配置文件中设置了定义了bean
3 接下来就是创建webservice的配置文件了(放在src下,和普通的spring配置文件放在一起即可):applicationContext-webservice.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:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="test1" implementor="com.zbeninfo.webservice.impl.Test1Impl" address="/test1"/>
<jaxws:endpoint id="greetingService" implementor="com.gary.test.ws.service.impl.GreetingServiceImpl" address="/GreetingService"/>
</beans>
配置文件说明:
beans的命名空间不做过多的解释,照着添加就行。
主要解释jaxws:endpoint标签。
jaxws:endpoint标签用于设置和发布WebService类用的。
id表示id属性,
implementor表示该WebService接口的具体实现类。
address表示用于WebService用于发布的地址。
4 在web.xml中需要配置cxf的相关配置。
如:
首先添加加载有关WebService的配置文件
如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext-*.xml</param-value>
</context-param>
加载CXF的相关配置:
<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>
表示凡是/ws/*的路径都是WebService的地址。
5 测试,测试有两种方法。
第一中是通过网页测试,查看是否能看到wsdl文件。打开浏览器,例如工程名为testWebService2。所发布的WebService的地址为/test1。则wsdl文件路径为:http://localhost:8080/testWebService2/ws/test1?wsdl
打开浏览器。输入http://localhost:8080/testWebService2/ws/test1?wsdl,然后回车。如果能看到先关内容,则表示WebService发布成功。
第二种方式,是通过WebService的客户端测试工具:WebServiceStudio.exe。打开后。输入http://localhost:8080/testWebService2/ws/test1?wsdl。在invoke能看到能调用到的方法。能进行测试调用。
=======================服务端:=======================
=======================客户端:=======================
1 下载Axis2-1.6.2(主要用的就是wsdl2java.bat文件,在Axis2-1.6.2\bin中)
2 打开cmd 进入wsdl2java.bat文件的文件夹目录。然后执行
wsdl2java -uri http://192.168.1.3:8080/testWebService2/ws/test1?wsdl -p com.zbeninfo.webservice -o test
参数解释:
-uri表示参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径
-p参数指定了生成的Java类的包名
-o参数指定了生成的一系列文件保存的根目录
在执行完上面的命令后,读者就会发现在当前目录下多了个train目录,可以找到一个TrainTimeWebServiceStub.java文件,该文件复杂调用WebService,读者可以在程序中直接使用这个类。
这样客户端代码就生成好了。
3 新建普通工程,将生成的客户端代码
加入到src下(将Axis2的jar都添加进来),然后新建测试类。建立main方法。如下:
public static void main(String[] args) {
try {
Test1ImplServiceStub test1ImplServiceStub=new Test1ImplServiceStub();
Test1ImplServiceStub.SayHello5 sayHello5=new Test1ImplServiceStub.SayHello5();//方法的参数类
sayHello5.setName("测试bbb");//方法的参数类
Test1ImplServiceStub.SayHello5E sayHello5e=new Test1ImplServiceStub.SayHello5E();//方法类
sayHello5e.setSayHello5(sayHello5);//方法类中添加方法的参数类
Test1ImplServiceStub.SayHello5ResponseE sayHello5ResponseE=test1ImplServiceStub.sayHello5(sayHello5e);//调用
Test1ImplServiceStub.SayHello5Response sayHello5Response=sayHello5ResponseE.getSayHello5Response();//返回结果类
String result=sayHello5Response.getResult();//从返回结果类中得到结果值
System.out.println("返回结果:"+result);
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
说明:
Test1ImplServiceStub 主要的类
如:Test1ImplServiceStub test1ImplServiceStub=new Test1ImplServiceStub();
Test1ImplServiceStub.SayHello5 主要是用于设置方法的参数值的类,
如:Test1ImplServiceStub.SayHello5 sayHello5=new Test1ImplServiceStub.SayHello5();//方法的参数类
sayHello5.setName("测试bbb");//方法的参数类
Test1ImplServiceStub.SayHello5E 主要是添加方法的参数类
如:Test1ImplServiceStub.SayHello5E sayHello5e=new Test1ImplServiceStub.SayHello5E();//方法类
sayHello5e.setSayHello5(sayHello5);//方法类中添加方法的参数类
Test1ImplServiceStub.SayHello5ResponseE 主要是调用方法(通过Test1ImplServiceStub对象调用方法,
如:Test1ImplServiceStub.SayHello5ResponseE sayHello5ResponseE=test1ImplServiceStub.sayHello5(sayHello5e);//调用
Test1ImplServiceStub.SayHello5Response 主要是得到调用方法的返回值的类
如:Test1ImplServiceStub.SayHello5Response sayHello5Response=sayHello5ResponseE.getSayHello5Response();//返回结果类
最后通过Test1ImplServiceStub.SayHello5Response对象的getResult()得到返回值的值。
如:String result=sayHello5Response.getResult();//从返回结果类中得到结果值