@Spancymath
2019-10-18T15:04:27.000000Z
字数 4963
阅读 1022
java
什么是WebService?
基于web的服务,使用Web(HTTP)方式,接收和响应外部系统的某种请求,从而实现远程调用。
//1、添加注解@WebServicepublic class OneService {//2、至少包含一个可以对外公开的服务public String sayHello(String name){System.err.println("invoke "+name);return "Hello "+name;}public static void main(String[] args) {//3、第一个参数称为Binding即绑定地址,//第二个参数是实现者,即谁提供服务Endpoint.publish("http://localhost:9999/one", new OneService());}}//4.在IE地址栏输入以下地址访问说明文件:http://localhost:9999/one?wsdl
3.通过wsimport生成本地代码
常用参数为:
-d<目录> - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数。
示例:
C:/> wsimport –s . http://192.168.0.100/one?wsdl
4.总结
WebService和Web服务器的区别:WebService是Web服务器的应用,Web服务器是WebService运行所必须的容器。
WebService其内部是通过Socket实现的。
WebService的特点:
通过ajax调用 (js+XML)
var xhr = new XMLHttpRequest();function sedAjax() {var url = "http://localhost:8081/hello";var nameText = document.getElementById("name").value;var request = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +"<soap:Body><ns2:sayHi xmlns:ns2=\"http://server/\">" +"<arg0>" + nameText + "</arg0></ns2:sayHi></soap:Body></soap:Envelope>";$.ajax({url: url,type: "post",contentType: "application/soap+xml;charset=utf-8",data: request,success: function (data) {alert($(data).find("return").text());}})}
SOAP请求过程分析
使用ServerFactoryBean发布应用
使用CXF发布一个服务,与JDK6发布一个服务完全不同
public class CxfServer1 implements ICxfServer1 {public String sayHi(String name) {return "Hello " + name;}public static void main(String[] args) {//声明实例,使用ServerFactoryBean发布服务//使用CXF发布一个服务,与JDK6发布一个服务完全不同//* 即使是不使用@WebService注解,一样可以发布成功//* 即使此类没有对外公布的方法一样可以发布成功ServerFactoryBean bean = new ServerFactoryBean();//绑定到发布地址的端口bean.setAddress("http://localhost:8080/cxf");//设置服务接口,如果没有接口,则为本类bean.setServiceClass(ICxfServer1.class);//设置接口实现类,即服务类bean.setServiceBean(new CxfServer1());//发布服务bean.create();System.err.println("启动成功");}}
使用JaxWsServerFactoryBean(建议使用此类)发布应用
public class HelloImpl implements IHello {@Overridepublic String sayHi(String name) {System.out.println("syaHi called");return "Hello2 " + name;}public static void main(String[] args) {//使用jaxWs对其进行发布JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();//设置访问地址bean.setAddress("http://localhost:8081/hello");//注册服务接口bean.setServiceClass(IHello.class);//注册服务实现类bean.setServiceBean(new HelloImpl());//添加消息拦截器bean.getInInterceptors().add(new LoggingInInterceptor());bean.getOutInterceptors().add(new LoggingOutInterceptor());//启动bean.create();System.out.println("服务启动完成...");}
由于cxf的web项目已经集成了Spring所以,cxf的服务类都是在spring的配置文件中完成的。以下是步骤:
第三步:在web.xml中配置cxf的核心servlet,CXFServlet。
<servlet><servlet-name>cxf</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><!--<init-param><param-name>config-location</param-name><param-value>classpath:cxf-servlet.xml</param-value></init-param>--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>cxf</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping>
第四步:创建(最好是Copy)cxf-servlet.xml文件。这是一个spring的配置文件。
<?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"xmlns:soap="http://cxf.apache.org/bindings/soap"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/bindings/soaphttp://cxf.apache.org/schemas/configuration/soap.xsdhttp://cxf.apache.org/jaxwshttp://cxf.apache.org/schemas/jaxws.xsd"><!-- 引入CXF Bean定义如下,早期的版本中使用 --><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="helloService" address="/hello" implementor="com.zhang.server1.HelloImpl"><!--客户端请求的消息拦截器--><jaxws:inInterceptors><bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean></jaxws:inInterceptors><!--服务端响应的消息拦截器--><jaxws:outInterceptors><bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean></jaxws:outInterceptors></jaxws:endpoint>